@lmctl-ai/lmctl 0.1.64 → 0.1.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +172 -170
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -12,9 +12,9 @@ var fk=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
12
12
|
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Gt(r)}}async function Bk(t){let e=it(),r=process.version,n=rl("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Vf(i);let u=rl("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Vf(a);let u=rl("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Pn(o.join(`
|
|
13
13
|
`)),c=[];for(let u of Mk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Gf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function qk(){return process.env.LMCTL_INTENT_LOG??Lk(Ok(),".lmctl","recent-intents.log")}async function Hk(t){let e=t.intentLog??qk(),r=t.intentLogTailLines??500;try{let s=(await sl(e,"utf8")).split(`
|
|
14
14
|
`).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:Pn(o.join(`
|
|
15
|
-
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Zs,Mk,nl,Fn=T(()=>{"use strict";zs();Zs=["serve","db","runs","jobs","attentions","env","intents"];Mk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];nl=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as Qf,appendFileSync as Jk,mkdirSync as Xk,existsSync as
|
|
15
|
+
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Zs,Mk,nl,Fn=T(()=>{"use strict";zs();Zs=["serve","db","runs","jobs","attentions","env","intents"];Mk=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];nl=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as Qf,appendFileSync as Jk,mkdirSync as Xk,existsSync as wq,readdirSync as yq,unlinkSync as Eq}from"node:fs";import{join as eo,dirname as Gk}from"node:path";import{homedir as Kk}from"node:os";function ol(){return eo(Kk(),".lmctl")}function em(){Jr=!0,process.env.LMCTL_DEBUG="1"}function tm(){return{cliDebug:Jr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function rm(t){Jr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function we(){if(Jr)return!0;let t=Date.now();return t-Zf>=Vk&&(zf=Zk(),Zf=t),zf}function il(){return Jr||process.env.LMCTL_DEBUG==="1"}function Yk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=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",`${r}${n}:${s}`)}function At(t,e){if(e?.verbose){if(!Jr)return}else if(!e?.always&&!we())return;try{zk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};Jk(Qs,JSON.stringify(r)+`
|
|
16
16
|
`)}catch{}}function zk(){if(!Qs){let e=Yk().slice(0,13).replace("T","-");Qs=eo(ol(),`debug-${e}.log`)}Xk(Gk(Qs),{recursive:!0})}function Je(...t){At({event:"legacy",msg:t.join(" ")})}function _t(...t){At({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){At(t,{always:!0})}function Zk(){return Qk()||ev()}function Qk(){try{let t=Qf(eo(ol(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
17
|
-
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function ev(){try{let t=Qf(eo(ol(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Jr,zf,Zf,Vk,Qs
|
|
17
|
+
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function ev(){try{let t=Qf(eo(ol(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Jr,zf,Zf,Vk,Qs,$e=T(()=>{"use strict";Jr=!1,zf=!1,Zf=0,Vk=5e3;Qs=null});function gt(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Kt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Un(t,e){return!Kt(t)||gt(t)?null:`${e} must use https://: ${t}`}async function Tr(t,e){let r=Un(t,e.description);if(r!==null||!gt(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw nm(t,e.description,n,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 nm(t,e.description,n,a)}}finally{clearTimeout(o)}}function nm(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var to=T(()=>{"use strict"});import{existsSync as gv}from"node:fs";import{createRequire as wv}from"node:module";function yv(){return ll===null&&(ll=wv(import.meta.url)("node:sqlite").DatabaseSync),ll}function cl(t){return t.length===1&&Ev(t[0])?[t[0]]:t}function Ev(t){if(!fl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function fl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ll,ul,ro,dl,ml=T(()=>{"use strict";ll=null;ul=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!gv(e))throw new Error("unable to open database file");this.name=e,this.handle=new(yv())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new dl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},ro=ul,dl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...cl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...cl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...cl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&fl(e)?Object.values(e):fl(e)?{...e}:e}}});import{existsSync as bv,mkdirSync as Tv,readFileSync as Sv}from"node:fs";import{homedir as kv}from"node:os";import{dirname as om,join as vv,resolve as im}from"node:path";import{fileURLToPath as Iv,pathToFileURL as Nv}from"node:url";function hl(t){t.dbPath!==":memory:"&&Tv(om(t.dbPath),{recursive:!0});let e=new ro(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=lm(e);return r===0&&(e.exec(Sv($v,"utf8")),e.pragma(`user_version = ${pl}`)),jv(e,r),e}function jv(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
|
|
18
18
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
19
19
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
20
|
team_name TEXT NOT NULL,
|
|
@@ -492,7 +492,7 @@ var fk=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
492
492
|
ON delegation_event(delegation_job_id, id);
|
|
493
493
|
`),t.pragma("user_version = 40"),r=40),r<41&&r!==0){let n=Ee(t,"delegation_job");n.has("permission_mode")||t.exec("ALTER TABLE delegation_job ADD COLUMN permission_mode TEXT;"),n.has("idle_timeout_ms")||t.exec("ALTER TABLE delegation_job ADD COLUMN idle_timeout_ms INTEGER;"),t.pragma("user_version = 41"),r=41}r<42&&r!==0&&(Ee(t,"delegation_job").has("delivered_at")||t.exec("ALTER TABLE delegation_job ADD COLUMN delivered_at TEXT;"),t.pragma("user_version = 42"),r=42),bv(xv)}function Ee(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Av(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function lm(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function Rv(){return process.env.LMCTL_DB??vv(kv(),".lmctl","state.db")}var am,$v,xv,pl,_l=T(()=>{"use strict";ml();am=om(Iv(import.meta.url)),$v=im(am,"schema.sql"),xv=im(am,"migrations"),pl=42;if(process.argv[1]&&import.meta.url===Nv(process.argv[1]).href){let t=hl({dbPath:process.argv[2]??Rv()});try{process.stdout.write(`migrated user_version=${lm(t)}
|
|
494
494
|
`)}finally{t.close()}}});function Xr(t){return typeof t=="string"&&Ov.has(t)}function dm(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${no[0]}`,` STANCE: ${no[1]}`,` STANCE: ${no[2]}`,` STANCE: ${cm}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
495
|
-
`)}var cm,no,Ov,Wn,um,gl,so,Bn=T(()=>{"use strict";cm="other",no=["not_enough_information","dont_know","other_work"],Ov=new Set([cm,...no]),Wn="@abort",um="invalid_decision",gl="escalation_aborted",so="workflow_escalation"});import{randomUUID as Lv}from"node:crypto";function
|
|
495
|
+
`)}var cm,no,Ov,Wn,um,gl,so,Bn=T(()=>{"use strict";cm="other",no=["not_enough_information","dont_know","other_work"],Ov=new Set([cm,...no]),Wn="@abort",um="invalid_decision",gl="escalation_aborted",so="workflow_escalation"});import{randomUUID as Lv}from"node:crypto";function xe(t){return t.provider_resolved??t.provider}function C(){return new Date().toISOString()}function pe(t){return new wl(hl({dbPath:t.path}))}function pm(t,e,r){let n=hm(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return hm(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 u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function hm(t){let e=Cv(t),r=e===null?null:Mv(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))yl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function Cv(t){try{let e=JSON.parse(t);return yl(e)?e:null}catch{return null}}function Mv(t,e){let r=t[e];return yl(r)?r:null}function yl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Dv(t){return{insertWorkflow:t.prepare(`
|
|
496
496
|
INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
|
|
497
497
|
VALUES (?, ?, ?, ?, ?)
|
|
498
498
|
`),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
|
|
@@ -1053,10 +1053,10 @@ var fk=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
1053
1053
|
AND id > ?
|
|
1054
1054
|
ORDER BY id ASC
|
|
1055
1055
|
`)}}function Pv(t,e){return t.status==="pending"?!0:t.status!=="running"?!1:t.locked_until!==null&&t.locked_until<e||t.worker_pid!==null&&!Fv(t.worker_pid)}function Fv(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function _m(t){if(t.length===0||t==="operator")return!1;let e=t.lastIndexOf(":");return e>0&&e<t.length-1}function gm(t){if(Buffer.byteLength(t,"utf8")<=fm)return t;let r=Buffer.byteLength(mm,"utf8"),n=Math.max(0,fm-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${mm}`}function Uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var fm,mm,wl,Ue=T(()=>{"use strict";_l();Bn();fm=256*1024,mm=`
|
|
1056
|
-
...[truncated]`;wl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;claimDelegationJobTxn;finalizeDelegationJobTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Dv(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>Uv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==so)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Wn&&!a.includes(n))return{resumed:!1,reason:um};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.claimDelegationJobTxn=e.transaction(r=>{let n=r.id===void 0?this.stmts.listClaimableDelegationJobCandidates.all():(()=>{let s=this.getDelegationJob(r.id);return s===null?[]:[s]})();for(let s of n){if(!Pv(s,r.now))continue;if(this.stmts.claimDelegationJob.run(r.worker_id,r.worker_pid,r.locked_until,r.now,s.id,s.status,s.locked_by,s.locked_by,s.worker_pid,s.worker_pid,s.locked_until,s.locked_until).changes===1)return this.getDelegationJob(s.id)}return null}),this.finalizeDelegationJobTxn=e.transaction((r,n,s,o)=>this.stmts.setDelegationJobTerminal.run(n,s.result_text??null,s.error??null,s.team_chat_log_id??null,o,r).changes!==1?null:(this.stmts.insertDelegationEvent.run(r,o,s.event_kind,gm(s.event_payload)),this.getDelegationJob(r)))}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){pm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,C()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,C());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){pm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,C());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,C())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,C());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,C()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,C(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(C(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,C());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,C());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,C(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,C());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",C());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,C());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=C(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,C(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,C(),e)??null}closeIssue(e,r,n){let s=C(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,C(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,C(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=C();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Lv(),s=C();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=C(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,C())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??C(),e.dedupe_key??null,e.concurrency_key??null,C());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:C();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,C()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,C()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??C(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,C());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=C(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,C(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(C(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}enqueueDelegationJob(e){let r=this.stmts.insertDelegationJob.run(e.teamfile,e.alias,e.from_identity,e.root_teamfile,e.prompt,e.permission_mode??null,e.idle_timeout_ms??null,e.created_at??C());return this.getDelegationJob(Number(r.lastInsertRowid))}getDelegationJob(e){return this.stmts.getDelegationJob.get(e)??null}listDelegationJobs(e={}){let r=[],n=[];e.teamfile!==void 0&&(r.push("teamfile = ?"),n.push(e.teamfile)),e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM delegation_job${o} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...n)}listDeliverableDelegationJobs(e){return _m(e)?this.stmts.listDeliverableDelegationJobs.all(e):[]}markDelegationJobDelivered(e){return this.stmts.markDelegationJobDelivered.run(C(),e),this.getDelegationJob(e)}claimDeliverableDelegationJobs(e){if(!_m(e))return[];let r=C();this.db.exec("BEGIN IMMEDIATE");try{let n=this.stmts.listDeliverableDelegationJobs.all(e),s=[];for(let o of n){if(this.stmts.claimDeliverableDelegationJob.run(r,o.id).changes!==1)continue;let a=this.getDelegationJob(o.id);a!==null&&s.push(a)}return this.db.exec("COMMIT"),s}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}claimDelegationJob(e){let r=C(),n=Math.max(0,Math.trunc(e.lease_ms)),s=new Date(Date.now()+n).toISOString();return this.claimDelegationJobTxn({id:e.id,worker_id:e.worker_id,worker_pid:e.worker_pid,locked_until:s,now:r})}setDelegationJobTerminal(e,r,n={}){return this.stmts.setDelegationJobTerminal.run(r,n.result_text??null,n.error??null,n.team_chat_log_id??null,C(),e).changes!==1?null:this.getDelegationJob(e)}finalizeDelegationJob(e,r,n){return this.finalizeDelegationJobTxn(e,r,n,C())}cancelDelegationJob(e){return this.stmts.cancelDelegationJob.run(C(),e),this.getDelegationJob(e)}insertDelegationEvent(e,r,n){let s=this.stmts.insertDelegationEvent.run(e,C(),r,gm(n));return this.stmts.getDelegationEvent.get(s.lastInsertRowid)}listDelegationEvents(e,r){return this.stmts.listDelegationEvents.all(e,r===void 0?0:Math.max(0,Math.trunc(r)))}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,C(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,C())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,C());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,C(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??C(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,C());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,C()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,C()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,C());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(C(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=C();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??C());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,C())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,C())}}});import{realpathSync as Wv}from"node:fs";import{resolve as Bv}from"node:path";function El(t){let e=Bv(t);try{return Wv(e)}catch{return e}}var wm=T(()=>{"use strict"});import{platform as ym}from"node:os";function wt(t){let e=new qn;for(let r of t)e.registerAdapter(r);return e}var qn,bl=T(()=>{"use strict";wm();qn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=El(e.workspace);o=o.filter(a=>El(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,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=ym()==="darwin"||ym()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Em}from"node:fs";import{createInterface as bm}from"node:readline";import{stat as qv}from"node:fs/promises";import{homedir as Hv}from"node:os";async function*We(t){let e=Em(t,{encoding:"utf-8"}),r=bm({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Me(t,e){let r=[],n=Em(t,{encoding:"utf-8"}),s=bm({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function xe(t){let e=await qv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
1057
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ve,Vt=T(()=>{"use strict";ve=Hv()});import{readdir as oo,stat as Tm,unlink as Jv}from"node:fs/promises";import{join as Gr,basename as Sm}from"node:path";function Xv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function km(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var io,vm=T(()=>{"use strict";Vt();io=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Gr(ve,".claude"),this.projectsDir=Gr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await oo(this.projectsDir)}catch{return e}for(let n of r){let s=Gr(this.projectsDir,n);if(!(await Tm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await oo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Sm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Gr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!Xv(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=K(p.trim(),80)),u=K(p.trim(),80)}}if(!o)return null;let f=await km(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:Gv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=K(_.trim(),80)),d=K(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let b of _)if(b.type==="tool_result"){let E=typeof b.content=="string"?de(b.content):JSON.stringify(b.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:b.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let b of _)b.type==="text"&&b.text?s.push({role:"assistant",timestamp:g,content:de(b.text),model:h.message.model}):b.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:b.name||"unknown tool",toolName:b.name,toolInput:JSON.stringify(b.input,null,2),toolCallId:b.id,model:h.message.model}):b.type==="thinking"&&b.thinking&&s.push({role:"thinking",timestamp:g,content:b.thinking})}}if(!o)return null;let p=await km(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Jv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await oo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Gr(this.projectsDir,i);if(!(await Tm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await oo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Sm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Gr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Me(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ao(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Vv(t,e,r){if(!r)return"";let n=t.tools[e]??Tl[e],s=n?.profiles?.[r]?.flags??Tl[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function Im(t,e){return!!t.tools[e]}function Nm(t,e,r,n,s){let o=t.tools[e]??Tl[e],i;if(o?.agent){let l=ao(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Kv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(ao).join(" ");i=`printf '%s\\n' ${ao(n)} | ${u}`}else i=c.map(ao).join(" ")}let a=Vv(t,e,s);return a&&(i+=" "+a),i}var Tl,Kv,$m=T(()=>{"use strict";Tl={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:""}}}},Kv={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"]}}});function xm(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var jm=T(()=>{"use strict"});var Yv,je,lo,Rt=T(()=>{"use strict";Yv="ACK: waiting for explicit lmctl task.",je=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${Yv}`,lo=`send this exact lmctl seed instruction: "${je}"`});function Sr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function zv(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Hn]:e}}function ze(t,e,r){return zv(Sr(t,e),r)}var Hn,yt=T(()=>{"use strict";Hn="LMCTL_SELF_SESSIONID"});import{spawn as Am}from"node:child_process";import{mkdirSync as Zv}from"node:fs";var Sl,Ce,Yt=T(()=>{"use strict";$m();jm();Rt();yt();Sl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ce=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===je?r:n)}seed(e,r){return Zv(e,{recursive:!0}),new Promise(n=>{let s;try{s=Am(this.binary,this.seedArgsFor(r),{cwd:e,env:Sr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1056
|
+
...[truncated]`;wl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;claimDelegationJobTxn;finalizeDelegationJobTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Dv(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>Uv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==so)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Wn&&!a.includes(n))return{resumed:!1,reason:um};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.claimDelegationJobTxn=e.transaction(r=>{let n=r.id===void 0?this.stmts.listClaimableDelegationJobCandidates.all():(()=>{let s=this.getDelegationJob(r.id);return s===null?[]:[s]})();for(let s of n){if(!Pv(s,r.now))continue;if(this.stmts.claimDelegationJob.run(r.worker_id,r.worker_pid,r.locked_until,r.now,s.id,s.status,s.locked_by,s.locked_by,s.worker_pid,s.worker_pid,s.locked_until,s.locked_until).changes===1)return this.getDelegationJob(s.id)}return null}),this.finalizeDelegationJobTxn=e.transaction((r,n,s,o)=>this.stmts.setDelegationJobTerminal.run(n,s.result_text??null,s.error??null,s.team_chat_log_id??null,o,r).changes!==1?null:(this.stmts.insertDelegationEvent.run(r,o,s.event_kind,gm(s.event_payload)),this.getDelegationJob(r)))}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){pm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,C()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,C());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){pm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,C());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,C())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,C());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,C()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,C(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(C(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,C());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,C());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,C(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,C());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",C());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,C());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=C(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,C(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,C(),e)??null}closeIssue(e,r,n){let s=C(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,C(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,C(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=C();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Lv(),s=C();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=C(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,C())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??C(),e.dedupe_key??null,e.concurrency_key??null,C());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:C();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,C()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,C()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??C(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,C());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=C(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,C(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(C(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}enqueueDelegationJob(e){let r=this.stmts.insertDelegationJob.run(e.teamfile,e.alias,e.from_identity,e.root_teamfile,e.prompt,e.permission_mode??null,e.idle_timeout_ms??null,e.created_at??C());return this.getDelegationJob(Number(r.lastInsertRowid))}getDelegationJob(e){return this.stmts.getDelegationJob.get(e)??null}listDelegationJobs(e={}){let r=[],n=[];e.teamfile!==void 0&&(r.push("teamfile = ?"),n.push(e.teamfile)),e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM delegation_job${o} ORDER BY created_at DESC, id DESC LIMIT ?`).all(...n)}listDeliverableDelegationJobs(e){return _m(e)?this.stmts.listDeliverableDelegationJobs.all(e):[]}markDelegationJobDelivered(e){return this.stmts.markDelegationJobDelivered.run(C(),e),this.getDelegationJob(e)}claimDeliverableDelegationJobs(e){if(!_m(e))return[];let r=C();this.db.exec("BEGIN IMMEDIATE");try{let n=this.stmts.listDeliverableDelegationJobs.all(e),s=[];for(let o of n){if(this.stmts.claimDeliverableDelegationJob.run(r,o.id).changes!==1)continue;let a=this.getDelegationJob(o.id);a!==null&&s.push(a)}return this.db.exec("COMMIT"),s}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}claimDelegationJob(e){let r=C(),n=Math.max(0,Math.trunc(e.lease_ms)),s=new Date(Date.now()+n).toISOString();return this.claimDelegationJobTxn({id:e.id,worker_id:e.worker_id,worker_pid:e.worker_pid,locked_until:s,now:r})}setDelegationJobTerminal(e,r,n={}){return this.stmts.setDelegationJobTerminal.run(r,n.result_text??null,n.error??null,n.team_chat_log_id??null,C(),e).changes!==1?null:this.getDelegationJob(e)}finalizeDelegationJob(e,r,n){return this.finalizeDelegationJobTxn(e,r,n,C())}cancelDelegationJob(e){return this.stmts.cancelDelegationJob.run(C(),e),this.getDelegationJob(e)}insertDelegationEvent(e,r,n){let s=this.stmts.insertDelegationEvent.run(e,C(),r,gm(n));return this.stmts.getDelegationEvent.get(s.lastInsertRowid)}listDelegationEvents(e,r){return this.stmts.listDelegationEvents.all(e,r===void 0?0:Math.max(0,Math.trunc(r)))}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,C(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,C())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,C());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,C(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??C(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,C());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,C()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,C()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,C());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(C(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=C();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??C());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,C())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,C())}}});import{realpathSync as Wv}from"node:fs";import{resolve as Bv}from"node:path";function El(t){let e=Bv(t);try{return Wv(e)}catch{return e}}var wm=T(()=>{"use strict"});import{platform as ym}from"node:os";function wt(t){let e=new qn;for(let r of t)e.registerAdapter(r);return e}var qn,bl=T(()=>{"use strict";wm();qn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=El(e.workspace);o=o.filter(a=>El(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,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=ym()==="darwin"||ym()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Em}from"node:fs";import{createInterface as bm}from"node:readline";import{stat as qv}from"node:fs/promises";import{homedir as Hv}from"node:os";async function*We(t){let e=Em(t,{encoding:"utf-8"}),r=bm({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Me(t,e){let r=[],n=Em(t,{encoding:"utf-8"}),s=bm({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function je(t){let e=await qv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
1057
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ve,Vt=T(()=>{"use strict";ve=Hv()});import{readdir as oo,stat as Tm,unlink as Jv}from"node:fs/promises";import{join as Gr,basename as Sm}from"node:path";function Xv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function km(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var io,vm=T(()=>{"use strict";Vt();io=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Gr(ve,".claude"),this.projectsDir=Gr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await oo(this.projectsDir)}catch{return e}for(let n of r){let s=Gr(this.projectsDir,n);if(!(await Tm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await oo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Sm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Gr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await je(e),o="",i,a,l,c,u,d;for(let m of n)if(!Xv(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=K(p.trim(),80)),u=K(p.trim(),80)}}if(!o)return null;let f=await km(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await je(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:Gv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=K(_.trim(),80)),d=K(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let b of _)if(b.type==="tool_result"){let E=typeof b.content=="string"?de(b.content):JSON.stringify(b.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:b.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let b of _)b.type==="text"&&b.text?s.push({role:"assistant",timestamp:g,content:de(b.text),model:h.message.model}):b.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:b.name||"unknown tool",toolName:b.name,toolInput:JSON.stringify(b.input,null,2),toolCallId:b.id,model:h.message.model}):b.type==="thinking"&&b.thinking&&s.push({role:"thinking",timestamp:g,content:b.thinking})}}if(!o)return null;let p=await km(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Jv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await oo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Gr(this.projectsDir,i);if(!(await Tm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await oo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Sm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Gr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Me(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ao(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Vv(t,e,r){if(!r)return"";let n=t.tools[e]??Tl[e],s=n?.profiles?.[r]?.flags??Tl[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function Im(t,e){return!!t.tools[e]}function Nm(t,e,r,n,s){let o=t.tools[e]??Tl[e],i;if(o?.agent){let l=ao(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Kv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(ao).join(" ");i=`printf '%s\\n' ${ao(n)} | ${u}`}else i=c.map(ao).join(" ")}let a=Vv(t,e,s);return a&&(i+=" "+a),i}var Tl,Kv,$m=T(()=>{"use strict";Tl={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:""}}}},Kv={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"]}}});function xm(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var jm=T(()=>{"use strict"});var Yv,Ae,lo,Rt=T(()=>{"use strict";Yv="ACK: waiting for explicit lmctl task.",Ae=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${Yv}`,lo=`send this exact lmctl seed instruction: "${Ae}"`});function Sr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function zv(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Hn]:e}}function ze(t,e,r){return zv(Sr(t,e),r)}var Hn,yt=T(()=>{"use strict";Hn="LMCTL_SELF_SESSIONID"});import{spawn as Am}from"node:child_process";import{mkdirSync as Zv}from"node:fs";var Sl,Ce,Yt=T(()=>{"use strict";$m();jm();Rt();yt();Sl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ce=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ae?r:n)}seed(e,r){return Zv(e,{recursive:!0}),new Promise(n=>{let s;try{s=Am(this.binary,this.seedArgsFor(r),{cwd:e,env:Sr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1058
1058
|
`:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:lo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Im(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new Sl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=Nm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=xm(r.env),c=Am(s,{shell:!0,cwd:r.cwd,env:ze(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function uo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Lt(t,r,e)}var Ze,be,Ot,co,Lt,Kr=T(()=>{"use strict";Ze=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},be=class extends Ze{},Ot=class extends Ze{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},co=class extends Ze{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Lt=class extends Ze{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as vl from"node:child_process";function e0(t){if(typeof vl.spawnSync=="function")try{vl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Rm(t){return t.exitCode!==null||t.signalCode!==null}function kl(t,e){return Rm(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function at(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??e0;if(Rm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await kl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await kl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await kl(t,Qv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Qv,fo=T(()=>{"use strict";Qv=1e3});function Om(t){we()&&process.stderr.write(`[debug] ${t}
|
|
1059
|
-
`)}function Vr(t,e){let r=r0[t];if(r)return r[e]??r.yolo}function s0(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function zt(t,e,r="yolo"){if(n0.has(t)){Om(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?Vr(t,"plan"):t0[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new be(s)}if(!s0(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new be(o)}Om(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var t0,r0,n0,Jn=T(()=>{"use strict";Kr()
|
|
1059
|
+
`)}function Vr(t,e){let r=r0[t];if(r)return r[e]??r.yolo}function s0(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function zt(t,e,r="yolo"){if(n0.has(t)){Om(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?Vr(t,"plan"):t0[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new be(s)}if(!s0(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new be(o)}Om(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var t0,r0,n0,Jn=T(()=>{"use strict";Kr();$e();t0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},r0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};n0=new Set(["codex","opencode"])});import{spawn as o0}from"node:child_process";import{existsSync as i0}from"node:fs";function l0(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
|
|
1060
1060
|
|
|
1061
1061
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1062
1062
|
|
|
@@ -1066,17 +1066,17 @@ ${e}
|
|
|
1066
1066
|
|
|
1067
1067
|
${r}`:r}function Lm(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||a0[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=Vr(s,a)??f0[s]??["--dangerously-skip-permissions"];i.push(...l);try{zt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!i0(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=o0(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:ze(e.env,e.cwd,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),at(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),at(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=c0({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
|
|
1068
1068
|
`);f=_.pop()||"";for(let b of _)m(b)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new be(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(_t(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(Z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(d0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
|
|
1069
|
-
`),_t(`stream-json: prompt sent (${t.length} chars)`)})}var a0,f0,Cm=T(()=>{"use strict";Kr();fo();Jn()
|
|
1069
|
+
`),_t(`stream-json: prompt sent (${t.length} chars)`)})}var a0,f0,Cm=T(()=>{"use strict";Kr();fo();Jn();$e();yt();a0={claude:"claude",qwen:"qwen"};f0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as m0,constants as p0}from"node:fs";import{delimiter as h0,join as _0}from"node:path";function g0(t,e=process.env){let r=e.PATH??"";for(let n of r.split(h0))if(n)try{return m0(_0(n,t),p0.X_OK),!0}catch{}return!1}function w0(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Yr(t,e,r={}){if(g0(t,r.env))return;(r.warn??console.warn)(w0(t,e))}var mo=T(()=>{"use strict"});function po(t={}){return Yr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${E0}`]}var y0,E0,Il=T(()=>{"use strict";mo();y0=864e5,E0=y0/1e3});import{spawn as b0}from"node:child_process";import{createInterface as T0}from"node:readline";import{existsSync as S0,readFileSync as k0}from"node:fs";import{fileURLToPath as v0}from"node:url";function I0(t){return t==="plan"?"read-only":"danger-full-access"}function $0(){return{clientInfo:{name:"lmctl",title:"lmctl",version:N0},capabilities:{experimentalApi:!1}}}function Zt(t,e){_t(`[codex:${t}] ${JSON.stringify(e)}`)}function x0(){return{agentItems:new Map,resultText:""}}function Mm(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function j0(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function A0(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function R0(){return{pendingCodexError:null}}function O0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1070
1070
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1071
1071
|
${e}
|
|
1072
1072
|
|
|
1073
1073
|
${r}`:r}function L0(t,e){let r=A0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function C0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Dm(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead";i&&o.push(...po()),we()&&Je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=I0(a);try{zt("codex",o,a)}catch(F){return n(F)}if(e.cwd&&!S0(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=b0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:ze(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),at(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),at(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=T0({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,b=Date.now(),E=x0(),k=R0();function $(F,U={}){return new Promise((J,R)=>{let W=m++;f.set(W,{resolve:J,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:W,method:F,params:U});c.stdin?.write(z+`
|
|
1074
1074
|
`)})}function v(F,U={}){let J=JSON.stringify({jsonrpc:"2.0",method:F,params:U});c.stdin?.write(J+`
|
|
1075
1075
|
`)}d.on("line",F=>{let U;try{U=JSON.parse(F)}catch{return}if(typeof U.id=="number"&&f.has(U.id)){let W=f.get(U.id);if(f.delete(U.id),U.error){let z=U.error,I=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(U.error);W.reject(uo(`codex app-server error: ${I}`,z))}else W.resolve(U);e.onEvent?.(U);return}let J=U.method;if(!J){e.onEvent?.(U);return}if(J==="thread/started"){let z=U.params?.thread;z?.id&&(p=z.id)}let R=we()?W=>{Zt("item.text/buffer-mismatch",{itemId:W.itemId,threadId:W.threadId??null,turnId:W.turnId??null,expectedFromItemText:W.expectedFromItemText,gotFromBuffer:W.gotFromBuffer,expectedLen:W.expectedFromItemText.length,gotLen:W.gotFromBuffer.length})}:void 0;if(J==="turn/started"){let W=U.params,z=W?.turn;z?.id&&(h=z.id),Mm(U,E,e.onDelta,R),we()&&Zt("turn/started",{params:W??null})}if(we()&&(J==="item/started"||J==="item/completed")){let W=U.params;W?.item?.type==="agentMessage"&&Zt(J,{params:W??null})}if(J==="item/started"||J==="item/agentMessage/delta"||J==="item/completed"){if(J==="item/agentMessage/delta"){let W=U.params;we()&&Zt("agentMessage/delta",{params:W??null})}Mm(U,E,e.onDelta,R)}if(J==="turn/completed"){let W=U.params;if(we())for(let[I,N]of E.agentItems.entries())N.buffer&&Zt("turn/completed/unflushed-item",{itemId:I,phase:N.phase,bufferLen:N.buffer.length});j0(E),we()&&Zt("turn/completed",{params:W??null});let z=C0(U,k);z.shouldReject?(we()&&Zt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(J==="error"){let W=L0(U,k);if(we()){let z=U.params,I=z?.error,N=typeof I?.message=="string"?I.message:"(no message)";Zt(W.willRetry?"error/retry":"error/terminal-deferred",{message:N,willRetry:W.willRetry,params:z??null})}}e.onEvent?.(U)});let A="";c.stderr?.on("data",F=>{A+=F.toString()}),c.on("error",F=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:F.message}),n(new be(`Failed to spawn codex app-server: ${F.message}`,{cause:F}))}),c.on("exit",F=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-b,exitCode:F});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:F,stderr_tail:A.slice(0,500)}),n(new Error(O0({exitCode:F,stderr:A})))}}),(async()=>{try{if(await $("initialize",$0()),v("initialized",{}),e.threadId)try{let F=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),U=new Promise((J,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([F,U]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1076
|
-
`);let U=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(p=U.id)}else{let U=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(p=U.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(F){at(c).catch(()=>{}),n(F instanceof Error?F:new Error(String(F)))}})()})}var N0,Pm=T(()=>{"use strict"
|
|
1076
|
+
`);let U=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(p=U.id)}else{let U=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(p=U.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(F){at(c).catch(()=>{}),n(F instanceof Error?F:new Error(String(F)))}})()})}var N0,Pm=T(()=>{"use strict";$e();$e();Kr();fo();Jn();Il();$e();yt();N0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(k0(v0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Qt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function Nl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:Fm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Um.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Wm.map(t=>[t,{name:t}]))}})}function Bm(){return[...Object.keys(Fm).map(t=>`github-copilot/${t}`),...Um.map(t=>`deepseek/${t}`),...Wm.map(t=>`openrouter/${t}`)].sort()}var Fm,Um,Wm,$l=T(()=>{"use strict";Fm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Qt("GPT-5 mini",["high"]),"gpt-5.2":Qt("GPT-5.2"),"gpt-5.2-codex":Qt("GPT-5.2 Codex"),"gpt-5.3-codex":Qt("GPT-5.3 Codex"),"gpt-5.4":Qt("GPT-5.4"),"gpt-5.4-mini":Qt("GPT-5.4 mini"),"gpt-5.4-nano":Qt("GPT-5.4 nano"),"gpt-5.5":Qt("GPT-5.5")},Um=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Wm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as Xm,mkdirSync as M0,readFileSync as Gm,writeFileSync as qm}from"node:fs";import{join as Xn,resolve as D0}from"node:path";function Jm(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:P0}}function F0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function ho(t){return structuredClone(t)}function Km(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function xl(t,e,r={existsSync:Xm,readFileSync:Gm}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=D0(e,s.sessiondir??e);for(let i of U0(o)){let a=W0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Km(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function U0(t){return[Xn(t,".opencode","opencode.jsonc"),Xn(t,"opencode.jsonc"),Xn(t,"opencode.json")]}function W0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(B0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function B0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
|
|
1077
1077
|
`;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function _o(t,e={}){let r=Xn(t,".opencode"),n=Xn(r,"opencode.json");if(Yr("lmctl","lmctl_chat",e),!Xm(n)){M0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:Nl(),mcp:{lmctl:Jm()}},null,2);return qm(n,l+`
|
|
1078
1078
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Gm(n,"utf-8"))}catch{return console.log(Hm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Hm.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Km(s.permission)||Z({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),q0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Jm();return F0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&qm(n,JSON.stringify(s,null,2)+`
|
|
1079
|
-
`,"utf-8"),o}function q0(t){let e=Nl(),r=Ct(t.provider)?t.provider:{},n=!Ct(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=ho(o),n=!0;continue}if(!Ct(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=Ct(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=ho(d),n=!0);a.options=l;let c=Ct(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=ho(d),n=!0;continue}let f=c[u];if(Ct(f)&&Ct(d)){let m={...f};Vm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function Ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Vm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=ho(s),r=!0;continue}Ct(t[n])&&Ct(s)&&Vm(t[n],s)&&(r=!0)}return r}var Hm,P0,go=T(()=>{"use strict"
|
|
1079
|
+
`,"utf-8"),o}function q0(t){let e=Nl(),r=Ct(t.provider)?t.provider:{},n=!Ct(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=ho(o),n=!0;continue}if(!Ct(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=Ct(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=ho(d),n=!0);a.options=l;let c=Ct(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=ho(d),n=!0;continue}let f=c[u];if(Ct(f)&&Ct(d)){let m={...f};Vm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function Ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Vm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=ho(s),r=!0;continue}Ct(t[n])&&Ct(s)&&Vm(t[n],s)&&(r=!0)}return r}var Hm,P0,go=T(()=>{"use strict";$e();$l();mo();Hm={yellow:t=>t},P0=864e5});import{spawn as H0}from"node:child_process";import{existsSync as J0}from"node:fs";import{createInterface as X0}from"node:readline";function G0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
1080
1080
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
1081
1081
|
${e}
|
|
1082
1082
|
|
|
@@ -1088,20 +1088,20 @@ ${r}`:r}function tI(t){let e=[...t.matchAll(Y0)];if(e.length>0){let r=e[e.length
|
|
|
1088
1088
|
`)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),$("notifications/initialized"),e.sessionId)try{p=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(A){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${A instanceof Error?A.message:String(A)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
1089
1089
|
`),p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),_t(`acp: set_config_option(model=${e.model}) ok`)}catch(A){let F=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${F}
|
|
1090
1090
|
`)}if(e.effort&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),_t(`acp: set_config_option(effort=${e.effort}) ok`)}catch(A){let F=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${F}
|
|
1091
|
-
`)}h="",b=!0,_t(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,_t(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){at(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var K0,V0,zm,Y0,z0,Z0,Q0,eI,Qm=T(()=>{"use strict"
|
|
1091
|
+
`)}h="",b=!0,_t(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,_t(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){at(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var K0,V0,zm,Y0,z0,Z0,Q0,eI,Qm=T(()=>{"use strict";$e();Kr();fo();Jn();go();$e();yt();K0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},V0=1,zm="(?:png|jpe?g|webp|heic|pdf)",Y0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${zm}\\s*`,"gi"),z0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${zm}\\s*`,"i"),Z0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,Q0=/^STANCE:\s+\S+\s*$/gim,eI=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function ep(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=nI){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function sI(){let t=new Map;return(e,r)=>{oI(e,ep(t,r))}}function oI(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
|
|
1092
1092
|
`).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
|
|
1093
1093
|
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function wo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?sI():void 0,s=await Lm(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function iI(){let t=new Map;return(e,r)=>{aI(e,ep(t,r))}}function aI(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function zr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&At({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?iI():void 0,s=await Zm(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function lI(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
|
|
1094
1094
|
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
|
|
1095
|
-
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function tp(t,e){let r=await Dm(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>lI(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var nI,kr=T(()=>{"use strict";Cm();Pm();Qm()
|
|
1096
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}async function sp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of We(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=mI(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Eo,op=T(()=>{"use strict";Vt();Eo=class{name="codex";codexDirs;constructor(e={}){let r=[Gn(ve,".codex"),Gn(ve,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Gn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Gn(r,"sessions");try{await rp(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await cI(e)}catch{return r}for(let s of n){let o=Gn(e,s),i=await rp(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=dI(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Me(e,30),n=await
|
|
1097
|
-
`);b.trim()&&Kn(s,m,{role:"thinking",timestamp:g,content:de(b)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Kn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await sp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await uI(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Me(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Ll(t){return new Ol(t)}var Ol,Cl=T(()=>{"use strict";op();Yt();kr();Rt();Ol=class extends Ce{constructor(e){super({provider:new Eo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${
|
|
1095
|
+
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function tp(t,e){let r=await Dm(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>lI(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var nI,kr=T(()=>{"use strict";Cm();Pm();Qm();$e();nI=256});function Al(t){return new jl(t)}var jl,Rl=T(()=>{"use strict";vm();Yt();kr();Rt();jl=class extends Ce{constructor(e){super({provider:new io(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ae,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:wo})}}});import{readdir as cI,stat as rp,unlink as uI}from"node:fs/promises";import{join as Gn,basename as dI}from"node:path";function fI(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Kn(t,e,r){let n=fI(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function np(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function mI(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function yo(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return yo(r)}).filter(r=>r.length>0).join(`
|
|
1096
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}async function sp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of We(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=mI(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Eo,op=T(()=>{"use strict";Vt();Eo=class{name="codex";codexDirs;constructor(e={}){let r=[Gn(ve,".codex"),Gn(ve,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Gn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Gn(r,"sessions");try{await rp(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await cI(e)}catch{return r}for(let s of n){let o=Gn(e,s),i=await rp(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=dI(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Me(e,30),n=await je(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=K(h.text.trim(),80)),u=K(h.text.trim(),80))}}if(!o)return null;let m=await sp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:np(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await je(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of We(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=np(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let b of _.content)if(b.type==="input_text"&&typeof b.text=="string"&&b.text){let E=b.text.trim();c||(c=K(E,80)),u=K(E,80),Kn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let b of _.content)b.type==="output_text"&&typeof b.text=="string"&&b.text&&Kn(s,m,{role:"assistant",timestamp:g,content:de(b.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let b of _.content)(b.type==="input_text"||b.type==="output_text")&&typeof b.text=="string"&&b.text&&Kn(s,m,{role:"system",timestamp:g,content:de(b.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(yo(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(yo(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let b=_.summary.map(E=>yo(E.text)).join(`
|
|
1097
|
+
`);b.trim()&&Kn(s,m,{role:"thinking",timestamp:g,content:de(b)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Kn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await sp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await uI(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Me(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Ll(t){return new Ol(t)}var Ol,Cl=T(()=>{"use strict";op();Yt();kr();Rt();Ol=class extends Ce{constructor(e){super({provider:new Eo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${Ae}
|
|
1098
1098
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:tp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Vn(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function bo(t){let e=Vn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
|
|
1099
1099
|
`).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?pI(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function pI(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&ip(t.tokens)&&ip(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function ip(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ap(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
|
|
1100
1100
|
`)+`
|
|
1101
|
-
`}var Ml=T(()=>{"use strict"});import{createHash as hI}from"node:crypto";import{readdir as Yn,readFile as lp,stat as To,unlink as _I}from"node:fs/promises";import{join as Xe,basename as gI,dirname as wI}from"node:path";import{cwd as yI}from"node:process";function cp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function up(t){return t==="user"}function Dl(t){return t==="gemini"||t==="assistant"}function vr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function EI(t){return`${t.sessionId}\0${t.cwd}`}function bI(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function So(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function dp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Dl(a.type)||!a.tokens)continue;let l=So(a.tokens.input),c=So(a.tokens.cached),u=Math.max(l-c,0),d=So(a.tokens.output),f=So(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function TI(t){return hI("sha256").update(t).digest("hex")}function zn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=wI(r);if(n===r)break;r=n}}var ko,fp=T(()=>{"use strict";Vt();Ml()
|
|
1102
|
-
`).trim();v&&o.push({role:"thinking",timestamp:vr($.timestamp,_),content:de(v)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=b?`[${b}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=vr(n.startTime,s.createdAt),p=vr(n.lastUpdated,s.modifiedAt),h=dp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await
|
|
1101
|
+
`}var Ml=T(()=>{"use strict"});import{createHash as hI}from"node:crypto";import{readdir as Yn,readFile as lp,stat as To,unlink as _I}from"node:fs/promises";import{join as Xe,basename as gI,dirname as wI}from"node:path";import{cwd as yI}from"node:process";function cp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function up(t){return t==="user"}function Dl(t){return t==="gemini"||t==="assistant"}function vr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function EI(t){return`${t.sessionId}\0${t.cwd}`}function bI(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function So(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function dp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Dl(a.type)||!a.tokens)continue;let l=So(a.tokens.input),c=So(a.tokens.cached),u=Math.max(l-c,0),d=So(a.tokens.output),f=So(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function TI(t){return hI("sha256").update(t).digest("hex")}function zn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=wI(r);if(n===r)break;r=n}}var ko,fp=T(()=>{"use strict";Vt();Ml();$e();ko=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Xe(ve,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=e.claudeDir||Xe(ve,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(ve,".codex"),Xe(ve,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Xe(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=EI(s),i=r.get(o);r.set(o,i?bI(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await je(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=vr(g.timestamp),b=g.type,E=de(cp(g.content));if(up(b)){let $=E.trim();$&&(u||(u=K($,80)),d=K($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Dl(b)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let v=[$.subject,$.description].filter(Boolean).join(`
|
|
1102
|
+
`).trim();v&&o.push({role:"thinking",timestamp:vr($.timestamp,_),content:de(v)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=b?`[${b}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=vr(n.startTime,s.createdAt),p=vr(n.lastUpdated,s.modifiedAt),h=dp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await je(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(up(m.type)){d++;let p=cp(m.content).trim();p&&(l||(l=K(de(p),80)),c=K(de(p),80))}else Dl(m.type)&&(d++,m.model&&(u=m.model));let f=dp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:vr(r.startTime,n.createdAt),modifiedAt:vr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await lp(e,"utf-8");if(Vn(r)==="unknown")return Z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return bo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=gI(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await Yn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await To(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Yn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Xe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await _I(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await je(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:vr(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;zn(e,yI());for(let n of this.extraWorkspacePaths)zn(e,n);for(let n of await this.collectGeminiProjectPaths())zn(e,n);for(let n of await this.collectCodexCwds())zn(e,n);for(let n of await this.collectClaudeCwds())zn(e,n);let r=new Map;for(let n of e)r.set(TI(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await lp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Me(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Yn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await To(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Yn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),u=(await Me(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await To(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Yn(e)}catch{return r}for(let o of s){let i=Xe(e,o),a=await To(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as SI,writeFileSync as kI,mkdirSync as vI}from"node:fs";import{join as II,dirname as NI}from"node:path";import{randomUUID as $I}from"node:crypto";function Fl(t){return new Pl(t)}var Pl,Ul=T(()=>{"use strict";fp();Yt();kr();Rt();Ml();Pl=class extends Ce{constructor(e){super({provider:new ko(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",Ae,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>zr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
|
|
1103
1103
|
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:lo,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=SI(n,"utf-8"),o=Vn(s),i=bo(s),a=$I();i.sessionId=a,i.kind="main";let l=NI(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=II(l,d);return vI(l,{recursive:!0}),kI(f,ap(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as mp,readFile as xI,rm as jI,stat as Zr}from"node:fs/promises";import{basename as AI,join as lt}from"node:path";function RI(t){let e={};for(let r of t.split(`
|
|
1104
|
-
`)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Ir(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function OI(t){let e=0;for await(let r of We(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var vo,pp=T(()=>{"use strict";Vt();vo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||lt(ve,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await mp(this.sessionStateDir)}catch{return e}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Zr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),o=await Zr(s).catch(()=>null),i=o?s:lt(r,"workspace.yaml"),a=await
|
|
1104
|
+
`)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Ir(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function OI(t){let e=0;for await(let r of We(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var vo,pp=T(()=>{"use strict";Vt();vo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||lt(ve,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await mp(this.sessionStateDir)}catch{return e}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Zr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),o=await Zr(s).catch(()=>null),i=o?s:lt(r,"workspace.yaml"),a=await je(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||AI(r)||e;if(o)for await(let _ of We(s)){let b=Ir(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Ir(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=K(k,80)),p=K(k,80)),l.push({role:"user",timestamp:b,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:b,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:b,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:b,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:b,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:b,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=K(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Ir(n?.created_at)??a.createdAt,modifiedAt:Ir(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=lt(e,"events.jsonl"),o=await Zr(s).catch(()=>null),i=o?s:lt(e,"workspace.yaml"),a=await je(o?s:e),l=o?await Me(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Ir(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let b=(_.data.content||"").trim();b&&(p||(p=K(b,80)),h=K(b,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=K(_,80))}let g=o?await OI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Ir(n?.created_at)??a.createdAt,modifiedAt:Ir(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=lt(e,"workspace.yaml");try{let n=await xI(r,"utf-8");return RI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await jI(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await mp(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=lt(this.sessionStateDir,e);if((await Zr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=lt(this.sessionStateDir,s);(await Zr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=lt(this.sessionStateDir,s);if(!(await Zr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Wl(t){return new Ce({provider:new vo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ae,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>zr(e,{...r,acpTool:"copilot"})})}var Bl=T(()=>{"use strict";pp();Yt();kr();Rt()});import{existsSync as hp}from"node:fs";import{join as Io}from"node:path";import{createRequire as LI}from"node:module";function _p(){return ql===null&&(ql=LI(import.meta.url)("node:sqlite").DatabaseSync),ql}function CI(){let t=process.env.XDG_DATA_HOME||Io(ve,".local","share"),e=process.env.XDG_CONFIG_HOME||Io(ve,".config");return[Io(t,"opencode","opencode.db"),Io(e,"opencode","opencode.db")]}var ql,No,gp=T(()=>{"use strict";Vt();ql=null;No=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=CI().find(r=>hp(r))??null}openDb(){return!this.dbPath||!hp(this.dbPath)?null:new(_p())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1105
1105
|
s.time_created, s.time_updated
|
|
1106
1106
|
FROM session s
|
|
1107
1107
|
ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
@@ -1114,9 +1114,9 @@ ${r}`:r}function tI(t){let e=[...t.matchAll(Y0)];if(e.length>0){let r=e[e.length
|
|
|
1114
1114
|
FROM session s
|
|
1115
1115
|
WHERE s.id LIKE ?
|
|
1116
1116
|
ORDER BY s.time_updated DESC
|
|
1117
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Jl(){return new Hl}var Hl,Xl=T(()=>{"use strict";gp();Yt();kr();Rt();Hl=class extends Ce{constructor(){super({provider:new No,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",
|
|
1117
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Jl(){return new Hl}var Hl,Xl=T(()=>{"use strict";gp();Yt();kr();Rt();Hl=class extends Ce{constructor(){super({provider:new No,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",Ae],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>zr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??Ae),r}}});import{readdir as $o,readFile as MI,rm as DI}from"node:fs/promises";import{basename as wp,join as er}from"node:path";function yp(t){return t.type==="user"||t.message?.role==="user"}function Ep(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function bp(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
|
|
1118
1118
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1119
|
-
`):"":""}function Tp(t){return t.model||t.message?.model}var xo,Sp=T(()=>{"use strict";Vt();xo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||er(ve,".qwen")}async discoverSessions(){let e=er(this.baseDir,"projects"),r;try{r=await $o(e)}catch{return[]}let n=[];for(let s of r){let o=er(e,s,"chats"),i;try{i=await $o(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=er(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await xe(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),yp(d)){let f=bp(d).trim();f&&(l||(l=K(f,80)),c=K(f,80)),u++}if(Ep(d)){let f=Tp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=wp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(yp(f)){let h=bp(f);h.trim()&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(Ep(f)){let h=Tp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=er(this.baseDir,"projects");try{let n=await $o(r),s=[];for(let o of n){let i=er(r,o,"chats",`${e}.jsonl`);try{return await MI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=er(r,o,"chats"),a;try{a=await $o(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;wp(l,".jsonl").startsWith(e)&&s.push(er(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await DI(r),!0}catch{return!1}}}});function Kl(){return new Gl}var Gl,Vl=T(()=>{"use strict";Sp();Yt();kr();Rt();Gl=class extends Ce{constructor(){super({provider:new xo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",je,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:wo})}}});import{readdir as kp,readFile as PI,rm as vp,stat as Ip}from"node:fs/promises";import{basename as Yl,join as Mt}from"node:path";async function FI(t){let e=await Promise.all(t.map(r=>xe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function UI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Np(t){return t.type==="USER_INPUT"}function $p(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function WI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function xp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function jp(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function BI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function qI(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=HI(s);if(o)return o}let n=JI(e.content);if(n)return n}return null}function HI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function JI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Ap(t){if(t.endsWith(".db"))return Yl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var jo,Rp=T(()=>{"use strict";Vt();jo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Mt(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Mt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Mt(this.baseDir,"conversations"),r;try{r=await kp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Yl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Mt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Mt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Ip(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await FI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Me(n,80);for(let f of d){let m=jp(f.content);if(m&&(a=m),Np(f)){let p=xp(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else $p(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Ap(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of We(o)){let d=UI(u.created_at,s.modifiedAt),f=jp(u.content);if(f&&(a=f),Np(u)){let m=xp(u.content),p=m.trim();p&&(l||(l=K(p,80)),c=K(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:BI(m.args),toolName:m.name||"tool"});$p(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):WI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Ip(r),r}catch{}let n=Mt(this.baseDir,"conversations");try{let s=[];for(let o of await kp(n)){if(!o.endsWith(".db"))continue;Yl(o,".db").startsWith(e)&&s.push(Mt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Ap(r);return n?(await vp(this.conversationPath(n),{force:!0}),await vp(Mt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await qI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Mt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await PI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as XI}from"node:child_process";function Zl(t){return new zl(t)}async function GI(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",VI(e.timeoutMs)];e.model&&n.push("--model",e.model),zt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await KI(e.binary,n,{cwd:e.cwd,env:ze(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function KI(t,e,r){return new Promise((n,s)=>{let o;try{o=XI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function VI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var zl,Ql=T(()=>{"use strict";Rp();Yt();Rt();yt();Jn();zl=class extends Ce{constructor(e){super({provider:new jo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",je,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:GI})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as YI}from"node:crypto";import{join as zI}from"node:path";function ZI(t){return YI("sha256").update(t).digest("hex").slice(0,8)}function QI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function eN(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function tN(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ao(t){return Math.max(1,Math.ceil(t.length/4))}function Op(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function rc(){return new tc}var Nr,ec,tc,nc=T(()=>{"use strict";Nr=new Map;ec=class{name="ClaudeMock";async discoverSessions(){return[...Nr.values()].map(Op)}async loadSession(e){let r=Nr.get(e);return r===void 0?null:{...Op(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Nr.get(e)?.filePath??null}async deleteSession(e){return Nr.delete(e)}},tc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ec;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=QI(eN(e,r)),s=`mock-${n}-${ZI(`${e}:${n}`)}`,o=new Date,i=Nr.get(s),a=r?.prompt??"ClaudeMock seed",l=Ao(a),c={sessionId:s,cwd:e,filePath:zI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Ao("ACK: ClaudeMock seeded"),Nr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Nr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${tN(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Ao(e),s.totalOutputTokens+=Ao(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Et(t){let e=[Al({claudeDir:t?.claudeDir}),Ll({codexDir:t?.codexDir,codeDir:t?.codeDir}),Fl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Wl({copilotDir:t?.copilotDir}),Jl(),Kl(),Zl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(rc()),e}var sc=T(()=>{"use strict";Rl();Cl();Ul();Bl();Xl();Vl();Ql();nc();Rl();Cl();Ul();Bl();Xl();Vl();Ql();nc()});var lc={};le(lc,{ProviderRegistry:()=>qn,TransportConnectionError:()=>be,TransportError:()=>Ze,TransportJsonError:()=>co,TransportProcessError:()=>Ot,TransportRpcError:()=>Lt,_resetDefaultRegistryForTests:()=>rN,chat:()=>Dt,countTokens:()=>ac,createAdapterRegistry:()=>wt,createAllAdapters:()=>Et,listSessions:()=>ic,seed:()=>oc});function Oo(){return Ro===null&&(Ro=wt(Et())),Ro}function rN(){Ro=null}function Cp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Dt(t){let e=t.registry??Oo(),r=Cp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function oc(t){let e=t.registry??Oo(),r=Cp(e,t.provider),n=await Lp(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Lp(e,t.provider,t.cwd),i=nN(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Lp(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function nN(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ic(t={}){return(t.registry??Oo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function ac(t){let r=await(t.registry??Oo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var Ro,bt=T(()=>{"use strict";bl();sc();bl();sc();Kr();Ro=null});function sN(){return cc===null&&(cc=wt(Et())),cc}async function en(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await iN(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Qr.delete(r),e.setMemberState(r,"idle");else{let i=oN(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function oN(t,e){if(!(t instanceof Te))return Qr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Qr.get(e)??0)+1;return r>=3?(Qr.delete(e),"consecutive_timeouts"):(Qr.set(e,r),null)}return Qr.delete(e),null}async function iN(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=sN(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Te("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,uc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Te("other",null,`library: session resolution failed: ${Mp(u)}`,uc(t.sessionid,t.sessiondir,"unresolved")))}let o=uc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Dt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Te("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Te("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):aN(u,o)}finally{a!==null&&clearTimeout(a)}}function uc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Mp(t){return t instanceof Error?t.message:String(t)}function aN(t,e){if(t instanceof Te)return t;if(t instanceof be){let r=t.cause;return r?.code==="ENOENT_CWD"?new Te("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Te("enoent",null,t.message,e):new Te("other",null,t.message,e)}return t instanceof Ot?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Lt?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Te("other",null,t.message,e):new Te("other",null,Mp(t),e)}var Te,cc,Qr,Zn=T(()=>{"use strict";bt();Te=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},cc=null;Qr=new Map});function Dp(){return dc===null&&(dc=wt(Et())),dc}function cN(t,e){if(!lN.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ie("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function tn(t){let e=cN(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await uN({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function uN(t){let e=t.member.provider,r=t.member.sessiondir,n=fc("seed",r,e);try{let s=await oc({provider:e,cwd:r,registry:Dp()});if(!s.success)throw fN(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:mc(s,n)}}async function Pp(t){return dN(t)}async function dN(t){let e=Dp(),r=fc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ie("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ie?o:mc(o,r)}let s=fc("tokens",t.sessionid,n);try{let o=await ac({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof Ie?o:mc(o,s)}}function fc(t,e,r){return["<library>",t,e,"--provider",r]}function fN(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ie("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ie("nonzero_exit",Number(n[1]),r,e)}return new Ie("other",null,r,e)}function mc(t,e){return t instanceof Ie?t:t instanceof be?t.cause?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e):t instanceof Ot?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Lt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Ie("other",null,t.message,e):new Ie("other",null,t instanceof Error?t.message:String(t),e)}var Ie,dc,lN,Lo=T(()=>{"use strict";bt();Ie=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},dc=null;lN=/^provider[123]$/});function Co(t){return Buffer.from(t,"utf8").toString("base64url")}function es(t){return Buffer.from(t,"base64url").toString("utf8")}async function Fp(t,e=r=>Pp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of mN(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Up(t,e,r){let n=Wp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Qn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await en({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Bp(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function pc(t,e,r){let n=Wp(t,e,r);if(n===null)throw new Error("session member not found");let s=await tn({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Bp(t,e,r)}}function mN(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Wp(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Bp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Qn,Mo=T(()=>{"use strict";Zn();Lo();Qn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function hc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??hN(e),s=r-n,o=e.query(`
|
|
1119
|
+
`):"":""}function Tp(t){return t.model||t.message?.model}var xo,Sp=T(()=>{"use strict";Vt();xo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||er(ve,".qwen")}async discoverSessions(){let e=er(this.baseDir,"projects"),r;try{r=await $o(e)}catch{return[]}let n=[];for(let s of r){let o=er(e,s,"chats"),i;try{i=await $o(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=er(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await je(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),yp(d)){let f=bp(d).trim();f&&(l||(l=K(f,80)),c=K(f,80)),u++}if(Ep(d)){let f=Tp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=wp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await je(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(yp(f)){let h=bp(f);h.trim()&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(Ep(f)){let h=Tp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=er(this.baseDir,"projects");try{let n=await $o(r),s=[];for(let o of n){let i=er(r,o,"chats",`${e}.jsonl`);try{return await MI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=er(r,o,"chats"),a;try{a=await $o(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;wp(l,".jsonl").startsWith(e)&&s.push(er(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await DI(r),!0}catch{return!1}}}});function Kl(){return new Gl}var Gl,Vl=T(()=>{"use strict";Sp();Yt();kr();Rt();Gl=class extends Ce{constructor(){super({provider:new xo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ae,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:wo})}}});import{readdir as kp,readFile as PI,rm as vp,stat as Ip}from"node:fs/promises";import{basename as Yl,join as Mt}from"node:path";async function FI(t){let e=await Promise.all(t.map(r=>je(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function UI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Np(t){return t.type==="USER_INPUT"}function $p(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function WI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function xp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function jp(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function BI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function qI(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=HI(s);if(o)return o}let n=JI(e.content);if(n)return n}return null}function HI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function JI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Ap(t){if(t.endsWith(".db"))return Yl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var jo,Rp=T(()=>{"use strict";Vt();jo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Mt(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Mt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Mt(this.baseDir,"conversations"),r;try{r=await kp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Yl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Mt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Mt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Ip(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await FI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Me(n,80);for(let f of d){let m=jp(f.content);if(m&&(a=m),Np(f)){let p=xp(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else $p(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Ap(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of We(o)){let d=UI(u.created_at,s.modifiedAt),f=jp(u.content);if(f&&(a=f),Np(u)){let m=xp(u.content),p=m.trim();p&&(l||(l=K(p,80)),c=K(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:BI(m.args),toolName:m.name||"tool"});$p(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):WI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Ip(r),r}catch{}let n=Mt(this.baseDir,"conversations");try{let s=[];for(let o of await kp(n)){if(!o.endsWith(".db"))continue;Yl(o,".db").startsWith(e)&&s.push(Mt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Ap(r);return n?(await vp(this.conversationPath(n),{force:!0}),await vp(Mt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await qI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Mt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await PI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as XI}from"node:child_process";function Zl(t){return new zl(t)}async function GI(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",VI(e.timeoutMs)];e.model&&n.push("--model",e.model),zt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await KI(e.binary,n,{cwd:e.cwd,env:ze(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function KI(t,e,r){return new Promise((n,s)=>{let o;try{o=XI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function VI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var zl,Ql=T(()=>{"use strict";Rp();Yt();Rt();yt();Jn();zl=class extends Ce{constructor(e){super({provider:new jo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Ae,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:GI})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as YI}from"node:crypto";import{join as zI}from"node:path";function ZI(t){return YI("sha256").update(t).digest("hex").slice(0,8)}function QI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function eN(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function tN(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ao(t){return Math.max(1,Math.ceil(t.length/4))}function Op(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function rc(){return new tc}var Nr,ec,tc,nc=T(()=>{"use strict";Nr=new Map;ec=class{name="ClaudeMock";async discoverSessions(){return[...Nr.values()].map(Op)}async loadSession(e){let r=Nr.get(e);return r===void 0?null:{...Op(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Nr.get(e)?.filePath??null}async deleteSession(e){return Nr.delete(e)}},tc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ec;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=QI(eN(e,r)),s=`mock-${n}-${ZI(`${e}:${n}`)}`,o=new Date,i=Nr.get(s),a=r?.prompt??"ClaudeMock seed",l=Ao(a),c={sessionId:s,cwd:e,filePath:zI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Ao("ACK: ClaudeMock seeded"),Nr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Nr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${tN(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Ao(e),s.totalOutputTokens+=Ao(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Et(t){let e=[Al({claudeDir:t?.claudeDir}),Ll({codexDir:t?.codexDir,codeDir:t?.codeDir}),Fl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Wl({copilotDir:t?.copilotDir}),Jl(),Kl(),Zl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(rc()),e}var sc=T(()=>{"use strict";Rl();Cl();Ul();Bl();Xl();Vl();Ql();nc();Rl();Cl();Ul();Bl();Xl();Vl();Ql();nc()});var lc={};le(lc,{ProviderRegistry:()=>qn,TransportConnectionError:()=>be,TransportError:()=>Ze,TransportJsonError:()=>co,TransportProcessError:()=>Ot,TransportRpcError:()=>Lt,_resetDefaultRegistryForTests:()=>rN,chat:()=>Dt,countTokens:()=>ac,createAdapterRegistry:()=>wt,createAllAdapters:()=>Et,listSessions:()=>ic,seed:()=>oc});function Oo(){return Ro===null&&(Ro=wt(Et())),Ro}function rN(){Ro=null}function Cp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Dt(t){let e=t.registry??Oo(),r=Cp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function oc(t){let e=t.registry??Oo(),r=Cp(e,t.provider),n=await Lp(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Lp(e,t.provider,t.cwd),i=nN(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Lp(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function nN(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ic(t={}){return(t.registry??Oo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function ac(t){let r=await(t.registry??Oo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var Ro,bt=T(()=>{"use strict";bl();sc();bl();sc();Kr();Ro=null});function sN(){return cc===null&&(cc=wt(Et())),cc}async function en(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await iN(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Qr.delete(r),e.setMemberState(r,"idle");else{let i=oN(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function oN(t,e){if(!(t instanceof Te))return Qr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Qr.get(e)??0)+1;return r>=3?(Qr.delete(e),"consecutive_timeouts"):(Qr.set(e,r),null)}return Qr.delete(e),null}async function iN(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=sN(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Te("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,uc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Te("other",null,`library: session resolution failed: ${Mp(u)}`,uc(t.sessionid,t.sessiondir,"unresolved")))}let o=uc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Dt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Te("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Te("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):aN(u,o)}finally{a!==null&&clearTimeout(a)}}function uc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Mp(t){return t instanceof Error?t.message:String(t)}function aN(t,e){if(t instanceof Te)return t;if(t instanceof be){let r=t.cause;return r?.code==="ENOENT_CWD"?new Te("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Te("enoent",null,t.message,e):new Te("other",null,t.message,e)}return t instanceof Ot?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Lt?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Te("other",null,t.message,e):new Te("other",null,Mp(t),e)}var Te,cc,Qr,Zn=T(()=>{"use strict";bt();Te=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},cc=null;Qr=new Map});function Dp(){return dc===null&&(dc=wt(Et())),dc}function cN(t,e){if(!lN.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ie("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function tn(t){let e=cN(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await uN({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function uN(t){let e=t.member.provider,r=t.member.sessiondir,n=fc("seed",r,e);try{let s=await oc({provider:e,cwd:r,registry:Dp()});if(!s.success)throw fN(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:mc(s,n)}}async function Pp(t){return dN(t)}async function dN(t){let e=Dp(),r=fc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ie("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ie?o:mc(o,r)}let s=fc("tokens",t.sessionid,n);try{let o=await ac({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof Ie?o:mc(o,s)}}function fc(t,e,r){return["<library>",t,e,"--provider",r]}function fN(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ie("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ie("nonzero_exit",Number(n[1]),r,e)}return new Ie("other",null,r,e)}function mc(t,e){return t instanceof Ie?t:t instanceof be?t.cause?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e):t instanceof Ot?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Lt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Ie("other",null,t.message,e):new Ie("other",null,t instanceof Error?t.message:String(t),e)}var Ie,dc,lN,Lo=T(()=>{"use strict";bt();Ie=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},dc=null;lN=/^provider[123]$/});function Co(t){return Buffer.from(t,"utf8").toString("base64url")}function es(t){return Buffer.from(t,"base64url").toString("utf8")}async function Fp(t,e=r=>Pp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of mN(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Up(t,e,r){let n=Wp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Qn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await en({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Bp(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function pc(t,e,r){let n=Wp(t,e,r);if(n===null)throw new Error("session member not found");let s=await tn({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Bp(t,e,r)}}function mN(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Wp(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Bp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Qn,Mo=T(()=>{"use strict";Zn();Lo();Qn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function hc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??hN(e),s=r-n,o=e.query(`
|
|
1120
1120
|
SELECT
|
|
1121
1121
|
isess.id AS interactive_session_id,
|
|
1122
1122
|
isess.run_id,
|
|
@@ -1142,7 +1142,7 @@ ${r}`:r}function tI(t){let e=[...t.matchAll(Y0)];if(e.length>0){let r=e[e.length
|
|
|
1142
1142
|
JOIN step s ON s.id = isess.step_id
|
|
1143
1143
|
WHERE isess.status = 'waiting_agent'
|
|
1144
1144
|
AND r.terminal_state IS NULL
|
|
1145
|
-
`),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=wN(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=_N(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider
|
|
1145
|
+
`),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=wN(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=_N(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:xe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,gN(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function hN(t){return qp(t.getConfig(Do),pN)*1e3}function _c(t,e){return qp(t.getConfig(Po),e)}function qp(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function _N(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function gN(t,e,r,n){return t.query(`SELECT * FROM attention
|
|
1146
1146
|
WHERE kind = 'session_hung'
|
|
1147
1147
|
AND run_id = ?
|
|
1148
1148
|
AND acknowledged_at IS NULL`,e).some(o=>{let i=Hp(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function wN(t,e,r){let n=Hp(t);return n===null?null:yN(n,e,r)??EN(n,e,r)}function yN(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(bN),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=$r(s.members)?s.members:null,i=o!==null&&$r(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function EN(t,e,r){if(!$r(t.states))return null;let n=t.states[e]??t.states[r];if(!$r(n))return null;let s=n;if(!$r(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function bN(t){return $r(t)}function Hp(t){if(t===null)return null;try{let e=JSON.parse(t);return $r(e)?e:null}catch{return null}}function $r(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Do,Po,pN,gc=T(()=>{"use strict";Ue();Do="monitor.session_hung.elapsed_threshold_seconds",Po="monitor.session_hung.check_interval_ms",pN=600});function Uo(t){let e=t.query(`
|
|
@@ -1248,7 +1248,7 @@ ${r}`:r}function tI(t){let e=[...t.matchAll(Y0)];if(e.length>0){let r=e[e.length
|
|
|
1248
1248
|
AND acknowledged_at IS NULL
|
|
1249
1249
|
ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:ON($.payload)})),k=_.map($=>{let v=f.get($),A=p.get($),F=NN(s,$,b,v,A),U=v===void 0?null:Date.parse(v.started_at),J=v?.ended_at===null||v===void 0?null:Date.parse(v.ended_at),R=v===void 0||Number.isNaN(U??NaN)?null:J!==null&&!Number.isNaN(J)?J-U:F==="running"||F==="paused"?n-U:null,W=v===void 0?null:h.get(v.id)??null,z=LN(A?.last_activity_at??null,W,g),I=o===null||A===void 0?void 0:jN(t,s.team_id,o.definition,A.state_name,v?.state_name??$);return{step_id:v?.id??null,state_id:$,status:F,started_at:v?.started_at??null,ended_at:v?.ended_at??null,last_activity_at:z,elapsed_ms:R,...I!==void 0?{member:I}:{},...A!==void 0?{interactive_session:{id:A.id,status:A.status,turn_count:A.turn_count,state_name:A.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:xN(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:$N(k,s.terminal_state!==null),related_attentions:E}}function Go(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Xp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Jp(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Jp(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Ko(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Xp(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${CN(a.payload)}`)}return`${n.join(`
|
|
1250
1250
|
`)}
|
|
1251
|
-
`}function vN(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function IN(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function NN(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function $N(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function xN(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function jN(t,e,r,n,s){let o=AN(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider
|
|
1251
|
+
`}function vN(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function IN(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function NN(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function $N(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function xN(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function jN(t,e,r,n,s){let o=AN(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:xe(i)}}function AN(t,e,r){let n=RN(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>tr(a)?a.id===e||a.name===e||a.name===r:!1),o=tr(s?.members)?s.members:null,i=o!==null&&tr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(tr(n.states)){let s=n.states[e]??n.states[r];if(!tr(s))return null;let o=tr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function RN(t){try{let e=JSON.parse(t);return tr(e)?e:null}catch{return null}}function ON(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function tr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function LN(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Jp(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Ko(Math.max(0,n-r)).padEnd(6)}]`}function Xp(t,e){return Number.isNaN(t)?"?":Ko(Math.max(0,e-t))}function Ko(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function CN(t){if(!tr(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Ko(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var th,Pt=T(()=>{"use strict";Ue();th=`SELECT a.id AS attention_id,
|
|
1252
1252
|
a.kind AS kind,
|
|
1253
1253
|
a.severity AS severity,
|
|
1254
1254
|
a.created_at AS created_at,
|
|
@@ -1485,17 +1485,17 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1485
1485
|
`),Z({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),!o.present&&o.scope!=="codex-cli-flags"&&t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
|
|
1486
1486
|
`)}function di(t,e,r){let n=as(Wx(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([or]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ls),ir(Be(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)Gx(i)}function Hx(){let t=fi();try{let{changed:e}=Fc(t,{[ls]:Dc()});return{scope:"copilot-user",path:t,changed:e,present:Mc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:Mc(t),error:e instanceof Error?e.message:String(e)}}}function fi(t=Ph??Dh()){return Be(t,".copilot","mcp-config.json")}function Fc(t,e){let r={};if(Se.existsSync(t)){let o=JSON.parse(Se.readFileSync(t,"utf8"));if(!ut(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ut(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ut(n[o])?n[o]:void 0;Wh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,Fh(t,r),{changed:!0}):{changed:!1}}function Fh(t,e){Se.mkdirSync(as(t),{recursive:!0});let r=Be(as(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Se.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
1487
1487
|
`,"utf8"),Se.renameSync(r,t)}catch(n){try{Se.unlinkSync(r)}catch{}throw n}}function Jx(t,e){Se.mkdirSync(as(t),{recursive:!0});let r=Be(as(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Se.writeFileSync(r,e,"utf8"),Se.renameSync(r,t)}catch(n){try{Se.unlinkSync(r)}catch{}throw n}}function Ch(t){return Mc(Be(t,".mcp.json"))}function Xx(t,e){let r=Be(t,".mcp.json");ir(r,"mcpServers",[e])}function ir(t,e,r){try{if(!Se.existsSync(t))return;let n=JSON.parse(Se.readFileSync(t,"utf8"));if(!ut(n)||!ut(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,Fh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function Gx(t){let e=Ph??Dh();switch(t){case"copilot":ir(fi(e),"mcpServers",[or]);return;case"claude":ir(Be(e,".claude.json"),"mcpServers",[or]);return;case"gemini":ir(Be(e,".gemini","settings.json"),"mcpServers",[or]);return;case"qwen":ir(Be(e,".qwen","settings.json"),"mcpServers",[or]);return;case"agy":ir(Be(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[or]);return;case"opencode":ir(Be(e,".config","opencode","opencode.json"),"mcp",[or]);return;case"codex":Kx(Be(e,".codex","config.toml"),or);return;default:return}}function Kx(t,e){try{if(!Se.existsSync(t))return;let n=Se.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=Vx(a);if(l===null)return;if(l!==void 0){if(Mh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=Yx(a);if(c===null)return;if(c!==void 0&&Mh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;Jx(t,s.join(`
|
|
1488
|
-
`)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Mh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function Vx(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Uh(e[1])}function Yx(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Uh(r)}function Uh(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function Mc(t){try{if(!Se.existsSync(t))return!1;let e=JSON.parse(Se.readFileSync(t,"utf8"));if(!ut(e)||!ut(e.mcpServers))return!1;let r=ut(e.mcpServers[ls])?e.mcpServers[ls]:void 0;return Wh(r,Dc())}catch{return!1}}function Wh(t,e){return t!==void 0&&ci(t)===ci(e)}function ci(t){return Array.isArray(t)?`[${t.map(e=>ci(e)).join(",")}]`:ut(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ci(t[e])}`).join(",")}}`:JSON.stringify(t)}function ut(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ls,or,Bx,Se,Ph,cs=T(()=>{"use strict"
|
|
1489
|
-
`,"utf8")}function fj(t,e){let r={};for(let n of t)r[n.name]=pi(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Fc(fi(dn()),r)}catch(n){throw new tt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function mj(t){if(typeof t!="string")return t.name;let e=qh(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?qh(t.replace(/\/skill\.md$/i,"")):e}async function Jh(t,e,r){let n=mj(t),s=et(e,n);if(Kh(s,{recursive:!0}),typeof t!="string")return Uc(et(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(sr(t)&&(t=await is(t)),qc.test(t))return Uc(et(s,"SKILL.md"),await Yh(t,r),"utf8"),{name:n,dir:s};if(!Bc(t))throw new tt(r,`skill path not found: ${t}`);return Zx(t).isDirectory()?(Bh(t,s,{recursive:!0}),{name:n,dir:s}):(Bh(t,et(s,"SKILL.md")),{name:n,dir:s})}async function hi(t){let{dal:e,member:r,stderr:n}=t,s=sj(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o
|
|
1488
|
+
`)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Mh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function Vx(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Uh(e[1])}function Yx(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Uh(r)}function Uh(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function Mc(t){try{if(!Se.existsSync(t))return!1;let e=JSON.parse(Se.readFileSync(t,"utf8"));if(!ut(e)||!ut(e.mcpServers))return!1;let r=ut(e.mcpServers[ls])?e.mcpServers[ls]:void 0;return Wh(r,Dc())}catch{return!1}}function Wh(t,e){return t!==void 0&&ci(t)===ci(e)}function ci(t){return Array.isArray(t)?`[${t.map(e=>ci(e)).join(",")}]`:ut(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ci(t[e])}`).join(",")}}`:JSON.stringify(t)}function ut(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ls,or,Bx,Se,Ph,cs=T(()=>{"use strict";$e();ls="lmctl",or="lmctl0",Bx={existsSync:Cx,mkdirSync:Mx,readFileSync:Dx,writeFileSync:Ux,renameSync:Px,unlinkSync:Fx},Se=Bx});import{spawnSync as Gh}from"node:child_process";import{cpSync as Bh,existsSync as Bc,mkdirSync as Kh,mkdtempSync as zx,readFileSync as Vh,statSync as Zx,writeFileSync as Uc}from"node:fs";import{homedir as Qx,tmpdir as ej}from"node:os";import{basename as qh,join as et}from"node:path";function Ft(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Wc(t,e,r){if(Array.isArray(t)){for(let n of t)Wc(n,e,r);return}if(Ft(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Wc(n,e,r)}}function sj(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Ft(a)||!Array.isArray(a.steps)))for(let l of a.steps)Ft(l)&&l.members!==void 0&&Wc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(nj(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function oj(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function Yh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(tj)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>Hh)throw new tt(e,`fetched ${t} exceeds ${Hh} bytes`);return n}async function ij(t,e){if(typeof t!="string")return[t];sr(t)&&(t=await is(t));let r;if(qc.test(t))r=await Yh(t,e);else{if(!Bc(t))throw new tt(e,`mcp file not found: ${t}`);r=Vh(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(Ft(n)&&Ft(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Ft(o)?o:{}}));if(Ft(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function pi(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function mi(t,e,r,n){let s=Gh(t,e,{cwd:r,env:Sr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function aj(t,e,r){Gh(t,e,{cwd:r,env:Sr(void 0,r),encoding:"utf8",timeout:6e4})}function lj(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function cj(t){let e=["mcp","add"];if(pi(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function uj(t){if(pi(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function dj(t){let e=et(process.env.XDG_CONFIG_HOME??et(dn(),".config"),"opencode"),r=et(e,"opencode.json"),n={};if(Bc(r))try{let o=JSON.parse(Vh(r,"utf8"));Ft(o)&&(n=o)}catch{}let s=Ft(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=pi(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Kh(e,{recursive:!0}),Uc(r,`${JSON.stringify(n,null,2)}
|
|
1489
|
+
`,"utf8")}function fj(t,e){let r={};for(let n of t)r[n.name]=pi(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Fc(fi(dn()),r)}catch(n){throw new tt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function mj(t){if(typeof t!="string")return t.name;let e=qh(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?qh(t.replace(/\/skill\.md$/i,"")):e}async function Jh(t,e,r){let n=mj(t),s=et(e,n);if(Kh(s,{recursive:!0}),typeof t!="string")return Uc(et(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(sr(t)&&(t=await is(t)),qc.test(t))return Uc(et(s,"SKILL.md"),await Yh(t,r),"utf8"),{name:n,dir:s};if(!Bc(t))throw new tt(r,`skill path not found: ${t}`);return Zx(t).isDirectory()?(Bh(t,s,{recursive:!0}),{name:n,dir:s}):(Bh(t,et(s,"SKILL.md")),{name:n,dir:s})}async function hi(t){let{dal:e,member:r,stderr:n}=t,s=sj(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=xe(r),i=r.sessiondir||t.baseDir||oj(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
1490
1490
|
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await ij(c,r.alias));if(o==="opencode")dj(l);else if(o==="copilot")fj(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(aj(o,lj(o,c.name),i),o==="claude"){let{name:u,...d}=c;mi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?mi("codex",uj(c),i,r.alias):mi(o,cj(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(rj.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=zx(et(ej(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!qc.test(c)?c:(await Jh(c,l,r.alias)).dir;mi(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Xh[o]!==void 0){let l=Xh[o]();for(let c of s.skills)await Jh(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,qc,tj,Hh,rj,nj,dn,Xh,Hc=T(()=>{"use strict";Ue();Cc();yt();cs();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},qc=/^https?:\/\//i,tj=8e3,Hh=1e6,rj=new Set(["opencode"]),nj=t=>JSON.stringify(t),dn=()=>process.env.HOME??Qx();Xh={claude:()=>et(dn(),".claude","skills"),qwen:()=>et(dn(),".qwen","skills"),codex:()=>et(dn(),".codex","skills"),copilot:()=>et(dn(),".copilot","skills")}});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function x(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function B(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1491
1491
|
`)}function w(t,e){return t.stderr.write(`error: ${e}
|
|
1492
1492
|
`),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
1493
1493
|
`),2}var ke=T(()=>{"use strict";Ue();Ye()});var t_={};le(t_,{defaultTeamNameForProject:()=>Rj,resolveAlias:()=>wi,resolveProject:()=>_i,resolveTeam:()=>gi,runCode:()=>_j});import{execFileSync as pj}from"node:child_process";import{basename as hj,resolve as zh}from"node:path";import*as Xc from"node:readline";import{setTimeout as Jc}from"node:timers/promises";async function _j(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return gj(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Qh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return Ij(e);try{return await L(e,async s=>{switch(r){case"team":return wj(n,e,s);case"chat":return Sj(n,e,s);case"spec":return kj(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function gj(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
|
|
1494
1494
|
`)),0}function wj(t,e,r){let[n,...s]=t;switch(n){case"add":return yj(s,e,r);case"list":return Ej(s,e,r);case"show":return bj(s,e,r);case"rm":return Tj(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function yj(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=x(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=fn(e,r,x(n,"--project"),x(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?B(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
|
|
1495
|
-
`),0}function Ej(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=fn(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=e_(r.listTeamMembers(s.team.id));if(M(n,"--json"))B(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${
|
|
1495
|
+
`),0}function Ej(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=fn(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=e_(r.listTeamMembers(s.team.id));if(M(n,"--json"))B(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${xe(i)} ${i.sessionid??"(unseeded)"}
|
|
1496
1496
|
`);return 0}function bj(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=fn(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?B(e,i):(e.stdout.write(`member ${i.alias}
|
|
1497
1497
|
`),e.stdout.write(`role: ${i.role}
|
|
1498
|
-
`),e.stdout.write(`provider: ${
|
|
1498
|
+
`),e.stdout.write(`provider: ${xe(i)}
|
|
1499
1499
|
`),e.stdout.write(`model: ${i.model??"(default)"}
|
|
1500
1500
|
`),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
|
|
1501
1501
|
`),e.stdout.write(`sessiondir: ${i.sessiondir}
|
|
@@ -1517,7 +1517,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1517
1517
|
`),0;if(c==="/done")return await ds(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await ds(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function ds(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function xj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Qh(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
|
|
1518
1518
|
`)),0}function jj(t){t.stderr.write(`commands: /help, /exit
|
|
1519
1519
|
`)}function us(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function _i(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=pj("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=zh(s),i=e.listProjects().find(a=>zh(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function gi(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function wi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=e_(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function fn(t,e,r,n){let s=_i(t,e,r);if(typeof s=="number")return s;let o=gi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function e_(t){return t.filter(e=>e.state!=="retired")}async function Aj(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
|
|
1520
|
-
`),Zo(r,e),ei(r);let s=await tn({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=an(
|
|
1520
|
+
`),Zo(r,e),ei(r);let s=await tn({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=an(xe(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
|
|
1521
1521
|
${i}
|
|
1522
1522
|
`),await hi({dal:e,member:o,stderr:t.stderr,baseDir:r.local_path});let a=o.role_prompt??"",l=a.length>0?`${a}
|
|
1523
1523
|
|
|
@@ -1612,7 +1612,7 @@ ${s}`;tR(t,i,"utf8")}function sR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1612
1612
|
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function eg(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function tg(t,e){if(e.length===0)return null;let r=Q_(t,"durable-memory");if(!uR(r))return null;let n;try{n=dR(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=fR(Q_(r,o),"utf8");if(mR(i).some(l=>e.includes(l))){let l=eg(i,"name")??o.replace(".md",""),c=eg(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var rg=T(()=>{"use strict"});function Su(t){let e=t.trim().replace(pR,"").trim();for(let r=0;r<4;r+=1){let n=hR.exec(e);if(n===null)break;e=n[2].trim()}return e}function ng(t){let e=t.trim(),r=_R.exec(e);if(r!==null)return r[2];let n=gR.exec(e);return n!==null?n[0]:null}function _s(t,e){let r=t.split(`
|
|
1613
1613
|
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Su(r[i]),l=bu.exec(a);if(l===null)continue;let c=l[1].trim();if(Tu.test(c))continue;let u=ng(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=Su(r[i]),l=bu.exec(a);if(l===null)break;let c=Tu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function sg(t){let e=t.split(`
|
|
1614
1614
|
`),r=null;for(let n=0;n<e.length;n+=1){let s=Su(e[n]),o=bu.exec(s);if(o===null)continue;let i=o[1].trim();if(Tu.test(i))continue;let a=ng(i);if(a===null||!Xr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var pR,hR,bu,Tu,_R,gR,ku=T(()=>{"use strict";Bn();pR=/^#{1,6}\s+/,hR=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,bu=/^STANCE:\s+(.+)$/,Tu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,_R=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,gR=/^[A-Za-z0-9_-]+/});function og(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var ig=T(()=>{"use strict"});import{readFileSync as wR}from"node:fs";import{dirname as yR,join as ER}from"node:path";import{fileURLToPath as bR}from"node:url";function kR(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function $R(t){let e=[],r=[];for(let n of t)TR.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function xR(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&SR.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function jR(t,e){if(t.length===0)return{matched:!1};let r=$R(t);for(let n of r){let s=xR(n,e);if(s.matched)return s}return{matched:!1}}function vu(t){return jR(t,NR)}function AR(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Iu(t){return AR(t).split(" ").filter(e=>e.length>0)}var TR,SR,vR,IR,NR,ag=T(()=>{"use strict";TR=new Set(["&&","||",";","|",">",">>","<","<<"]),SR=/^[A-Za-z_][A-Za-z0-9_]*=/;vR=yR(bR(import.meta.url)),IR=JSON.parse(wR(ER(vR,"side_effect_classifier.json"),"utf-8")),NR=kR(IR)});function Di(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function lg(t,e){try{return await Or(Nu(t)??t,Di(e))===!0}catch{return!1}}async function Pi(t,e){try{return await Or(Nu(t)??t,Di(e))}catch{return}}async function cg(t,e){if(typeof t!="string")return t;let r=Nu(t);if(r===null)return t;try{return await Or(r,Di(e))}catch{return}}async function ug(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=RR(await Or(a,Di(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Nu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function RR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var gs=T(()=>{"use strict";mn()});import{existsSync as dg,readdirSync as fg,readFileSync as OR,statSync as mg}from"node:fs";import{join as Ui}from"node:path";function pg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function G(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function nt(t,e,r,n,s={}){let o=C(),i=G(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ws}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Xr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:so,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:LR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function LR(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
1615
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function hg(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=cr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ke(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=cr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=cr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=CR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return ug(n,e)}function CR(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function cr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ys(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=og(e.dal,e.run_id,()=>o),c=$u(e,r),u={violation:null},d=b=>{if(l(b),u.violation===null&&b.kind==="tool_use"&&b.tool==="Bash"&&b.summary){let E=Iu(b.summary),k=vu(E);k.matched&&!c&&(u.violation={summary:b.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=b=>{d(b),MR(b,(E,k)=>{m+=E,p+=k})},g=await en({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider
|
|
1615
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function hg(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=cr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ke(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=cr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=cr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=CR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return ug(n,e)}function CR(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function cr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ys(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=og(e.dal,e.run_id,()=>o),c=$u(e,r),u={violation:null},d=b=>{if(l(b),u.violation===null&&b.kind==="tool_use"&&b.tool==="Bash"&&b.summary){let E=Iu(b.summary),k=vu(E);k.matched&&!c&&(u.violation={summary:b.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=b=>{d(b),MR(b,(E,k)=>{m+=E,p+=k})},g=await en({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:xe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),DR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&xu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function MR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Fi(s.input_tokens),a=Fi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Fi(o.input_tokens),a=Fi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Fi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Bt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=G(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function En(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=G(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(dm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
|
|
1616
1616
|
|
|
1617
1617
|
`);try{let p=await ys({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=_s(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Te?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function bn(t,e){return(e?.length??0)>0?tg(t.project.local_path,e):null}function _g(t){return vu(Iu(t))}function $u(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
1618
1618
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
@@ -1782,17 +1782,17 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1782
1782
|
AND r.terminal_state IS NOT NULL
|
|
1783
1783
|
ORDER BY r.id DESC
|
|
1784
1784
|
LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,OD).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,Hy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Hy,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function Jy(t){for(let e of CD)try{e(t)}catch{}}var OD,Hy,CD,Xy=T(()=>{"use strict";OD="request_changes",Hy="reviewer_rejection_rate_high";CD=[LD]});function Ns(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Gy(t){let e=t.intervalMs??Ns(),r=t.runOnceFn??Mr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??By)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ky(t.dal,t.monitorSessionActivityFn??hc,e,n).finally(()=>{a=null})),a.finally(()=>u(_c(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=MD(t.dal,r,t.collectSessionSizesFn??Fp,t.scanIntakeFn??wn,t.monitorSessionActivityFn??hc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function MD(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(ww({dal:t}),Jy({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Ky(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Ky(t,e,r,n){let s=_c(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var id=T(()=>{"use strict";ji();vs();Mu();Mo();qy();Xy();gc()});function Vy(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Yy=T(()=>{"use strict"});import{mkdirSync as DD,readFileSync as PD,readdirSync as FD,statSync as UD,writeFileSync as WD}from"node:fs";import{dirname as BD,join as Zy,sep as zy}from"node:path";function _a(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Qy:return qD(t,s.input);case eE:return HD(t,s.input);case tE:return JD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:cd,GetObjectCommand:ld,PutObjectCommand:ad}}}function qD(t,e){let r=rE(t,e.Key);return DD(BD(r),{recursive:!0}),WD(r,e.Body),{}}function HD(t,e){let r=rE(t,e.Key),n;try{n=PD(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function JD(t,e){let r=e.Prefix??"";nE(r);let s=XD(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function rE(t,e){return nE(e),Zy(t,e)}function nE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function XD(t){let e=[],r=(n,s)=>{let o;try{o=FD(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Zy(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=zy==="/"?a:a.split(zy).join("/");e.push({key:c,lastModified:UD(l).mtime})}}};return r(t,""),e}var Qy,eE,tE,ad,ld,cd,ud=T(()=>{"use strict";Qy="localfs-put",eE="localfs-get",tE="localfs-list",ad=class{input;_localfsTag=Qy;constructor(e){this.input=e}},ld=class{input;_localfsTag=eE;constructor(e){this.input=e}},cd=class{input;_localfsTag=tE;constructor(e){this.input=e}}});function sE(){return{put:0,get:0,list:0}}function dd(t,e=GD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function fd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var GD,ga,md=T(()=>{"use strict";GD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ga=class{counts=sE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=sE(),e}estimateCostUsd(e){return dd(this.counts,e)}}});function oE(t){let e=t.now??Date.now,r=t.timers??KD,n=null,s=null;async function o(){let l=e(),c=fd(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=dd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===fd(e())}}}var KD,iE=T(()=>{"use strict";md();KD={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var pd=T(()=>{"use strict";ea();ra();ra()});function VD(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function YD(t){return t.reply_to!==void 0&&t.response!==void 0}function zD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function aE(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var wa,$s,lE=T(()=>{"use strict";pd();wa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},$s=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new wa("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Ht(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(aE(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(aE(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new wa;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=VD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(YD(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??zD(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Ht(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function hd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var cE=T(()=>{"use strict"});function _d(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var uE=T(()=>{"use strict"});function wd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var gd,dE=T(()=>{"use strict";gd="daemon:events"});function mE(t){return{kind:"prompt",prompt_id:t.prompt_id??Ht(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function yd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var fE,Ed=T(()=>{"use strict";pd();fE="prompt:root"});function xs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ZD(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function pE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ZD(t);return r===null?!0:Date.now()/1e3>=r-e}function hE(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var bd=T(()=>{"use strict"});async function ya(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":QD},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var QD,Td=T(()=>{"use strict";QD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as _E,mkdirSync as gE,readFileSync as wE,writeFileSync as yE}from"node:fs";import{homedir as EE}from"node:os";import{dirname as bE,join as TE}from"node:path";function js(){return process.env.LMCTL_DEVICE_AUTH_PATH??TE(EE(),".lmctl","device-auth.json")}function SE(){return process.env.LMCTL_TOKEN_PATH??TE(EE(),".lmctl","cli-tokens.json")}function Sd(t=js()){try{let e=JSON.parse(wE(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function kE(t,e=js()){gE(bE(e),{recursive:!0,mode:448}),yE(e,JSON.stringify(t,null,2));try{_E(e,384)}catch{}}function kd(t,e=SE()){let r={};try{r=JSON.parse(wE(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};gE(bE(e),{recursive:!0,mode:448}),yE(e,JSON.stringify(s,null,2));try{_E(e,384)}catch{}}async function vE(t){let e=t.deviceAuthPath??js(),r=Sd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await ya({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return kd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??SE()),{idToken:n.idToken,userId:r.userId}}var vd=T(()=>{"use strict";Td()});function IE(t){if(t.length===0||!t.startsWith("---"))throw new vt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1785
|
-
`);if(e[0]!=="---")throw new vt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new vt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!eP.has(c))throw new vt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ea.join(", ")}`);r[c]=u}if(n===-1)throw new vt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Ea)if(r[i]===void 0)throw new vt(`missing required frontmatter key "${i}" \u2014 required: ${Ea.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Ea,eP,vt,NE=T(()=>{"use strict";Ea=["title","description","members"],eP=new Set(Ea),vt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as tP,writeFileSync as
|
|
1785
|
+
`);if(e[0]!=="---")throw new vt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new vt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!eP.has(c))throw new vt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ea.join(", ")}`);r[c]=u}if(n===-1)throw new vt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Ea)if(r[i]===void 0)throw new vt(`missing required frontmatter key "${i}" \u2014 required: ${Ea.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Ea,eP,vt,NE=T(()=>{"use strict";Ea=["title","description","members"],eP=new Set(Ea),vt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as tP,writeFileSync as hY,renameSync as _Y,existsSync as xE}from"node:fs";import{basename as rP,resolve as xn,dirname as Id}from"node:path";function sP(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function oP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function iP(t){return/^\s*_SESSION_\s+\S/.test(t)}function aP(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function lP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function ba(t){let e=rP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Le(t){let e=tP(t,"utf-8"),r=Id(xn(t)),n=$d(e,ba(t),{baseDir:r,sourcePath:xn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=xn(r,s.sessiondir));return n}function $d(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
|
|
1786
1786
|
`);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=IE(a)}catch(u){if(u instanceof vt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
|
|
1787
1787
|
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(iP(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(aP(d)){s.push(f);continue}if(lP(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let b=_[0];try{if(new URL(b).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${b}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(b)&&!/^[A-Za-z]:[\\/]/u.test(b)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${b}`);continue}}o.push(b);continue}if(!oP(d))continue;let m=sP(d);for(let g of Object.keys(m))if(!$E.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
|
|
1788
|
-
allowed keys: ${$E.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function xd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Nd.toLowerCase());n.length>1&&r.push({field:Nd,message:`${n.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)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?xn(e,o.teamfile):xn(o.teamfile);if(!xE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Le(a),c=It(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else nP.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function It(t){return t.members.find(e=>e.alias.toLowerCase()===Nd.toLowerCase())}function jd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=xn(e,t.teamfile),i=r??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),!xE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Le(o),l=It(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return jd(l,Id(o),i,n);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||Id(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Ta(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Nd,nP,$E,Jt=T(()=>{"use strict";NE();Nd="Lead",nP=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);$E=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as cP,realpathSync as uP}from"node:fs";import{dirname as dP}from"node:path";function Ad(t){fP(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function fP(t){let e=t.payload.root_teamfile;try{e=uP(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await jn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=mP(e);if("error"in r)return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-_P(t.env??process.env)).toISOString()});if(!s.acquired){let o=hP(r.alias,s.current);return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Dt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function mP(t){if(!cP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Le(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=It(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??dP(t)}}async function jn(t,e){let r=RE(e.message),n=e.response===null?null:RE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function RE(t){return t.length<=jE?{text:t,truncated:!1}:{text:t.slice(0,jE),truncated:!0}}function pP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function hP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:pP(t,e)}function _P(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return AE;let r=Number(e);return!Number.isFinite(r)||r<=0?AE:r}var jE,AE,OE=T(()=>{"use strict";bt();Jt();jE=256*1024,AE=30*60*1e3});import{chmodSync as FE,existsSync as gP,mkdirSync as UE,readFileSync as Ia,writeFileSync as WE}from"node:fs";import{dirname as Rd,resolve as Sa,join as BE}from"node:path";import{fileURLToPath as wP}from"node:url";import{homedir as qE}from"node:os";import{CognitoIdentityClient as yP,GetIdCommand as EP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as LE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as bP,ListObjectsV2Command as TP,PutObjectCommand as SP,S3Client as CE}from"@aws-sdk/client-s3";function Rs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:$P(t.selfUrl),n={},s;for(let $ of r)if(gP($)){n=NP($),s=$;break}let o=(...$)=>{for(let v of $)if(typeof v=="string"&&v!=="")return v},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??kP,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??vP,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??IP,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Na,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=va(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=va(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=va(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),b=va(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...b!==void 0?{chatLogPollIntervalMs:b}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function NP(t){try{let e=Ia(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function $P(t){let e=Rd(wP(t??import.meta.url));return[Sa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Sa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Sa(e,"..","..","..","infra","terraform","terraform.tfstate"),Sa(e,"..","..","infra","terraform","terraform.tfstate")]}function va(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function xP(t){let e=jP(t.intervalMs)??HE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function jP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function JE(t){let e=t.tokenPath??BE(qE(),".lmctl","cli-tokens.json"),r=DE(t.tokenPath);if(pE(r.cognito?.idToken)&&Sd()!==null)try{await vE({region:t.region,clientId:t.cognitoClientId??Na,cliTokensPath:e}),r=DE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let W=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${W}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await PE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=LE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new CE({region:t.region,credentials:a}),c={ListObjectsV2Command:TP,GetObjectCommand:bP,PutObjectCommand:SP},u=xs(n),d=u??o,f=t.deviceId,m=kn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let W=!1,z=0;for(;!W&&z<2;){z+=1;try{let I=Zi(m,"web"),N=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let P=Qi(q.Key??"",m,"web");P!==void 0&&P>N&&(N=P)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),W=!0}catch(I){let N=I instanceof Error?I.message:String(I);if(i&&z===1&&OP(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),RP(e),i=!1,o=await PE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=LE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new CE({region:t.region,credentials:a}),m=kn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,b=t.persistentSessionManager,E=t.promptTriggerStore,k=new ga,$=new Dr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&hd(R.payload)){_.onInbound(R.payload);return}if(b!==void 0&&_d(R.payload)){await b.onInbound(R.payload);return}if(!wd(R.payload)){if(E!==void 0&&yd(R.payload)){Ad({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new $s({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),b!==void 0&&b.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let v=R=>$.putMessage({conversation_id:gd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:xP({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??HE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let F=t.deviceId??o,U=`${d}/usage/`,J;return J=t.usageStore===void 0?void 0:oE({meter:k,store:t.usageStore,userId:d,deviceId:F,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:W,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${W.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),J?.stop()},publishOwnRollup:async(R,W)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${F}-${R}.json`,Body:JSON.stringify({...W,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let W={put:0,get:0,list:0},z;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${R}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));W.put+=q.put??0,W.get+=q.get??0,W.list+=q.list??0}catch{}}z=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(z!==void 0);return W},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:v,async stop(){A?.stop(),J!==void 0&&(await J.flushNow().catch(()=>{}),J.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function XE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:_a(t.rootDir),r=kn({identityId:As,userId:As,deviceId:ME}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:ME,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&hd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&_d(c.payload)){await o.onInbound(c.payload);return}if(!wd(c.payload)){if(i!==void 0&&yd(c.payload)){Ad({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ka,readIntervalMs:t.readIntervalMs??ka,heartbeatIdleMs:t.heartbeatIdleMs??ka,backoffReadIntervalMs:t.backoffReadIntervalMs??ka});n=new $s({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:gd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function DE(t){let e=t??BE(qE(),".lmctl","cli-tokens.json");try{let r=Ia(e,"utf8");return JSON.parse(r)}catch{return{}}}function AP(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ia(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};UE(Rd(t),{recursive:!0,mode:448}),WE(t,JSON.stringify(n,null,2));try{FE(t,384)}catch{}}function RP(t){let e={};try{let n=Ia(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,UE(Rd(t),{recursive:!0,mode:448}),WE(t,JSON.stringify(r,null,2));try{FE(t,384)}catch{}}async function PE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new yP({region:t.region}).send(new EP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{AP(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function OP(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var HE,ka,Na,kP,vP,IP,As,ME,Od=T(()=>{"use strict";na();ud();md();iE();lE();cE();uE();dE();Ed();ea();bd();vd();OE();HE=3e3,ka=1e3,Na="79u5jhkk46qofog661c9i0bdcs",kP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",vP="us-east-1_4iUdFggDn",IP="lmctl-next-preview-mailbox-254332045686";As="local",ME="local"});import{spawn as Dd}from"node:child_process";import{createInterface as GE}from"node:readline";var Ld,Cd,Md,KE,VE=T(()=>{"use strict";go();Ne();Ld=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Dd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=GE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
|
|
1788
|
+
allowed keys: ${$E.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function xd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Nd.toLowerCase());n.length>1&&r.push({field:Nd,message:`${n.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)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?xn(e,o.teamfile):xn(o.teamfile);if(!xE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Le(a),c=It(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else nP.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function It(t){return t.members.find(e=>e.alias.toLowerCase()===Nd.toLowerCase())}function jd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=xn(e,t.teamfile),i=r??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),!xE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Le(o),l=It(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return jd(l,Id(o),i,n);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||Id(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Ta(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Nd,nP,$E,Jt=T(()=>{"use strict";NE();Nd="Lead",nP=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);$E=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as cP,realpathSync as uP}from"node:fs";import{dirname as dP}from"node:path";function Ad(t){fP(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function fP(t){let e=t.payload.root_teamfile;try{e=uP(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await jn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=mP(e);if("error"in r)return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-_P(t.env??process.env)).toISOString()});if(!s.acquired){let o=hP(r.alias,s.current);return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Dt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await jn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function mP(t){if(!cP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Le(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=It(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??dP(t)}}async function jn(t,e){let r=RE(e.message),n=e.response===null?null:RE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function RE(t){return t.length<=jE?{text:t,truncated:!1}:{text:t.slice(0,jE),truncated:!0}}function pP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function hP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:pP(t,e)}function _P(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return AE;let r=Number(e);return!Number.isFinite(r)||r<=0?AE:r}var jE,AE,OE=T(()=>{"use strict";bt();Jt();jE=256*1024,AE=30*60*1e3});import{chmodSync as FE,existsSync as gP,mkdirSync as UE,readFileSync as Ia,writeFileSync as WE}from"node:fs";import{dirname as Rd,resolve as Sa,join as BE}from"node:path";import{fileURLToPath as wP}from"node:url";import{homedir as qE}from"node:os";import{CognitoIdentityClient as yP,GetIdCommand as EP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as LE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as bP,ListObjectsV2Command as TP,PutObjectCommand as SP,S3Client as CE}from"@aws-sdk/client-s3";function Rs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:$P(t.selfUrl),n={},s;for(let $ of r)if(gP($)){n=NP($),s=$;break}let o=(...$)=>{for(let v of $)if(typeof v=="string"&&v!=="")return v},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??kP,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??vP,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??IP,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Na,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=va(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=va(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=va(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),b=va(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...b!==void 0?{chatLogPollIntervalMs:b}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function NP(t){try{let e=Ia(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function $P(t){let e=Rd(wP(t??import.meta.url));return[Sa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Sa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Sa(e,"..","..","..","infra","terraform","terraform.tfstate"),Sa(e,"..","..","infra","terraform","terraform.tfstate")]}function va(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function xP(t){let e=jP(t.intervalMs)??HE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function jP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function JE(t){let e=t.tokenPath??BE(qE(),".lmctl","cli-tokens.json"),r=DE(t.tokenPath);if(pE(r.cognito?.idToken)&&Sd()!==null)try{await vE({region:t.region,clientId:t.cognitoClientId??Na,cliTokensPath:e}),r=DE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let W=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${W}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await PE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=LE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new CE({region:t.region,credentials:a}),c={ListObjectsV2Command:TP,GetObjectCommand:bP,PutObjectCommand:SP},u=xs(n),d=u??o,f=t.deviceId,m=kn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let W=!1,z=0;for(;!W&&z<2;){z+=1;try{let I=Zi(m,"web"),N=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let P=Qi(q.Key??"",m,"web");P!==void 0&&P>N&&(N=P)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),W=!0}catch(I){let N=I instanceof Error?I.message:String(I);if(i&&z===1&&OP(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),RP(e),i=!1,o=await PE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=LE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new CE({region:t.region,credentials:a}),m=kn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,b=t.persistentSessionManager,E=t.promptTriggerStore,k=new ga,$=new Dr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&hd(R.payload)){_.onInbound(R.payload);return}if(b!==void 0&&_d(R.payload)){await b.onInbound(R.payload);return}if(!wd(R.payload)){if(E!==void 0&&yd(R.payload)){Ad({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new $s({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),b!==void 0&&b.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let v=R=>$.putMessage({conversation_id:gd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:xP({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??HE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let F=t.deviceId??o,U=`${d}/usage/`,J;return J=t.usageStore===void 0?void 0:oE({meter:k,store:t.usageStore,userId:d,deviceId:F,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:W,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${W.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),J?.stop()},publishOwnRollup:async(R,W)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${F}-${R}.json`,Body:JSON.stringify({...W,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let W={put:0,get:0,list:0},z;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${R}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));W.put+=q.put??0,W.get+=q.get??0,W.list+=q.list??0}catch{}}z=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(z!==void 0);return W},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:v,async stop(){A?.stop(),J!==void 0&&(await J.flushNow().catch(()=>{}),J.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function XE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:_a(t.rootDir),r=kn({identityId:As,userId:As,deviceId:ME}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:ME,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&hd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&_d(c.payload)){await o.onInbound(c.payload);return}if(!wd(c.payload)){if(i!==void 0&&yd(c.payload)){Ad({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ka,readIntervalMs:t.readIntervalMs??ka,heartbeatIdleMs:t.heartbeatIdleMs??ka,backoffReadIntervalMs:t.backoffReadIntervalMs??ka});n=new $s({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:gd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function DE(t){let e=t??BE(qE(),".lmctl","cli-tokens.json");try{let r=Ia(e,"utf8");return JSON.parse(r)}catch{return{}}}function AP(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ia(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};UE(Rd(t),{recursive:!0,mode:448}),WE(t,JSON.stringify(n,null,2));try{FE(t,384)}catch{}}function RP(t){let e={};try{let n=Ia(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,UE(Rd(t),{recursive:!0,mode:448}),WE(t,JSON.stringify(r,null,2));try{FE(t,384)}catch{}}async function PE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new yP({region:t.region}).send(new EP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{AP(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function OP(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var HE,ka,Na,kP,vP,IP,As,ME,Od=T(()=>{"use strict";na();ud();md();iE();lE();cE();uE();dE();Ed();ea();bd();vd();OE();HE=3e3,ka=1e3,Na="79u5jhkk46qofog661c9i0bdcs",kP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",vP="us-east-1_4iUdFggDn",IP="lmctl-next-preview-mailbox-254332045686";As="local",ME="local"});import{spawn as Dd}from"node:child_process";import{createInterface as GE}from"node:readline";var Ld,Cd,Md,KE,VE=T(()=>{"use strict";go();$e();Ld=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Dd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=GE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
|
|
1789
1789
|
`)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
|
|
1790
1790
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Cd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Dd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
|
|
1791
1791
|
`);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
|
|
1792
1792
|
`)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Md=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{_o(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Dd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=GE({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
|
|
1793
1793
|
`)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
|
|
1794
1794
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
|
|
1795
|
-
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},KE=t=>{switch(t){case"codex":return new Ld;case"claude":case"qwen":return new Cd;case"gemini":case"copilot":case"opencode":return new Md;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as LP}from"node:crypto";import{existsSync as
|
|
1795
|
+
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},KE=t=>{switch(t){case"codex":return new Ld;case"claude":case"qwen":return new Cd;case"gemini":case"copilot":case"opencode":return new Md;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as LP}from"node:crypto";import{existsSync as QY,mkdirSync as CP,readFileSync as MP,writeFileSync as DP}from"node:fs";import{homedir as PP}from"node:os";import{dirname as FP,join as UP}from"node:path";function $a(){return process.env.LMCTL_DEVICE_FILE??UP(PP(),".lmctl","device.json")}function Pr(t=$a()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(MP(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Pd(t=$a()){let e=Pr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:LP(),created_at:new Date().toISOString()};return CP(FP(t),{recursive:!0}),DP(t,`${JSON.stringify(r,null,2)}
|
|
1796
1796
|
`,{encoding:"utf8",mode:384}),r}var Fd=T(()=>{"use strict"});import*as YE from"node:child_process";function BP(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Ud(t,e={}){let r=e.spawnSync===void 0&&process.env[qP]==="1",n=e.spawnSync??YE.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=xa[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=BP(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function zE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(xa).join(", ")})`;let e=WP[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var xa,WP,qP,ZE=T(()=>{"use strict";xa={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},WP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};qP="LMCTL_SKIP_BINARY_CHECK"});var lb={};le(lb,{ProviderBinaryPreflightError:()=>ja,__setProviderBinaryCheckForTest:()=>ZP,bootstrapAgentRestMailbox:()=>tb,publishRegisteredWorkflowsOnStart:()=>eb,resolveLocalMailboxDir:()=>ib,resolveLocalWebuiDir:()=>ob,resolveServeConfig:()=>rb,runProviderBinaryPreflight:()=>sb,runServe:()=>KP,validateServeArgs:()=>ab});import{randomBytes as HP}from"node:crypto";import{existsSync as JP}from"node:fs";import{homedir as XP}from"node:os";import{isAbsolute as QE,resolve as Wd}from"node:path";async function KP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(GP),0;let r=ab(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1797
1797
|
`),2;try{sb(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:QP(t)},o;try{o=rb({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
1798
1798
|
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Vy(n);let i;if(r.localWebui!==void 0){let E=ob(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=ib(process.env),{s3:$,commands:v}=_a(k);i={webuiDir:E,rootDir:k,s3:$,commands:v},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
|
|
@@ -1825,7 +1825,7 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1825
1825
|
|
|
1826
1826
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1827
1827
|
intake settings such as enabled state, labels, and issue state filters.
|
|
1828
|
-
`});import{createHash as o1}from"node:crypto";import{existsSync as Os,mkdirSync as i1,readFileSync as pb,realpathSync as a1,writeFileSync as l1}from"node:fs";import{basename as fb,dirname as hb,resolve as _b}from"node:path";function
|
|
1828
|
+
`});import{createHash as o1}from"node:crypto";import{existsSync as Os,mkdirSync as i1,readFileSync as pb,realpathSync as a1,writeFileSync as l1}from"node:fs";import{basename as fb,dirname as hb,resolve as _b}from"node:path";function Ne(t,e){let r=_b(t);if(Os(r))return a1(r);if(e!==void 0){let n=d1(t,r,e);if(n!==null)return n}return r}function mb(t,e){let r=hb(e),n=$d(t,ba(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=_b(r,s.sessiondir));return n}function Fr(t,e){let r=Ne(t,u1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Os(r)&&"upsertRootTeam"in e&&(i1(hb(r),{recursive:!0}),l1(r,n.raw_text,"utf8")),mb(n.raw_text,r);if(Os(r)){let s=pb(r,"utf8"),o=mb(s,r);return"upsertRootTeam"in e&&f1(o)&&m1(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Os(r))throw new Error(`teamfile not found: ${t}`);return Le(r)}function gb(t,e,r){let n=Ne(t,e),s=e.getRootTeam(n);s===null||!Os(n)||pb(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function u1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function d1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=fb(t),o=ba(t),i=r.listRootTeams().filter(l=>fb(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function f1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=c1)}function m1(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:o1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var c1,mr=T(()=>{"use strict";Jt();c1=5});import{existsSync as p1}from"node:fs";import{dirname as wb}from"node:path";function g1(t){return h1.test(t)||_1.test(t)}function yb(t){return Aa.test(t)}function Ls(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Aa.test(n)?null:{teamfile:r,alias:n}}function Nt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!yb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Aa.source}).`);let n=Ne(t,r);if(r===void 0&&!p1(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=Fr(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Ta(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
|
|
1829
1829
|
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=jd(o,wb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
|
|
1830
1830
|
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??wb(n),isLead:It(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function pr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Ls(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?yb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Aa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
1831
1831
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(g1(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
|
|
@@ -1833,9 +1833,9 @@ intake settings such as enabled state, labels, and issue state filters.
|
|
|
1833
1833
|
Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
|
|
1834
1834
|
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,h1,_1,Aa,Ur=T(()=>{"use strict";Jt();mr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},h1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,_1=/^ses_[A-Za-z0-9_-]+$/,Aa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Tb(t){let e=Eb(t.registry,t.fromTeamfile);if(e===void 0)return An(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!bb(e,t.fromAlias))return An(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=Eb(t.registry,t.toTeamfile);return r===void 0?An(`target team is not registered in policy graph: ${t.toTeamfile}`):bb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?An(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?An(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:An(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function Eb(t,e){return t.teams.find(r=>r.teamfile===e)}function bb(t,e){return t.aliases.some(r=>r===e)}function An(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Sb=T(()=>{"use strict"});import{basename as w1}from"node:path";function Ib(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=xb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=b1(e.sender,n),o=T1(e.sender,n);o!==null&&o.teamfile===e.root&&!vb(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>vb(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<y1;return{stop:l.length>=1&&u,chain:S1(a)}}function Nb(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=xb(t,r),s=jb(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Ra(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return kb;let r=Number(e);return!Number.isFinite(r)||r<=0?kb:r}function $b(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function E1(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function xb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(E1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function b1(t,e,r={}){let n=new Map;for(let a of e)n.set(Wr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Wr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Wr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Wr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function jb(t,e){let r=Wr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Wr(l.sender),u=Wr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function T1(t,e){let r=jb(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function vb(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Wr(t){return`${t.teamfile}\0${t.alias}`}function S1(t){return t.map(e=>`${w1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var y1,kb,Ab=T(()=>{"use strict";y1=6e4,kb=8*60*60*1e3});async function Lb(t){let e=Cb(t.io,()=>{}),r=await L(e,i=>Nt(t.teamfile,t.alias,i)),n=r.teamfile,s=t.fromFlag!==void 0?await L(e,i=>Mb(t.fromFlag,n,i)):await j1(e,t.selfSessionId,n),o=await Db(e,{explicitRoot:t.rootFlag,sender:s,receiverTeamfile:n,operatorOrigin:s.alias==="operator"});return{teamfile:n,alias:r.alias,fromIdentity:`${s.teamfile}:${s.alias}`,rootTeamfile:o}}async function Cs(t){let e=t.onEvent??(()=>{}),r=Cb(t.io,e),n=null,s=null,o=null;try{let i=await L(r,$=>Nt(t.teamfile,t.alias,$)),a=i.teamfile,l=await L(r,$=>Mb(t.fromFlag,a,$)),c=await Db(r,{explicitRoot:t.rootFlag,sender:l,receiverTeamfile:a,operatorOrigin:t.fromFlag===void 0}),u=t.fromFlag===void 0?null:await A1(r,{rootTeamfile:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias});u!==null&&!u.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${u.reason}
|
|
1835
1835
|
`}),ui(r,i.isLead,i.alias,i.provider,i.sessiondir);try{di(r,Le(a),a)}catch{}if(n={root_teamfile:c,sender_teamfile:l.teamfile,sender_alias:l.alias,receiver_teamfile:a,receiver_alias:i.alias,policy:u},t.fromFlag!==void 0&&l.teamfile!==a){let $=await L(r,v=>Ib(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=$b($.chain),A=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:v});return{status:"error",errorKind:"cycle",message:v,teamChatLogId:A}}}let d=await L1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=P1(i.alias,d.current),v=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:$});return{status:"busy",message:$,teamChatLogId:v}}s=d.lease,i.isLead&&(o={teamfile:a,alias:i.alias,identity:`${a}:${i.alias}`,env:t.env});let f=!1,m=we(),p=0,h=0,g=0,_={provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:$=>{f=!0,m&&(p+=1,g=Buffer.byteLength($,"utf8"),h+=g),e({kind:"delta",chunk:$})},onProgress:$=>e({kind:"progress",alias:i.alias,event:$})};i.model!==void 0&&(_.model=i.model),i.effort!==void 0&&(_.effort=i.effort),_.alias=i.alias,_.isLead=i.isLead,t.idleTimeoutMs!==void 0&&(_.timeoutMs=t.idleTimeoutMs);let b=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(b.text,"utf8"),lastChunkBytes:g,tailPreview:x1(b.text,200)}));let E=b.status==="stalled",k=await La(r,{...n,message:t.prompt,response:E?null:b.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":E?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:E?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:null});return{status:E?"stalled":"ok",replyText:b.text,wroteDelta:f,teamChatLogId:k,durationMs:b.durationMs}}catch(i){let a=i instanceof Error?i.message:String(i),l=n===null?null:await La(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${a}`:a});return{status:"error",errorKind:i instanceof ge?"target":"provider",message:a,teamChatLogId:l}}finally{s!==null&&await D1(r,s),o!==null&&t.skipAutoDelivery!==!0&&await k1(r,o,t.autoDeliverySender??I1)}}async function k1(t,e,r){try{let n=await L(t,s=>s.claimDeliverableDelegationJobs(e.identity));if(n.length===0)return;for(let s of v1(n))try{await r({teamfile:e.teamfile,alias:e.alias,prompt:N1(s.jobs),fromFlag:`${s.teamfile}:${s.alias}`,io:t,env:e.env})}catch{}}catch{}}function v1(t){let e=new Map;for(let r of t){let n=`${r.teamfile}\0${r.alias}`,s=e.get(n);s===void 0&&(s={teamfile:r.teamfile,alias:r.alias,jobs:[]},e.set(n,s)),s.jobs.push(r)}return[...e.values()]}async function I1(t){let e=await Cs({teamfile:t.teamfile,alias:t.alias,prompt:t.prompt,fromFlag:t.fromFlag,permissionMode:"yolo",io:t.io,env:t.env,skipAutoDelivery:!0});if(e.status!=="ok"&&e.status!=="stalled")throw new Error(e.status==="busy"||e.status==="error"?e.message:"delivery failed")}function N1(t){return["Background delegation results:",...t.map(r=>`[background job ${r.id} to ${r.alias}: ${r.status}] ${$1(r)} (full: lmctl jobs show ${r.id})`),"","These results were marked delivered; use lmctl jobs for the full timeline."].join(`
|
|
1836
|
-
`)}function $1(t){let r=(t.status==="done"?t.result_text??"(no result)":t.error??t.result_text??t.status).replace(/\s+/gu," ").trim();return r.length<=500?r:`${r.slice(0,497)}...`}function Cb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function x1(t,e){return t.slice(-e)}function Mb(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ls(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=
|
|
1836
|
+
`)}function $1(t){let r=(t.status==="done"?t.result_text??"(no result)":t.error??t.result_text??t.status).replace(/\s+/gu," ").trim();return r.length<=500?r:`${r.slice(0,497)}...`}function Cb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function x1(t,e){return t.slice(-e)}function Mb(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ls(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Ne(n.teamfile,r),o=Fr(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=Ta(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function j1(t,e,r){if(e===void 0||e.length===0)return{teamfile:r,alias:"operator"};let n=await L(t,o=>{let i=[];for(let a of o.listRootTeams()){let l=Fr(a.teamfile_path,o);for(let c of l.members)c.teamfile===void 0&&c.session===e&&i.push({teamfile:a.teamfile_path,alias:c.alias})}if(i.length===0){let a=Fr(r,o);for(let l of a.members)l.teamfile===void 0&&l.session===e&&i.push({teamfile:r,alias:l.alias})}return i});if(n.length===0)return{teamfile:r,alias:"operator"};let s=new Map(n.map(o=>[`${o.teamfile}:${o.alias}`,o]));if(s.size>1)throw new ge("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return[...s.values()][0]}async function Db(t,e){return e.explicitRoot!==void 0?await L(t,r=>Ne(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await L(t,r=>Nb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function A1(t,e){return await L(t,r=>Tb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:R1(r,e.sender.teamfile,e.receiverTeamfile)}))}function R1(t,e,r){return{teams:[e,r].map(s=>O1(s,t))}}function O1(t,e){let r=Fr(t,e),n=It(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function L1(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Ra()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await L(t,o=>{let i=we(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Oa(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&C1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Oa(l.current)})),{acquired:!0,lease:c.current??s}):(i&&Je(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:Oa(c.current)})),{acquired:!1,current:c.current})}return i&&Je(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:Oa(l.current)})),{acquired:!1,current:l.current}})}function Oa(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}}function C1(t,e){return t.holder_pid===null?t.started_at<e:!M1(t.holder_pid)}function M1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function D1(t,e){try{await L(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
1837
1837
|
`)}}function P1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function La(t,e){let r=Ob(e.message),n=e.response===null?null:Ob(e.response);try{return await L(t,s=>s.insertTeamChatLog({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,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
1838
|
-
`),null}}function Ob(t){return t.length<=Rb?{text:t,truncated:!1}:{text:t.slice(0,Rb),truncated:!0}}var Rb,Bd=T(()=>{"use strict";bt();Ur();Jt();cs();Sb();mr();Ab()
|
|
1838
|
+
`),null}}function Ob(t){return t.length<=Rb?{text:t,truncated:!1}:{text:t.slice(0,Rb),truncated:!0}}var Rb,Bd=T(()=>{"use strict";bt();Ur();Jt();cs();Sb();mr();Ab();$e();ke();Rb=256*1024});var Bb={};le(Bb,{parseIdleTimeoutMs:()=>Fb,runChat:()=>W1});import{spawn as F1}from"node:child_process";async function W1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Pb}
|
|
1839
1839
|
`),t.length===0?2:0;let r=B1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1840
1840
|
${Pb}
|
|
1841
1841
|
`),2;if(r.runFlag!==void 0){let u=Number.parseInt(r.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
|
|
@@ -1872,7 +1872,7 @@ ${Pb}
|
|
|
1872
1872
|
`),1}}function B1(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1,d=!1;for(let g=0;g<t.length;g+=1){let _=t[g];if(_==="--permission-mode"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --permission-mode";if(b!=="plan"&&b!=="yolo")return`--permission-mode must be one of plan|yolo (got "${b}")`;r=b;continue}if(_==="--idle-timeout"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --idle-timeout";let E=Fb(b);if(typeof E=="string")return E;n=E;continue}if(_==="--session"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --session";s=b;continue}if(_==="--provider"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --provider";o=b;continue}if(_==="--from"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --from";i=b;continue}if(_==="--root"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --root";a=b;continue}if(_==="--force"){l=!0;continue}if(_==="--run"){let b=t[++g];if(b===void 0||b.startsWith("--"))return"missing value for --run";c=b;continue}if(_==="--done"){u=!0;continue}if(_==="--detach"){d=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;e.push(_)}if(c!==void 0)return d?"--run is mutually exclusive with --detach":s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let f,m,p;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=e[0]}else if(e.length===2)f=e[0],p=e[1];else if(e.length===3)f=e[0],m=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";if(d&&l)return"--force is not allowed with --detach";let h={prompt:p,permissionMode:r};return f!==void 0&&(h.target=f),m!==void 0&&(h.alias=m),n!==void 0&&(h.idleTimeoutMs=n),s!==void 0&&(h.sessionFlag=s),o!==void 0&&(h.providerFlag=o),i!==void 0&&(h.fromFlag=i),a!==void 0&&(h.rootFlag=a),l&&(h.force=!0),d&&(h.detach=!0),h}function Fb(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Ub(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
1873
1873
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
1874
1874
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
1875
|
-
`)}function q1(t,e){return t.slice(-e)}function H1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Ub(t,e.alias,e.event):t.stderr.write(e.message)}function J1(t){Wb();let e=process.argv[1];F1(process.execPath,[e,"jobs","run",String(t)],{detached:!0,stdio:"ignore",env:process.env}).unref()}function Wb(){let t=process.argv[1];if(t===void 0||t.length===0)throw new Error("cannot start detached worker: CLI entrypoint is unavailable")}var U1,Pb,qb=T(()=>{"use strict";bt();ke();Ur();Bd()
|
|
1875
|
+
`)}function q1(t,e){return t.slice(-e)}function H1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Ub(t,e.alias,e.event):t.stderr.write(e.message)}function J1(t){Wb();let e=process.argv[1];F1(process.execPath,[e,"jobs","run",String(t)],{detached:!0,stdio:"ignore",env:process.env}).unref()}function Wb(){let t=process.argv[1];if(t===void 0||t.length===0)throw new Error("cannot start detached worker: CLI entrypoint is unavailable")}var U1,Pb,qb=T(()=>{"use strict";bt();ke();Ur();Bd();$e();yt();ua();Pt();U1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Pb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
1876
1876
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
1877
1877
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
1878
1878
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -1881,7 +1881,7 @@ ${Pb}
|
|
|
1881
1881
|
[--from <teamfile>:<alias>] [--root <teamfile>] [--force]
|
|
1882
1882
|
|
|
1883
1883
|
Send a prompt to a team member or raw provider session, or answer a paused run.`});var Yb={};le(Yb,{applyMaxBytes:()=>hr,renderMessage:()=>Kb,runTail:()=>Y1});async function Y1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${V1}
|
|
1884
|
-
`),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--lines"),s=x(r,"--max-bytes");if(n!==void 0&&s!==void 0)return w(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return w(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?G1:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return w(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=M(r,"--watch"),a=x(r,"--watch-interval"),l=a===void 0?K1:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return w(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=x(r,"--run");if(c!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return w(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await L(e,async p=>z1(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=pr(X1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(u.mode==="error")return w(e,u.message);if(u.mode==="managed")return w(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await L(e,g=>
|
|
1884
|
+
`),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--lines"),s=x(r,"--max-bytes");if(n!==void 0&&s!==void 0)return w(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return w(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?G1:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return w(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=M(r,"--watch"),a=x(r,"--watch-interval"),l=a===void 0?K1:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return w(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=x(r,"--run");if(c!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return w(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await L(e,async p=>z1(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=pr(X1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(u.mode==="error")return w(e,u.message);if(u.mode==="managed")return w(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await L(e,g=>Ne(u.teamfile,g))}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Le(m)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=It(p);if(h===void 0)return w(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await L(e,_=>Nt(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?w(e,g.message):me(e,g)}}else try{let m=await L(e,p=>Nt(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?w(e,m.message):me(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await ri(m);if(h.length===0)return w(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return w(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await Hb(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await Hb(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
1885
1885
|
`)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function Hb(t,e,r,n,s){let o;try{o=await Rr(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
1886
1886
|
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
1887
1887
|
`),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${Kb(i[c])}
|
|
@@ -1900,45 +1900,47 @@ ${i.map(a=>` ${a}`).join(`
|
|
|
1900
1900
|
|
|
1901
1901
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
1902
1902
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Jb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
1903
|
-
`});var rT={};le(rT,{runJobs:()=>
|
|
1904
|
-
${zb}`),2)}async function Hd(t,e){let r=D(t,["--team","--from","--status","--limit"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unexpected positional: ${r.positionals[0]}`);let n=x(r,"--status");if(n!==void 0&&!
|
|
1903
|
+
`});var rT={};le(rT,{runJobs:()=>oF});import{readdirSync as Z1}from"node:fs";import{join as Q1}from"node:path";async function oF(t,e={stdout:process.stdout,stderr:process.stderr}){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(zb),0):r===void 0?Hd([],e):r.startsWith("--")?Hd(t,e):r==="list"?Hd(n,e):r==="watch"?cF(n,e):r==="show"?aF(n,e):r==="cancel"?lF(n,e):r==="run"?wF(n,e):(e.stderr.write(`error: unknown jobs subcommand: ${r}
|
|
1904
|
+
${zb}`),2)}async function Hd(t,e){let r=D(t,["--team","--from","--status","--limit"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unexpected positional: ${r.positionals[0]}`);let n=x(r,"--status");if(n!==void 0&&!sF.has(n))return w(e,`invalid --status "${n}" (expected pending|running|done|error|busy|cancelled)`);let s=n,o=x(r,"--limit"),i=o===void 0?void 0:uF(o,"--limit");return typeof i=="string"?w(e,i):await L(e,async a=>{let l,c=x(r,"--team");if(c!==void 0)try{l=await Ne(c,a)}catch(d){return w(e,`jobs list: ${d instanceof Error?d.message:String(d)}`)}else l=iF(a,e.cwd??process.cwd());let u=a.listDelegationJobs({...l!==void 0?{teamfile:l}:{},...x(r,"--from")!==void 0?{from:x(r,"--from")}:{},...s!==void 0?{status:s}:{},...typeof i=="number"?{limit:i}:{}});return M(r,"--json")?B(e,u):e.stdout.write(fF(u)),0})}function iF(t,e){let r;try{r=Z1(e,{withFileTypes:!0}).filter(n=>(n.isFile()||n.isSymbolicLink())&&n.name.endsWith(".lmctl")).map(n=>n.name)}catch{return}if(r.length===1)return Ne(Q1(e,r[0]),t)}async function aF(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==1)return w(e,"usage: lmctl jobs show <id> [--json]");let n=Jd(r.positionals[0]);return typeof n=="string"?w(e,n):await L(e,s=>{let o=s.getDelegationJob(n);if(o===null)return w(e,`job ${n}: not found`);let i=s.listDelegationEvents(n);return M(r,"--json")?B(e,{...o,event_count:i.length}):e.stdout.write(mF(o,i.length)),0})}async function lF(t,e){let r=D(t,[],[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==1)return w(e,"usage: lmctl jobs cancel <id>");let n=Jd(r.positionals[0]);return typeof n=="string"?w(e,n):await L(e,s=>{let o=s.getDelegationJob(n);if(o===null)return w(e,`job ${n}: not found`);let i=s.cancelDelegationJob(n);return o.status==="pending"&&i.status==="cancelled"?e.stdout.write(`job ${n} cancelled before it ran
|
|
1905
1905
|
`):o.status==="running"&&i.status==="cancelled"?e.stdout.write(`job ${n} marked cancelled; running provider turn cannot be aborted and its result will be discarded
|
|
1906
1906
|
`):e.stdout.write(`job ${n} already ${o.status}; not cancelled
|
|
1907
|
-
`),0})}async function
|
|
1907
|
+
`),0})}async function cF(t,e){let r=D(t,["--max-bytes"],["--once"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==1)return w(e,"usage: lmctl jobs watch <id> [--once] [--max-bytes N]");let n=Jd(r.positionals[0]);if(typeof n=="string")return w(e,n);let s=x(r,"--max-bytes"),o=s===void 0?rF:dF(s,"--max-bytes");return typeof o=="string"?w(e,o):await L(e,async i=>{if(i.getDelegationJob(n)===null)return w(e,`job ${n}: not found`);let l=Zb(e,i.listDelegationEvents(n),0,o),c=i.getDelegationJob(n);return eT(c.status)?(Qb(e,c,o),0):M(r,"--once")?0:await new Promise(u=>{let f=setInterval(()=>{try{let p=i.listDelegationEvents(n,l);l=Zb(e,p,l,o);let h=i.getDelegationJob(n);if(h===null){e.stderr.write(`error: job ${n}: not found
|
|
1908
1908
|
`),clearInterval(f),u(1);return}eT(h.status)&&(Qb(e,h,o),clearInterval(f),u(0))}catch(p){e.stderr.write(`jobs watch: ${p instanceof Error?p.message:String(p)}
|
|
1909
|
-
`)}},
|
|
1910
|
-
`;let e=["ID STATUS TO FROM SUBMITTED PROMPT"];for(let r of t)e.push(`${r.id} ${r.status} \u2192 ${r.alias} ${r.from_identity} ${
|
|
1909
|
+
`)}},tF),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)})})}function Jd(t){let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<=0||String(e)!==t?`invalid job id "${t}"`:e}function uF(t,e){let r=Number.parseInt(t,10);return!Number.isFinite(r)||r<1||String(r)!==t?`invalid ${e} "${t}" (expected a positive integer)`:r}function dF(t,e){let r=Number.parseInt(t,10);return!Number.isFinite(r)||r<0||String(r)!==t?`invalid ${e} "${t}" (expected a non-negative integer)`:r}function fF(t){if(t.length===0)return`no delegation jobs
|
|
1910
|
+
`;let e=["ID STATUS TO FROM SUBMITTED PROMPT"];for(let r of t)e.push(`${r.id} ${r.status} \u2192 ${r.alias} ${r.from_identity} ${_F(r.created_at)} ${tT(r.prompt,80)}`);return`${e.join(`
|
|
1911
1911
|
`)}
|
|
1912
|
-
`}function
|
|
1912
|
+
`}function mF(t,e){let r=[`job ${t.id}`,`status: ${t.status}`,`target: ${t.teamfile}:${t.alias}`,`from: ${t.from_identity}`,`root: ${t.root_teamfile}`,`submitted: ${t.created_at}`,`started: ${t.started_at??"(not started)"}`,`ended: ${t.ended_at??"(not ended)"}`,`permission_mode: ${t.permission_mode??"yolo"}`,`idle_timeout_ms: ${t.idle_timeout_ms===null?"(default)":t.idle_timeout_ms}`,`team_chat_log_id: ${t.team_chat_log_id===null?"(none)":t.team_chat_log_id}`,`events: ${e}`,"prompt:",t.prompt];return t.result_text!==null&&r.push("result:",t.result_text),t.error!==null&&r.push("error:",t.error),`${r.join(`
|
|
1913
1913
|
`)}
|
|
1914
|
-
`}function Zb(t,e,r,n){if(e.length===0)return r;let s="",o=r;for(let i of e)s+=`${
|
|
1915
|
-
`,o=i.id;return t.stdout.write(hr(s,n)),o}function
|
|
1914
|
+
`}function Zb(t,e,r,n){if(e.length===0)return r;let s="",o=r;for(let i of e)s+=`${pF(i)}
|
|
1915
|
+
`,o=i.id;return t.stdout.write(hr(s,n)),o}function pF(t){let e=hF(t.payload);return`${gF(t.ts)} ${t.kind}${e===""?"":`: ${e}`}`}function hF(t){try{let e=JSON.parse(t),r=[];for(let n of["alias","message","status","team_chat_log_id","worker_pid"]){let s=e[n];(typeof s=="string"||typeof s=="number"||typeof s=="boolean")&&r.push(`${n}=${String(s)}`)}if(r.length>0)return r.join(" ")}catch{}return tT(t,200)}function Qb(t,e,r){if(e.status==="done"){let n=e.result_text??"";t.stdout.write(hr(`result:
|
|
1916
1916
|
${n}${n.endsWith(`
|
|
1917
1917
|
`)?"":`
|
|
1918
1918
|
`}`,r));return}if(e.status==="error"||e.status==="busy"){t.stdout.write(hr(`${e.status}: ${e.error??"(no detail)"}
|
|
1919
1919
|
`,r));return}e.status==="cancelled"&&t.stdout.write(`cancelled
|
|
1920
|
-
`)}function eT(t){return
|
|
1920
|
+
`)}function eT(t){return nF.has(t)}function tT(t,e){let r=t.replace(/\s+/g," ").trim();return r.length<=e?r:`${r.slice(0,Math.max(0,e-1))}\u2026`}function _F(t){let e=Date.now()-new Date(t).getTime();return Number.isFinite(e)?e<6e4?`${Math.max(0,Math.floor(e/1e3))}s ago`:e<36e5?`${Math.floor(e/6e4)}m ago`:e<864e5?`${Math.floor(e/36e5)}h ago`:`${Math.floor(e/864e5)}d ago`:t}function gF(t){let e=new Date(t);return Number.isNaN(e.getTime())?t:e.toISOString()}async function wF(t,e){if(t.length!==1||t[0]==="--help"||t[0]==="-h")return e.stderr.write(`usage: lmctl jobs run <id>
|
|
1921
1921
|
`),t[0]==="--help"||t[0]==="-h"?0:2;let r=Number.parseInt(t[0],10);if(!Number.isFinite(r)||r<=0||String(r)!==t[0])return e.stderr.write(`error: invalid job id "${t[0]}"
|
|
1922
|
-
`),2;let n=await L(e,o=>o.claimDelegationJob({id:r,worker_id:`pid:${process.pid}`,worker_pid:process.pid,lease_ms:
|
|
1922
|
+
`),2;let n=await L(e,o=>o.claimDelegationJob({id:r,worker_id:`pid:${process.pid}`,worker_pid:process.pid,lease_ms:eF}));if(n===null)return 0;await Ma(e,n.id,"claimed",{worker_pid:process.pid}),await Ma(e,n.id,"provider_started",{teamfile:n.teamfile,alias:n.alias,from:n.from_identity});let s=await Cs({teamfile:n.teamfile,alias:n.alias,prompt:n.prompt,permissionMode:EF(n.permission_mode),rootFlag:n.root_teamfile,...n.idle_timeout_ms!==null?{idleTimeoutMs:n.idle_timeout_ms}:{},...yF(n.from_identity,n.teamfile)?{}:{fromFlag:n.from_identity},io:e,env:process.env,onEvent:o=>bF(e,n.id,o)});return s.status==="ok"?(await Ca(e,n.id,"done",{result_text:s.replyText,team_chat_log_id:s.teamChatLogId,event_kind:"completed",event_payload:{team_chat_log_id:s.teamChatLogId}}),0):s.status==="busy"?(await Ca(e,n.id,"busy",{error:s.message,team_chat_log_id:s.teamChatLogId,event_kind:"busy",event_payload:{message:s.message,team_chat_log_id:s.teamChatLogId}}),0):s.status==="stalled"?(await Ca(e,n.id,"error",{result_text:s.replyText,error:"provider stalled",team_chat_log_id:s.teamChatLogId,event_kind:"error",event_payload:{message:"provider stalled",result_text:s.replyText,team_chat_log_id:s.teamChatLogId}}),0):(await Ca(e,n.id,"error",{error:s.message,team_chat_log_id:s.teamChatLogId,event_kind:"error",event_payload:{message:s.message,team_chat_log_id:s.teamChatLogId}}),0)}function yF(t,e){return t===`${e}:operator`}function EF(t){return t==="plan"?"plan":"yolo"}function bF(t,e,r){r.kind==="progress"?Ma(t,e,"progress",{alias:r.alias,event:r.event}):r.kind==="warning"&&Ma(t,e,"warning",{message:r.message})}async function Ma(t,e,r,n){try{await L(t,s=>{s.insertDelegationEvent(e,r,JSON.stringify(n))})}catch{}}async function Ca(t,e,r,n){await L(t,s=>{s.finalizeDelegationJob(e,r,{result_text:n.result_text??null,error:n.error??null,team_chat_log_id:n.team_chat_log_id??null,event_kind:n.event_kind,event_payload:JSON.stringify(n.event_payload)})})}var zb,eF,tF,rF,nF,sF,nT=T(()=>{"use strict";ke();Bd();mr();qd();zb=`usage: lmctl jobs [list] [--team <teamfile>] [--from <teamfile>:<alias>] [--status <status>] [--limit N] [--json]
|
|
1923
1923
|
lmctl jobs watch <id> [--once] [--max-bytes N]
|
|
1924
1924
|
lmctl jobs show <id> [--json]
|
|
1925
1925
|
lmctl jobs cancel <id>
|
|
1926
1926
|
|
|
1927
1927
|
List, inspect, watch, or cancel tracked background delegations.
|
|
1928
|
+
When --team is omitted, list uses the current directory's only .lmctl file
|
|
1929
|
+
as the team filter when exactly one exists; otherwise it lists all jobs.
|
|
1928
1930
|
Statuses: pending, running, done, error, busy, cancelled.
|
|
1929
1931
|
Cancelling a pending job prevents it from running. Cancelling a running job
|
|
1930
1932
|
marks it cancelled; the provider turn cannot be aborted and its result is discarded.
|
|
1931
|
-
`,
|
|
1932
|
-
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function
|
|
1933
|
-
`}async function iT(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Vd({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await
|
|
1933
|
+
`,eF=8*60*60*1e3,tF=1e3,rF=4096,nF=new Set(["done","error","busy","cancelled"]),sF=new Set(["pending","running","done","error","busy","cancelled"])});var Ms,f6,Xd=T(()=>{"use strict";Ms=[{name:"lmctl_chat",description:'Synchronous/blocking fallback: 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 tracked background delegation for batch or long-running work: `lmctl chat <team.lmctl> <alias> "<prompt>" --detach`, then use `lmctl jobs` or `lmctl jobs watch <id>`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],f6=Ms.length});import{spawn as TF}from"node:child_process";async function oT(t,e,r){let n=kF.get(t);if(n===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 n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return vF(n.name,s)}function vF(t,e){return t==="lmctl_chat"?IF(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function IF(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 r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),we()&&Je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),NF(o,process.cwd())}function NF(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=TF("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=$F(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){we()&&Je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
1934
|
+
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function $F(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return sT;let r=Number(e);return!Number.isFinite(r)||r<=0?sT:r}function Gd(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:SF),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var SF,sT,kF,Kd=T(()=>{"use strict";Xd();$e();SF="http://127.0.0.1:8787",sT=30*60*1e3,kF=new Map(Ms.map(t=>[t.name,t]))});async function RF(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Vd({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:xF,capabilities:{tools:{listChanged:!1}},serverInfo:{name:jF,version:AF}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Ms.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 oT(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:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Vd(t){return`${JSON.stringify(t)}
|
|
1935
|
+
`}async function iT(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Vd({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await RF(l,t);c.kind==="response"?t.io.write(Vd(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
|
|
1934
1936
|
`);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
|
|
1935
1937
|
`)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
|
|
1936
|
-
`),a.finally(()=>c(1))})})}var
|
|
1937
|
-
`),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??
|
|
1938
|
+
`),a.finally(()=>c(1))})})}var xF,jF,AF,aT=T(()=>{"use strict";Xd();Kd();xF="2025-06-18",jF="lmctl",AF="0.0.1"});var cT={};le(cT,{runMcp:()=>LF});async function LF(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(OF),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
1939
|
+
`),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??CF(),o=1;try{let i=s===void 0?Gd({getConfig:()=>null},process.env):Gd(s,process.env);return o=await iT({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function CF(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&lT(s))MF(50*r);else if(!lT(s))break}}function lT(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function MF(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var OF,uT=T(()=>{"use strict";Ue();Kd();aT();$e();Ye();OF=`usage: lmctl mcp
|
|
1938
1940
|
|
|
1939
1941
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
1940
1942
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
1941
|
-
`});function Ds(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var dT=T(()=>{"use strict"});function
|
|
1943
|
+
`});function Ds(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var dT=T(()=>{"use strict"});function DF(t){return{stale_run_minutes:Fs(t,"monitor.stale_run_minutes",Ps.stale_run_minutes),old_attention_days:Fs(t,"monitor.old_attention_days",Ps.old_attention_days),old_issue_days:Fs(t,"monitor.old_issue_days",Ps.old_issue_days),stuck_job_minutes:Fs(t,"monitor.stuck_job_minutes",Ps.stuck_job_minutes),dedupe_window_hours:Fs(t,"monitor.dedupe_window_hours",Ps.dedupe_window_hours)}}function Fs(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function fT(t,e={}){let r=e.now??new Date,n=DF(t),s=[];for(let o of PF(t,n,r))s.push(o);for(let o of FF(t,n,r))s.push(o);for(let o of UF(t,n,r))s.push(o);for(let o of WF(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function PF(t,e,r){let n=mT(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
|
|
1942
1944
|
SELECT r.id AS id,
|
|
1943
1945
|
r.job_id AS job_id,
|
|
1944
1946
|
w.name AS workflow_name,
|
|
@@ -1949,12 +1951,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1949
1951
|
WHERE r.terminal_state IS NULL
|
|
1950
1952
|
AND r.paused_at IS NULL
|
|
1951
1953
|
AND r.started_at <= ?
|
|
1952
|
-
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Ds(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(Da(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function
|
|
1954
|
+
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Ds(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(Da(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function FF(t,e,r){let n=mT(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
|
|
1953
1955
|
SELECT id, project_id, source, source_ref, status, enqueued_at
|
|
1954
1956
|
FROM job
|
|
1955
1957
|
WHERE status NOT IN ('done', 'failed')
|
|
1956
1958
|
AND enqueued_at <= ?
|
|
1957
|
-
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Ds(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(Da(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function
|
|
1959
|
+
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Ds(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(Da(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function UF(t,e,r){let n=pT(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
|
|
1958
1960
|
SELECT project_id,
|
|
1959
1961
|
COUNT(*) AS count,
|
|
1960
1962
|
(SELECT kind FROM attention a2
|
|
@@ -1969,7 +1971,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1969
1971
|
AND kind NOT IN ('attentions_overdue', 'issues_overdue')
|
|
1970
1972
|
AND created_at <= ?
|
|
1971
1973
|
GROUP BY project_id
|
|
1972
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Ds(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(Da(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function
|
|
1974
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Ds(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(Da(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function WF(t,e,r){let n=pT(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
|
|
1973
1975
|
SELECT project_id,
|
|
1974
1976
|
COUNT(*) AS count,
|
|
1975
1977
|
(SELECT title FROM project_issue i2
|
|
@@ -1982,23 +1984,23 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1982
1984
|
WHERE status IN ('open', 'reopened')
|
|
1983
1985
|
AND created_at <= ?
|
|
1984
1986
|
GROUP BY project_id
|
|
1985
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Ds(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${
|
|
1987
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Ds(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${HF(i.oldest_title,40)})`;o.push(Da(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function Da(t,e){let r=BF(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function BF(t,e,r,n){let s=qF(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
|
|
1986
1988
|
SELECT * FROM attention
|
|
1987
1989
|
WHERE acknowledged_at IS NULL
|
|
1988
1990
|
AND created_at >= ?
|
|
1989
1991
|
AND payload LIKE ?
|
|
1990
1992
|
ORDER BY id DESC
|
|
1991
1993
|
LIMIT 1
|
|
1992
|
-
`).get(s,o)??null}function mT(t,e){return new Date(t.getTime()-e*60*1e3)}function
|
|
1993
|
-
`),0})}catch(o){return me(e,o)}}function _T(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${
|
|
1994
|
+
`).get(s,o)??null}function mT(t,e){return new Date(t.getTime()-e*60*1e3)}function qF(t,e){return new Date(t.getTime()-e*60*60*1e3)}function pT(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function HF(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Ps,hT=T(()=>{"use strict";dT();Ps={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var gT={};le(gT,{renderSummary:()=>_T,runMonitor:()=>XF});async function XF(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JF),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await L(e,o=>{let i=fT(o);return n?B(e,i):s||e.stdout.write(`${_T(i.findings)}
|
|
1995
|
+
`),0})}catch(o){return me(e,o)}}function _T(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${GF(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function GF(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var JF,wT=T(()=>{"use strict";ke();hT();JF=`usage: lmctl monitor [--json] [--quiet]
|
|
1994
1996
|
|
|
1995
1997
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
1996
1998
|
issues; emit findings as attentions for the operator/master to handle.
|
|
1997
|
-
`});var yT={};le(yT,{runDevice:()=>
|
|
1999
|
+
`});var yT={};le(yT,{runDevice:()=>sU});import{readFileSync as KF}from"node:fs";import{homedir as VF}from"node:os";import{join as YF}from"node:path";import{CognitoIdentityClient as zF,GetIdCommand as ZF}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as QF}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as eU,ListObjectsV2Command as tU,PutObjectCommand as rU,S3Client as nU}from"@aws-sdk/client-s3";async function sU(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Yd),0;if(r==="init"){let n=Pd();return e.stdout.write(`${n.device_id}
|
|
1998
2000
|
`),0}if(r==="id"){let n=Pr();return n===null?(e.stderr.write(`error: no device id initialized at ${$a()}; run 'lmctl device init'
|
|
1999
2001
|
`),1):(e.stdout.write(`${n.device_id}
|
|
2000
|
-
`),0)}return r==="login"?await
|
|
2001
|
-
`),1)}async function
|
|
2002
|
+
`),0)}return r==="login"?await oU(t.slice(1),e):r==="prompt"?await aU(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
2003
|
+
`),1)}async function oU(t,e){let r=iU(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2002
2004
|
${Yd}`),2;let n=Rs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2003
2005
|
`),1;kE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await ya({region:n.config.region,clientId:n.config.cognitoClientId??Na,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
|
|
2004
2006
|
`),1}let a=xs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
|
|
@@ -2006,10 +2008,10 @@ ${Yd}`),2;let n=Rs();if(n.config===void 0)return e.stderr.write(`error: mailbox
|
|
|
2006
2008
|
device id: ${l.device_id}
|
|
2007
2009
|
mailbox prefix: ${r.userId}/${l.device_id}/
|
|
2008
2010
|
access key stored at ${js()}
|
|
2009
|
-
`),0}function
|
|
2011
|
+
`),0}function iU(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function aU(t,e){let r=lU(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2010
2012
|
${Yd}`),2;let n=Rs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2011
|
-
`),1;let s=
|
|
2012
|
-
`),0}function
|
|
2013
|
+
`),1;let s=uU();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await cU({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=QF({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Pr()?.device_id,u=xs(o)??void 0,d=new Dr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new nU({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:tU,GetObjectCommand:eU,PutObjectCommand:rU},selfRole:"browser",onMessage:async()=>{}}),f=mE({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:fE,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
2014
|
+
`),0}function lU(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function cU(t){let r=await new zF({region:t.region}).send(new ZF({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function uU(t=process.env.LMCTL_TOKEN_PATH??YF(VF(),".lmctl","cli-tokens.json")){try{return JSON.parse(KF(t,"utf8"))}catch{return null}}var Yd,ET=T(()=>{"use strict";Fd();Od();na();Ed();bd();vd();Td();Yd=`usage: lmctl device <id|init|login|prompt>
|
|
2013
2015
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
2014
2016
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
2015
2017
|
|
|
@@ -2019,30 +2021,30 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
2019
2021
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
2020
2022
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
2021
2023
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
2022
|
-
`});var TT={};le(TT,{runTeam:()=>
|
|
2024
|
+
`});var TT={};le(TT,{runTeam:()=>mU});import{join as dU}from"node:path";async function mU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(fU),0;try{return await L(e,async s=>{switch(r){case"create":return hU(n,e,s);case"list":return _U(n,e,s);case"show":return gU(n,e,s);case"add-member":return wU(n,e,s);case"seed":return bT(n,e,s,!1);case"refresh":return bT(n,e,s,!0);case"companion":return EU(n,e,s);case"list-roots":return pU(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function pU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?B(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
2023
2025
|
`)+(s.length>0?`
|
|
2024
|
-
`:"")),0}function
|
|
2025
|
-
`),0}function
|
|
2026
|
+
`:"")),0}function hU(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
2027
|
+
`),0}function _U(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
2026
2028
|
`)}${s.length>0?`
|
|
2027
|
-
`:""}`),0}function
|
|
2028
|
-
`);for(let a of i)e.stdout.write(`- ${a.alias} ${
|
|
2029
|
-
`)}return 0}function
|
|
2030
|
-
`),0}async function bT(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=x(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=
|
|
2029
|
+
`:""}`),0}function gU(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))B(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
2030
|
+
`);for(let a of i)e.stdout.write(`- ${a.alias} ${xe(a)} ${a.sessionid??"(unseeded)"}
|
|
2031
|
+
`)}return 0}function wU(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--alias"),a=x(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??dU(wr(),"sessions",o.name,i)});return M(n,"--json")?B(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
2032
|
+
`),0}async function bT(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=x(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=yU(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=mw(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Zo(f,r),ei(f);let u=[],d=!1;for(let f of l){let m=await tn({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
|
|
2031
2033
|
|
|
2032
|
-
${on}`:on;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=an(
|
|
2034
|
+
${on}`:on;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=an(xe(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
2033
2035
|
${_}
|
|
2034
2036
|
`);try{await hi({dal:r,member:p,stderr:e.stderr})}catch(b){d=!0,e.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
|
|
2035
2037
|
`)}}}return M(s,"--json")?B(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2036
|
-
`),d?1:0}function
|
|
2037
|
-
`),0}var
|
|
2038
|
+
`),d?1:0}function yU(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function EU(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--interpreter"),a=x(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2039
|
+
`),0}var fU,ST=T(()=>{"use strict";Ye();Lo();ss();Ic();Ue();ln();Hc();Gi();ke();Nc();fU=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
|
|
2038
2040
|
|
|
2039
2041
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
2040
2042
|
refresh to create/update native provider sessions for team members.
|
|
2041
2043
|
|
|
2042
2044
|
Root team registry:
|
|
2043
2045
|
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
2044
|
-
`});var kT={};le(kT,{runInfo:()=>
|
|
2045
|
-
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>
|
|
2046
|
+
`});var kT={};le(kT,{runInfo:()=>vU});import{execFileSync as zd}from"node:child_process";import{dirname as bU}from"node:path";function kU(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function vU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${SU}
|
|
2047
|
+
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>NU(e,u,c,n))}catch(u){return me(e,u)}}let o=pr(TU,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>Ne(o.teamfile,u))}catch(u){return w(e,`health: ${u instanceof Error?u.message:String(u)}`)}return $U(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>Nt(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await ri(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return IU(e,i,a,l,n)}async function IU(t,e,r,n,s){let o;try{o=await Rr(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(B(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2046
2048
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
2047
2049
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
2048
2050
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
@@ -2051,7 +2053,7 @@ Root team registry:
|
|
|
2051
2053
|
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: unknown"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
|
|
2052
2054
|
`),t.stdout.write(` Created: ${i.createdAt}
|
|
2053
2055
|
`),t.stdout.write(` Modified: ${i.modifiedAt}
|
|
2054
|
-
`),0)}async function
|
|
2056
|
+
`),0)}async function NU(t,e,r,n){let s=xr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=nn(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(B(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
|
|
2055
2057
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
2056
2058
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
2057
2059
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -2061,64 +2063,64 @@ Root team registry:
|
|
|
2061
2063
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
2062
2064
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
2063
2065
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
2064
|
-
`),0)}async function
|
|
2065
|
-
`)}let g=h?.messageCount,_=o===null?void 0:h===null?null
|
|
2066
|
+
`),0)}async function $U(t,e,r){let n;try{n=Le(e)}catch(p){return w(t,`health: ${p instanceof Error?p.message:String(p)}`)}let s=xU(e),o=s.kind==="repo"?s:null,i=[],a=0,l=o===null?void 0:0,c=o===null?void 0:0;for(let p of n.members){if(p.teamfile!==void 0||p.session===void 0||p.session.length===0)continue;let h=null;try{h=await Rr(p.session,p.provider)}catch(k){t.stderr.write(`warning: failed to load session "${p.session}" for ${p.alias} (${p.provider}): ${k instanceof Error?k.message:String(k)}
|
|
2067
|
+
`)}let g=h?.messageCount,_=o===null?void 0:h===null?null:AU(h,o.since),b=o===null?void 0:RU(h),E=o===null?void 0:{messageCount:_??null,tokens:null};i.push({alias:p.alias,provider:p.provider,sessionid:p.session,messageCount:g??null,model:h?.model??"(unknown)",lastContext:h?.lastInputTokens,...o!==null?{activitySinceLastCommit:E,cumulativeTokens:b}:{}}),g===void 0?a=void 0:a!==void 0&&(a+=g),o!==null&&(_==null?l=void 0:l!==void 0&&(l+=_),b==null?c=void 0:c!==void 0&&(c+=b))}if(r)return B(t,{team:n.name,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(p=>({ref:p.ref,timestamp:p.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:i,total:{messageCount:a??null}}),0;let u=Math.max(7,...i.map(p=>p.sessionid.length)),d=Math.max(5,...i.map(p=>p.alias.length))+1,f=Math.max(8,...i.map(p=>p.provider.length))+1,m=Math.max(5,...i.map(p=>p.model.length))+1;if(t.stdout.write(`TEAM: ${n.name}
|
|
2066
2068
|
`),s.kind==="repo"){t.stdout.write(`Git progress:
|
|
2067
2069
|
`);for(let p of s.commits)t.stdout.write(` ${p.ref}: ${p.timestamp.toISOString()}
|
|
2068
2070
|
`);t.stdout.write(` Uncommitted: ${ht(s.working.uncommittedTracked)} changed (tracked), ${ht(s.working.untracked)} untracked
|
|
2069
2071
|
`)}else s.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${s.teamDir} has no commits (no commit-based progress to report)
|
|
2070
2072
|
`):t.stdout.write(`Git progress: no git repository in ${s.teamDir} (no commit-based progress to report)
|
|
2071
2073
|
`);t.stdout.write(` ${"SESSION".padEnd(u)} ${"ALIAS".padEnd(d)}${"PROVIDER".padEnd(f)}${"MODEL".padEnd(m)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
|
|
2072
|
-
`);for(let p of i){let h=p.lastContext!==void 0?
|
|
2074
|
+
`);for(let p of i){let h=p.lastContext!==void 0?kU(p.lastContext):"?";t.stdout.write(` ${p.sessionid.padEnd(u)} ${p.alias.padEnd(d)}${p.provider.padEnd(f)}${p.model.padEnd(m)}${ht(p.messageCount).padStart(6)} ${h.padStart(12)}`+(o!==null?` ${ht(p.activitySinceLastCommit?.messageCount).padStart(17)} ${ht(p.activitySinceLastCommit?.tokens).padStart(19)} ${ht(p.cumulativeTokens).padStart(19)}`:"")+`
|
|
2073
2075
|
`)}return t.stdout.write(` ${"TOTAL".padEnd(u)} ${"".padEnd(d)}${"".padEnd(f)}${"".padEnd(m)}${ht(a).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${ht(l).padStart(17)} ${ht(null).padStart(19)} ${ht(c).padStart(19)}`:"")+`
|
|
2074
|
-
`),0}function ht(t){return t==null?"unknown":String(t)}function
|
|
2076
|
+
`),0}function ht(t){return t==null?"unknown":String(t)}function xU(t){let e=bU(t),r;try{zd("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=zd("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:jU(e)}}function jU(t){let e;try{e=zd("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function AU(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function RU(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var TU,SU,vT=T(()=>{"use strict";ln();ke();Ur();Jt();mr();Pt();TU={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},SU=`usage: lmctl health [target] [alias]
|
|
2075
2077
|
lmctl health <teamfile> # team rollup
|
|
2076
2078
|
lmctl health <sessionid> [--provider <name>]
|
|
2077
2079
|
[--json]
|
|
2078
2080
|
|
|
2079
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var NT={};le(NT,{runLs:()=>
|
|
2080
|
-
`),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=x(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(x(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=x(r,"--limit"),h=
|
|
2081
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var NT={};le(NT,{runLs:()=>MU});import{resolve as Zd}from"node:path";function CU(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function MU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${OU}
|
|
2082
|
+
`),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=x(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(x(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=x(r,"--limit"),h=LU;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>IT)return w(e,`--limit ${_} exceeds maximum (${IT})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await L(e,async _=>DU(e,_,h,g))}catch(_){return me(e,_)}}let i=PU(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=x(r,"--provider"),c=x(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ic(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Zd(c):Zd(process.cwd());f=f.filter(h=>{let g=Zd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=CU(f),a==="json")return B(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
|
|
2081
2083
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
2082
2084
|
`);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
|
|
2083
2085
|
`);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
2084
|
-
`)}return 0}async function
|
|
2086
|
+
`)}return 0}async function DU(t,e,r,n){let s=rn(e,{limit:r});if(n==="json")return B(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;if(s.length===0)return t.stdout.write(`No runs found.
|
|
2085
2087
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2086
2088
|
`);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
|
|
2087
|
-
`)}return 0}function
|
|
2089
|
+
`)}return 0}function PU(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 OU,LU,IT,$T=T(()=>{"use strict";bt();ke();Pt();OU=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2088
2090
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2089
2091
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2090
2092
|
|
|
2091
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2092
|
-
`),2;let r=t[0],n;try{n=await L(e,a=>
|
|
2093
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,LU=50,IT=500});import{existsSync as jT,readFileSync as AT}from"node:fs";import{homedir as FU}from"node:os";import{dirname as UU,resolve as RT}from"node:path";import{fileURLToPath as WU}from"node:url";function tf(t,e={}){let r=[],n=HU(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=KU(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${xT(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Fa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${xT(i)}`)}return r}function HU(t){if(!t&&Us)return Us;let e=new Map,r,n=t??JU();if(!jT(n))return r=`${n} not found`,t||Qd(e),t||(Us=e),t||(Fa=r),e;let s;try{s=AT(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Qd(e),t||(Us=e),t||(Fa=r),e}for(let[o,i]of Object.entries(BU)){let a=XU(s,i),l=GU(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Qd(e),t||(Us=e),t||(Fa=r),e}function JU(){let t=UU(WU(import.meta.url));return RT(t,"..","..","..","durable-memory","model_selection.md")}function Qd(t){for(let[e,r]of Object.entries(qU))t.set(e,r)}function XU(t,e){let n=new RegExp(`^## ${YU(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function GU(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function KU(t){let e=t??RT(FU(),".config","opencode","opencode.json"),r=Bm();if(!jT(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(AT(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...VU(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function VU(t){if(!ef(t))return[];let e=Pa(t.provider)??Pa(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!ef(s))continue;let o=Pa(s.models)??Pa(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Pa(t){return ef(t)?t:null}function ef(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xT(t){return t.length>0?t.join(", "):"(none)"}function YU(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var BU,qU,Us,Fa,OT=T(()=>{"use strict";$l();BU={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},qU={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Us=null});var Js={};le(Js,{DEPRECATED_CONNECT_WARNING:()=>FT,GEMINI_PROVIDER_NOTICE:()=>PT,_setLintSessiondirFsOpsForTests:()=>dW,_setSkillFileOpsForTests:()=>uW,_setTeamfileSeedForTests:()=>cW,buildRootTeamRegistrationRow:()=>HT,registerRootTeam:()=>JT,runHire:()=>yW,runLint:()=>wW,runRefresh:()=>EW,runSeed:()=>BT,sha256Text:()=>qT,skillNameFromSource:()=>df,skillNameFromUrl:()=>LW});import{createHash as zU,randomUUID as ZU}from"node:crypto";import{accessSync as QU,constants as LT,existsSync as eW,mkdirSync as tW,readFileSync as qa,realpathSync as Ba,renameSync as rW,statSync as nW,unlinkSync as sW,writeFileSync as qs}from"node:fs";import{basename as oW,dirname as qr,isAbsolute as CT,join as sf,resolve as uf}from"node:path";function cW(t){UT=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(bt(),lc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function uW(t){Bs=t===null?of:{...of,...t}}function dW(t){Br=t===null?af:{...af,...t}}function fW(t,e){let r=qr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=uf(i);if(n.has(a))continue;let l=mW(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function mW(t){try{if(Br.existsSync(t)){if(!Br.statSync(t).isDirectory())return"ENOTDIR";Br.accessSync(t,LT.W_OK);return}let e=_W(t);if(e===void 0)return;if(!Br.statSync(e).isDirectory())return"ENOTDIR";Br.accessSync(e,LT.W_OK);return}catch(e){return gW(e)??"permission check failed"}}function pW(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||WT(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function hW(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!WT(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=XT(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function WT(t,e){return MT(t)===MT(e)}function MT(t){let e=uf(t);try{return Ba(e)}catch{return e}}function _W(t){let e=t;for(;;){try{if(Br.existsSync(e))return e}catch{return}let r=qr(e);if(r===e)return;e=r}}function gW(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function wW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(aW),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2094
|
+
`),2;let r=t[0],n;try{n=await L(e,a=>Ne(r,a))}catch(a){return Re(e,`${r}: ${a instanceof Error?a.message:String(a)}`)}let s;try{s=Le(n)}catch(a){return Re(e,`${r}: ${a instanceof Error?a.message:String(a)}`)}let o=xd(s,qr(n)),i=tf(s.members);i.push(...xl(s.members,qr(n))),i.push(...fW(s.members,n)),i.push(...pW(s.members,qr(n))),s.deprecatedConnectLines.length>0&&i.push(FT.replace("%s",s.deprecatedConnectLines.join(", ")));for(let a of o)e.stderr.write(`error: ${a.field}: ${a.message}
|
|
2093
2095
|
`);for(let a of s.members)cf([a],e),a.session!==void 0&&a.session.length<Ws&&i.push(`${a.alias}: sessionid is shorter than ${Ws} chars; run lmctl seed to refresh it`);for(let a of i)e.stderr.write(`warning: ${a}
|
|
2094
2096
|
`);return await L(e,a=>{gb(n,a,l=>e.stderr.write(`${l}
|
|
2095
2097
|
`))}),o.length>0?1:(e.stdout.write(`ok
|
|
2096
|
-
`),0)}async function BT(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(
|
|
2097
|
-
`),2;let r=t[0],n;try{n=await L(e,E=>
|
|
2098
|
-
`),c=
|
|
2098
|
+
`),0)}async function BT(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(lW),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2099
|
+
`),2;let r=t[0],n;try{n=await L(e,E=>Ne(r,E))}catch(E){return Re(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let s;try{s=Ba(n)}catch(E){return Re(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=qr(n),i;try{i=Le(n)}catch(E){return Re(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let l=qa(n,"utf8").split(`
|
|
2100
|
+
`),c=SW(l),u=hW(i.members,l,c,o),d=xd(i,o);if(d.length>0){cf(i.members,e);for(let E of d)e.stderr.write(`error: ${E.field}: ${E.message}
|
|
2099
2101
|
`);return 1}cf(i.members,e);for(let E of tf(i.members))e.stderr.write(`warning: ${E}
|
|
2100
2102
|
`);for(let E of xl(i.members,o))e.stderr.write(`warning: ${E}
|
|
2101
|
-
`);let f=await
|
|
2103
|
+
`);let f=await jW(i.skillUrls,o,e);if(f!==0)return f;let m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ws);for(let E of p)if(!KT(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
|
|
2102
2104
|
`),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Yr("lmctl","lmctl_chat",{warn:$=>e.stderr.write(`${$}
|
|
2103
2105
|
`)});let E=h.sessiondir??o,k=Pc(h.provider,E);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
|
|
2104
2106
|
`):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
|
|
2105
2107
|
`:`.mcp.json installed in ${E}
|
|
2106
2108
|
`)}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ws){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
|
|
2107
|
-
`);continue}let k=E.sessiondir??o,$=await UT({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:
|
|
2109
|
+
`);continue}let k=E.sessiondir??o,$=await UT({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:bW(n,l.join(`
|
|
2108
2110
|
`),i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ws){let F=`provider did not report a sessionid; no new session was found for ${k} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:`; ${F}`}
|
|
2109
2111
|
`),1}let v=c.get(E.alias.toLowerCase());if(v===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
|
|
2110
|
-
`),1;let A=
|
|
2112
|
+
`),1;let A=NW(l[v],"sessionid",$.sessionId);l[v]=A,m+=1,qs(n,l.join(`
|
|
2111
2113
|
`),"utf8"),e.stdout.write(`${E.alias}: seeded ${$.sessionId}
|
|
2112
2114
|
`)}let g=l.join(`
|
|
2113
|
-
`),_=
|
|
2114
|
-
`);let b=new Date().toISOString();return await L(e,E=>{JT(E,{teamfilePath:s,name:i.name,rawText:_,now:b})}),0}async function
|
|
2115
|
+
`),_=xW(g,Ba(n));(_!==g||u)&&qs(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
|
|
2116
|
+
`);let b=new Date().toISOString();return await L(e,E=>{JT(E,{teamfilePath:s,name:i.name,rawText:_,now:b})}),0}async function yW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Wa),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return nf(e,r.error,Wa);if(r.positionals.length!==2)return nf(e,"expected <teamfile.lmctl> and <alias>",Wa);let[n,s]=r.positionals;if(!IW(s))return Re(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Re(e,"hire only applies to non-Lead members");let o=x(r,"--provider");if(o===void 0)return nf(e,"missing value for --provider",Wa);if(!KT(o))return Re(e,`invalid provider "${o}"`);let i;try{i=await L(e,d=>Ne(n,d))}catch(d){return Re(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=qa(i,"utf8")}catch(d){return Re(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(vW(a,s))return Re(e,`${s}: alias already exists in ${i}`);let l=x(r,"--sessiondir"),c=[`_MEMBER_ alias=${lf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${lf(l)}`]].join(" "),u=$W(a,c);return qs(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
2115
2117
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
2116
|
-
`),0}async function
|
|
2117
|
-
`),a=
|
|
2118
|
-
`),"utf8"),BT([s],e))}function qT(t){return
|
|
2119
|
-
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=
|
|
2120
|
-
`)}function
|
|
2121
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Hs(r,"alias")===e)return!0;return!1}function
|
|
2118
|
+
`),0}async function EW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(rf),0;let r,n;if(t.length===1){let d=Ls(t[0]);if(d===null)return e.stderr.write(rf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(rf),2;let s;try{s=await L(e,d=>Ne(r,d))}catch(d){return Re(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=qa(s,"utf8")}catch(d){return Re(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
2119
|
+
`),a=kW(i,n);if(a===void 0)return Re(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Hs(l,"teamfile")!==void 0)return Re(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[Hn],u=Hs(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Re(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=XT(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),qs(s,i.join(`
|
|
2120
|
+
`),"utf8"),BT([s],e))}function qT(t){return zU("sha256").update(t).digest("hex")}function HT(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:qT(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function JT(t,e){let r=HT(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function bW(t,e,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
|
|
2121
|
+
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=TW(o,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating in the background (non-blocking + completion signal):",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,`- Tracked submit shape: lmctl chat "${t}" <alias> "your task here" --detach`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.",'- Plain shell "&" is blind backgrounding; it gives no lmctl job id or completion signal.',"- lmctl jobs is the universal tracked portal for every provider: list jobs with lmctl jobs list, or watch one with lmctl jobs watch <job_id>.",i,"","Delegation is an ACTION, not a plan: to hand a member a task, submit the job or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${t}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer native background lmctl chat when available, or --detach; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
|
|
2122
|
+
`)}function TW(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: no native completion push; submit with --detach, keep working, and pull status with lmctl jobs or lmctl jobs watch <job_id>.";case"gemini":return"- Gemini note: no native completion push; submit with --detach, keep working, and pull status with lmctl jobs or lmctl jobs watch <job_id>.";case"opencode":return"- OpenCode note: shell commands do not have a stable native completion push; submit with --detach and pull status with lmctl jobs or lmctl jobs watch <job_id>.";default:return"- If your provider has native background-shell completion, use it around the submit; otherwise use lmctl jobs to pull status."}}function SW(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Hs(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function kW(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Hs(s,"alias")?.toLowerCase()===r)return n}}function vW(t,e){for(let r of t.split(`
|
|
2123
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Hs(r,"alias")===e)return!0;return!1}function IW(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Hs(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function NW(t,e,r){let n=`${e}=${lf(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function XT(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function lf(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function $W(t,e){let r=t.split(`
|
|
2122
2124
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
|
|
2123
2125
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
2124
2126
|
`),i=r.slice(s).join(`
|
|
@@ -2126,24 +2128,24 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2126
2128
|
|
|
2127
2129
|
`:""}${e}${i.length>0?`
|
|
2128
2130
|
${i}`:`
|
|
2129
|
-
`}`}function
|
|
2131
|
+
`}`}function xW(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
|
|
2130
2132
|
`),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
|
|
2131
2133
|
${o}`:`${r}
|
|
2132
2134
|
`:t.length>0?`${r}
|
|
2133
2135
|
${t}`:`${r}
|
|
2134
|
-
`}async function
|
|
2136
|
+
`}async function jW(t,e,r){if(t.length===0)return 0;let n=sf(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await GT(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Re(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
|
|
2135
2137
|
`);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
|
|
2136
2138
|
${i.body}${i.body.endsWith(`
|
|
2137
2139
|
`)?"":`
|
|
2138
|
-
`}`;try{Bs.mkdirSync(n,{recursive:!0}),
|
|
2139
|
-
`)}return 0}async function GT(t,e,r,n,s){if(s>Ua)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ua}`);let o=await
|
|
2140
|
+
`}`;try{Bs.mkdirSync(n,{recursive:!0}),OW(n,i.name,a)}catch(l){return Re(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
|
|
2141
|
+
`)}return 0}async function GT(t,e,r,n,s){if(s>Ua)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ua}`);let o=await AW(t,e),i=RW(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:df(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=Ua)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${Ua}`);for(let a of i)await GT(a,o.base,r,n,s+1)}async function AW(t,e){if(e.kind==="https"){if(Kt(t)||!CT(t)){let o=DT(t,e),i;try{i=await Tr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:Rn(o),source:Rn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Kt(t)){let o=DT(t,e),i;try{i=await Tr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:Rn(o),source:Rn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=CT(t)?t:uf(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Ba(r),s=qa(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:qr(n)},text:s}}function DT(t,e){if(Kt(t)){if(!gt(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return Rn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!gt(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return Rn(r)}function RW(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Kt(l)&&!gt(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function Rn(t){return new URL(t).href}function OW(t,e,r){let n=sf(t,`${e}.md`),s=sf(t,`${e}.${process.pid}.${ZU().slice(0,8)}.tmp`);try{Bs.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Bs.renameSync(s,n)}catch(o){try{Bs.unlinkSync(s)}catch{}throw o}}function LW(t){return df(t)}function df(t){let e=gt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(oW(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,iW).replace(/-+$/gu,"")||"skill"}function KT(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Re(t,e){return t.stderr.write(`error: ${e}
|
|
2140
2142
|
`),1}function nf(t,e,r){return t.stderr.write(`error: ${e}
|
|
2141
2143
|
${r}`),2}function cf(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
2142
2144
|
`),r.provider==="gemini"&&e.stderr.write(`${PT.replace("%s",r.alias)}
|
|
2143
|
-
`)}var Ws,
|
|
2145
|
+
`)}var Ws,iW,Ua,aW,lW,Wa,rf,PT,FT,of,af,UT,Bs,Br,Xs=T(()=>{"use strict";Jt();OT();go();yt();mo();ke();mr();to();cs();Ur();mr();Ws=5,iW=80,Ua=16,aW=`usage: lmctl lint <teamfile.lmctl>
|
|
2144
2146
|
|
|
2145
2147
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
2146
|
-
`,
|
|
2148
|
+
`,lW=`usage: lmctl seed <teamfile.lmctl>
|
|
2147
2149
|
|
|
2148
2150
|
Seed missing or placeholder session ids in an lmctl teamfile by calling each
|
|
2149
2151
|
member's configured native provider.
|
|
@@ -2160,32 +2162,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2160
2162
|
re-seed.
|
|
2161
2163
|
A member cannot refresh its own running session; run the refresh from a
|
|
2162
2164
|
meta-Lead or operator shell outside that sessiondir.
|
|
2163
|
-
`,PT='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',FT="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",of={mkdirSync:
|
|
2164
|
-
`),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=YT(r);if(!ff(c))throw new Error(`source not found: ${r}`);let d=zT(c).isDirectory()?
|
|
2165
|
-
`),1}let i=YT(n),a=
|
|
2166
|
-
`),1;let l=
|
|
2165
|
+
`,PT='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',FT="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",of={mkdirSync:tW,writeFileSync:qs,renameSync:rW,unlinkSync:sW},af={existsSync:eW,statSync:nW,accessSync:QU},UT=async t=>{let{seed:e}=await Promise.resolve().then(()=>(bt(),lc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Bs=of,Br=af});var QT={};le(QT,{runClone:()=>BW});import{existsSync as ff,mkdirSync as CW,readFileSync as MW,readdirSync as DW,statSync as zT,writeFileSync as PW}from"node:fs";import{basename as VT,dirname as FW,extname as UW,join as ZT,resolve as YT}from"node:path";async function BW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(WW),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2166
|
+
`),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=YT(r);if(!ff(c))throw new Error(`source not found: ${r}`);let d=zT(c).isDirectory()?qW(c):c;s=MW(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2167
|
+
`),1}let i=YT(n),a=HW(i,o,n);if(ff(a))return e.stderr.write(`error: ${a} already exists.
|
|
2168
|
+
`),1;let l=XW(JW(s));return CW(FW(a),{recursive:!0}),PW(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
2167
2169
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2168
2170
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2169
2171
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
2170
|
-
`),0}function
|
|
2172
|
+
`),0}function qW(t){let e=DW(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return ZT(t,e[0])}function HW(t,e,r){if(r.endsWith("/")||ff(t)&&zT(t).isDirectory()){let n=VT(e).endsWith(".lmctl")?VT(e):"team.lmctl";return ZT(t,n)}return UW(t)?t:`${t}.lmctl`}function JW(t){return t.split(`
|
|
2171
2173
|
`).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2172
|
-
`)}function
|
|
2174
|
+
`)}function XW(t){return t.split(`
|
|
2173
2175
|
`).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2174
|
-
`)}var
|
|
2176
|
+
`)}var WW,eS=T(()=>{"use strict";WW=`usage: lmctl clone <source> <dest>
|
|
2175
2177
|
|
|
2176
2178
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2177
2179
|
|
|
2178
2180
|
Examples:
|
|
2179
2181
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2180
|
-
`});var nS={};le(nS,{runPlan:()=>
|
|
2182
|
+
`});var nS={};le(nS,{runPlan:()=>QW});import{existsSync as GW,mkdirSync as KW,writeFileSync as VW}from"node:fs";import{basename as tS,extname as rS,join as YW,resolve as zW}from"node:path";async function QW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(ZW),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2181
2183
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2182
2184
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2183
|
-
`),2;let n=
|
|
2184
|
-
`),1):(
|
|
2185
|
+
`),2;let n=zW(r.positionals[0]);KW(n,{recursive:!0});let s=x(r,"--team")??tS(n),o=x(r,"--provider")??"claude",i=YW(n,eB(s));return GW(i)?(e.stderr.write(`error: ${i} already exists.
|
|
2186
|
+
`),1):(VW(i,rB({teamName:tB(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
|
|
2185
2187
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2186
2188
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2187
2189
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2188
|
-
`),0)}function
|
|
2190
|
+
`),0)}function eB(t){return rS(t)?t:`${t}.lmctl`}function tB(t){let e=rS(t);return e?tS(t,e):t}function rB(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
|
|
2189
2191
|
|
|
2190
2192
|
# Lead, you take tasks from the operator. Clarify only when needed,
|
|
2191
2193
|
# then first use lmctl_chat to ping each of your members with a one-line
|
|
@@ -2229,7 +2231,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
|
|
|
2229
2231
|
refreshed or swapped-in agent loses its chat history but NOT what's written
|
|
2230
2232
|
here. When a task is done, record durable project knowledge in durable-memory/
|
|
2231
2233
|
and keep durable-memory/index.md current so any agent can get up to speed fast.
|
|
2232
|
-
`}var
|
|
2234
|
+
`}var ZW,sS=T(()=>{"use strict";ke();ZW=`usage: lmctl plan [options] <directory>
|
|
2233
2235
|
|
|
2234
2236
|
Generate a starter lmctl team document template for a directory.
|
|
2235
2237
|
|
|
@@ -2244,7 +2246,7 @@ Examples:
|
|
|
2244
2246
|
|
|
2245
2247
|
# Same shape, codex for the Lead and Reviewer2
|
|
2246
2248
|
lmctl plan ./backend --provider codex
|
|
2247
|
-
`});var aS={};le(aS,{SIZE_WARN_EST_TOKENS:()=>Gs,estimateTokens:()=>iS,runTerminal:()=>
|
|
2249
|
+
`});var aS={};le(aS,{SIZE_WARN_EST_TOKENS:()=>Gs,estimateTokens:()=>iS,runTerminal:()=>iB});import{spawn as nB}from"node:child_process";import{statSync as sB}from"node:fs";async function iB(t,e){if(t.includes("--help")||t.includes("-h"))return dB(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(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"?M(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await L(e,async i=>{let a=x(r,"--alias"),l=my(i,s,a);return"err"in l?w(e,l.err):mf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):x(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=pr(oB,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await L(e,l=>aB(e,a.teamfile,a.alias,l))}try{return await L(e,async s=>{let o=lB(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return M(r,"--size")?uB(e,s,o,i,M(r,"--json")):cB(e,s,o,i)})}catch(s){return me(e,s)}}async function aB(t,e,r,n){let s;try{s=Nt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):me(t,o)}ui(t,s.isLead,s.alias,s.provider,s.sessiondir);try{di(t,Le(s.teamfile),s.teamfile)}catch{}return mf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function mf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!ti(r))return w(t,`no resume incantation for provider "${r}"`);if(!Ih.test(n))return w(t,"refusing to resume: malformed sessionid");let o=jc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=nB(i,a,{stdio:"inherit",cwd:s,env:ze(process.env,s,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function lB(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=_i(t,e,x(r,"--project"));return typeof s=="number"?s:gi(t,e,s,void 0)}async function cB(t,e,r,n){let s=wi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):mf(t,{provider:xe(s),sessionid:o,sessiondir:s.sessiondir})}function iS(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=sB(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function uB(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.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=xe(a),u=null;ti(c)&&(u=await Rr(l,c));let d=iS(u),f=d.est>Gs;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?an(c,l):null})}if(s)return B(t,{estimate:!0,legend:oS,guide_tokens:Gs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2248
2250
|
`),t.stdout.write(`${oS}
|
|
2249
2251
|
`);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)
|
|
2250
2252
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2252,7 +2254,7 @@ Examples:
|
|
|
2252
2254
|
session yourself:
|
|
2253
2255
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2254
2256
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2255
|
-
`)}return 0}function
|
|
2257
|
+
`)}return 0}function dB(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2256
2258
|
lmctl terminal <teamfile> <alias>
|
|
2257
2259
|
lmctl terminal --run <id> [--alias A]
|
|
2258
2260
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2283,55 +2285,55 @@ Examples:
|
|
|
2283
2285
|
tokens it surfaces the resume incantation so YOU can
|
|
2284
2286
|
open & self-compact. Nothing is ever changed
|
|
2285
2287
|
automatically; ${Gs} is a guide, not a gate.
|
|
2286
|
-
`),0}var
|
|
2288
|
+
`),0}var oB,Gs,oS,lS=T(()=>{"use strict";Ue();ln();ke();Gc();Ur();Jt();yt();cs();ua();oB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Gs=2e5,oS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as pf,dirname as fS}from"node:path";function hf(t,e){let r=pf(t);for(;;){let n=fB(e,r);if(n!==null)return n;let s=fS(r);if(s===r)return null;r=s}}function fB(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Ha(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Ja(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function _f(t){if(t.io.dal!==void 0){let o=cS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new st(uS(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(Ha()||Ja()){let o=ue(),i=pe({path:o}),a=cS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new st(uS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Ja()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Ha()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?pS(t.cwd):mB(t.projectName),r=hS(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new st(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function mS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Ha()||Ja()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Ja()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Ha()?"explicit-db":"explicit-workspace"}}let e;try{e=pS(t.cwd)}catch{throw new st("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=hS(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function cS(t,e,r){return r!==void 0?t.findProjectByName(r):hf(e,t)}function uS(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function mB(t){let e=[];for(let r of Qa())for(let n of _S(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new st(`project not found in any workspace DB: ${t}`);return e}function pS(t){let e=pB(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Qa())for(let o of _S(s)){let i=pf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new st("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function hS(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new st(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2287
2289
|
${dS(n)}`):new st(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2288
2290
|
${dS(n)}`)}function dS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2289
|
-
`)}function
|
|
2290
|
-
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return _r(e,r.error);if(r.positionals.length>1)return _r(e,Xa);let n=M(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return _r(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Kt(c))return _r(e,Xa);if(sr(c))return gS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Un(c,"remote workflow URLs");return m!==null?w(e,m):gS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return _r(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return _r(e,Xa);if(i!==void 0&&(o!==void 0||a!==void 0))return _r(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=
|
|
2291
|
+
`)}function pB(t){let e=[],r=pf(t);for(;;){e.push(r);let n=fS(r);if(n===r)return e;r=n}}function _S(t){let e=null;try{e=new ro(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>pl)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var st,gf=T(()=>{"use strict";ml();_l();Ue();Ye();st=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Sf={};le(Sf,{assertNoCrossWorkflowSubflowCycle:()=>SS,firstUnregisteredArchetype:()=>Tf,runWorkflow:()=>$B});import{createHash as Ef,randomUUID as hB}from"node:crypto";import{existsSync as _B,readFileSync as Ka,readdirSync as gB,writeFileSync as wB}from"node:fs";import{basename as yB,join as EB,resolve as bB}from"node:path";import{pathToFileURL as TB}from"node:url";function bf(t,e){return{source_uri:TB(bB(t)).href,source_sha256:Ef("sha256").update(e).digest("hex")}}function yS(t){return Ef("sha256").update(t).digest("hex")}async function IB(t){let e=await Tr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:yS(e),remote:!0}}async function Ga(t){if(sr(t)){let n=await is(t),s=Ka(n,"utf8");return{definition:s,source_uri:t,source_sha256:yS(s),remote:!1}}let e=Un(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(gt(t))return IB(t);let r=Ka(t,"utf8");return{definition:r,...bf(t,r),remote:!1}}function ES(t){return De(t.definition)}function bS(t){if(t.definition_schema_version!==3)return null;let e=Tf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function NB(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function $B(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(vB),0;try{return r==="run"?await xB(n,e):await L(e,s=>{switch(r){case"load":return OB(n,e,s);case"author":return LB(n,e,s);case"list":return CB(n,e,s);case"sync":return MB(n,e,s);case"export":return DB(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof st?w(e,s.message):me(e,s)}}async function xB(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Xa}
|
|
2292
|
+
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return _r(e,r.error);if(r.positionals.length>1)return _r(e,Xa);let n=M(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return _r(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Kt(c))return _r(e,Xa);if(sr(c))return gS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Un(c,"remote workflow URLs");return m!==null?w(e,m):gS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return _r(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return _r(e,Xa);if(i!==void 0&&(o!==void 0||a!==void 0))return _r(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=jB(i);if(m===null)return _r(e,`invalid --job: ${i}`);let p=mS({cwd:process.cwd(),io:e});try{let h=await ks({dal:p.dal,job_id:m,worker_id:wf()});return yf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=TS(a,e);if(d===Va)return 2;let f=_f({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await ks({dal:f.dal,job_id:p.id,worker_id:wf()});return yf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function gS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=TS(o,r);if(l===Va)return 2;let c,u;try{c=await Ga(t),u=ES(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=bS(u);if(d!==null)return w(r,d);if(c.remote&&!await AB(r,c,u,a))return 1;let f=_f({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await ks({dal:f.dal,job_id:p.id,worker_id:wf()});return yf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function _r(t,e){return t.stderr.write(`error: ${e}
|
|
2291
2293
|
`),2}function TS(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
|
|
2292
2294
|
`),Va}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2293
|
-
`),Va):r}function
|
|
2295
|
+
`),Va):r}function jB(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function wf(){return`cli-${process.pid}-${hB().slice(0,8)}`}function yf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?B(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2294
2296
|
`),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?B(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2295
2297
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2296
2298
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2297
2299
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
2298
|
-
`)),e.status==="failed"?1:0}async function
|
|
2300
|
+
`)),e.status==="failed"?1:0}async function AB(t,e,r,n){let s=NB(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
|
|
2299
2301
|
`)+`
|
|
2300
|
-
`),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await
|
|
2301
|
-
`),a}function
|
|
2302
|
+
`),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await RB(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
|
|
2303
|
+
`),a}function RB(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function OB(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(sr(s))try{o=await Ga(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(gt(s))try{o=await Ga(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Un(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Ga(s)}let i;try{i=ES(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?bS(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
|
|
2302
2304
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2303
2305
|
sha256: ${o.source_sha256}
|
|
2304
|
-
`),0}function Tf(t){let e=Hi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function wS(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function SS(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function
|
|
2305
|
-
`),0}function
|
|
2306
|
+
`),0}function Tf(t){let e=Hi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function wS(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function SS(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function LB(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Ka(s,"utf8"),a;try{a=De(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=Tf(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{SS(u,wS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return wS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...bf(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Ef("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
|
|
2307
|
+
`),0}function CB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2306
2308
|
`)}${s.length>0?`
|
|
2307
|
-
`:""}`),0}function
|
|
2308
|
-
`),0}function
|
|
2309
|
-
`,c=x(n,"--out");return c!==void 0?(
|
|
2310
|
-
`)):e.stdout.write(l),0}var
|
|
2309
|
+
`:""}`),0}function MB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);ii({swallow:!0});let s=Ah(),o=[];try{o=_B(s)?gB(s).filter(c=>SB.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=EB(s,c),d=Ka(u,"utf8"),f;try{f=De(d)}catch($){return w(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:yB(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,b=bf(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===b.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...b}),k?i+=1:a+=1}return M(n,"--json")?B(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2310
|
+
`),0}function DB(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:kB,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
|
|
2311
|
+
`,c=x(n,"--out");return c!==void 0?(wB(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2312
|
+
`)):e.stdout.write(l),0}var SB,kB,vB,Xa,Va,kf=T(()=>{"use strict";Ru();gn();li();Cc();ke();gf();to();vs();SB=[".compound.json",".lmctl"],kB="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",vB=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2311
2313
|
|
|
2312
2314
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2313
2315
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2314
2316
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2315
2317
|
remote https:// workflow after a trust prompt.
|
|
2316
|
-
`,Xa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Va=Symbol("inputs-error")});function vf(t,e){let r=
|
|
2317
|
-
`)}return 0}function
|
|
2318
|
-
`),0}function
|
|
2318
|
+
`,Xa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Va=Symbol("inputs-error")});function vf(t,e){let r=PB[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var PB,kS=T(()=>{"use strict";PB={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var AS={};le(AS,{initWorkspace:()=>xS,runWorkspace:()=>JB,setWorkspaceProvider:()=>jS});import{copyFileSync as FB,cpSync as UB,existsSync as Fe,mkdirSync as gr,readdirSync as Nf,renameSync as WB,rmSync as Ya,statSync as za,writeFileSync as BB}from"node:fs";import{spawnSync as qB}from"node:child_process";import{homedir as vS}from"node:os";import{dirname as $f,join as Ks}from"node:path";async function JB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(HB),0;switch(r){case"list":return XB(n,e);case"create":return GB(n,e);case"use":return KB(n,e);case"show":return VB(n,e);case"delete":return YB(n,e);case"migrate":return zB(n,e);case"init":return xS(n,e);case"set-provider":return jS(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function NS(){let t=Ys(),e=[],r=new Set,n=Er.default,s=Fe(Cn()),o=Fe(jt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Xt(n):Cn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Fe(yr())){let i;try{i=Nf(yr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!He(a))continue;let l=!1;try{l=za(jt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Xt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function XB(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=NS();if(M(r,"--json"))return B(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
|
|
2319
|
+
`)}return 0}function GB(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!He(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Fe(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??el(n);gr(s,{recursive:!0}),gr(o,{recursive:!0});let i=Xt(n);gr($f(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?B(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2320
|
+
`),0}function KB(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!He(n))return w(e,`invalid workspace name: ${n}`);if(n!==Er.default&&!Fe(jt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Vs();return gr($f(s),{recursive:!0}),BB(s,`${n}
|
|
2319
2321
|
`),M(r,"--json")?B(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2320
|
-
`),0}function
|
|
2321
|
-
`),0}function
|
|
2322
|
-
`),0):w(e,`workspace not found: ${n}`)}function If(t,e,r){try{
|
|
2323
|
-
`),za(t).isDirectory()?
|
|
2322
|
+
`),0}function VB(t,e){let r=D(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!He(n))return w(e,`invalid workspace name: ${n}`);let s=NS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Fe(s.db_path)?za(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Fe(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?B(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2323
|
+
`),0}function YB(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!He(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===Er.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Ys()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=jt(n);return Fe(o)?(Ya(o,{recursive:!0,force:!0}),M(r,"--json")?B(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2324
|
+
`),0):w(e,`workspace not found: ${n}`)}function If(t,e,r){try{WB(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
|
|
2325
|
+
`),za(t).isDirectory()?UB(t,e,{recursive:!0}):FB(t,e),!Fe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Ya(t,{recursive:!0,force:!0})}function zB(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=tl(),o=yr(),i=[],a=(f,m)=>{if(n)B(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2324
2326
|
`);e.stdout.write(f?`migration complete
|
|
2325
2327
|
`:`${m??"nothing to migrate"}
|
|
2326
|
-
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Nf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return za(Ks(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ya(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))If(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(Ks(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);gr(o,{recursive:!0});for(let m of c)If(Ks(s,m),Ks(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Nf(s).length===0&&(Ya(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=qf(),d=Vs();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(If(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function $S(t,e){return
|
|
2328
|
+
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Nf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return za(Ks(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ya(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))If(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(Ks(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);gr(o,{recursive:!0});for(let m of c)If(Ks(s,m),Ks(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Nf(s).length===0&&(Ya(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=qf(),d=Vs();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(If(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function $S(t,e){return qB(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function e2(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function IS(t){return t==="~"?vS():t.startsWith("~/")?Ks(vS(),t.slice(2)):t}async function xS(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${On.join(", ")}.`].join(`
|
|
2327
2329
|
`)+`
|
|
2328
2330
|
`),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??$S,a=On.map(v=>vf(v,o)).filter(v=>v.status==="ok"||v.status==="unverified").map(v=>v.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${On.join("|")} first
|
|
2329
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2331
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??e2,u=r.promptLine!==void 0||l,d=v=>(e.stderr.write(`error: ${v} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2330
2332
|
`),2),f,m=x(s,"--name");if(m!==void 0){if(!He(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2331
2333
|
`),2;f=m}else{if(!u)return d("--name");for(;;){let v=(await c("Workspace name [default]: ")).trim(),A=v.length===0?"default":v;if(He(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
|
|
2332
2334
|
`)}}let p=jt(f);if(Fe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2333
|
-
`),2;let h,g=x(s,"--basedir"),_=el(f);if(g!==void 0)h=IS(g);else{if(!u)return d("--basedir");let v=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=v.length===0?_:IS(v)}let b={};for(let v of["provider1","provider2","provider3"]){let A=x(s,`--${v}`),F=
|
|
2334
|
-
`),2;b[v]=A;continue}if(!u)return d(`--${v}`);for(;;){let J=(await c(`${v} (${
|
|
2335
|
+
`),2;let h,g=x(s,"--basedir"),_=el(f);if(g!==void 0)h=IS(g);else{if(!u)return d("--basedir");let v=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=v.length===0?_:IS(v)}let b={};for(let v of["provider1","provider2","provider3"]){let A=x(s,`--${v}`),F=ZB[v],U=a.includes(F)?F:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${v} ${A} is not an available provider (available: ${a.join(", ")})
|
|
2336
|
+
`),2;b[v]=A;continue}if(!u)return d(`--${v}`);for(;;){let J=(await c(`${v} (${QB[v]}) [${U}]: `)).trim(),R=J.length===0?U:J;if(a.includes(R)){b[v]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
|
|
2335
2337
|
`)}}gr(p,{recursive:!0}),gr(h,{recursive:!0});let E=Xt(f);gr($f(E),{recursive:!0});let k=pe({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",b.provider1),k.setConfig("workspace.provider2",b.provider2),k.setConfig("workspace.provider3",b.provider3)}finally{k.close()}let $={name:f,dir:p,db_path:E,basedir:h,providers:{...b}};return M(s,"--json")?B(e,$):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2336
2338
|
`),e.stdout.write(` basedir: ${h}
|
|
2337
2339
|
`),e.stdout.write(` provider1=${b.provider1} provider2=${b.provider2} provider3=${b.provider3}
|
|
@@ -2342,26 +2344,26 @@ remote https:// workflow after a trust prompt.
|
|
|
2342
2344
|
`),2;let c=r.spawn??$S,u=On.map(p=>vf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${On.join("|")} first
|
|
2343
2345
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2344
2346
|
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Mn()??Er.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2345
|
-
`),0}var
|
|
2347
|
+
`),0}var HB,On,ZB,QB,RS=T(()=>{"use strict";Ue();kS();ke();Ye();HB=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
|
|
2346
2348
|
|
|
2347
2349
|
Manage isolated workspace state directories, active workspace selection,
|
|
2348
2350
|
legacy profile migration, and configured provider slots.
|
|
2349
|
-
`;On=["claude","codex","gemini","qwen"],
|
|
2350
|
-
`),0}function
|
|
2351
|
+
`;On=["claude","codex","gemini","qwen"],ZB={provider1:"claude",provider2:"codex",provider3:"gemini"},QB={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var CS={};le(CS,{runProject:()=>s2});import{existsSync as t2,statSync as r2}from"node:fs";import{join as LS}from"node:path";async function s2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(n2),0;try{return await L(e,s=>{switch(r){case"create":return m2(n,e,s);case"list":return p2(n,e,s);case"show":return d2(n,e,s);case"status":return f2(n,e,s);case"workflow":return o2(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function o2(t,e,r){let[n,...s]=t;switch(n){case"add":return i2(s,e,r);case"list":return a2(s,e,r);case"show":return l2(s,e,r);case"remove":return c2(s,e,r);case"enable":return OS(s,e,r,!0);case"disable":return OS(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function i2(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{ar(l)}catch{return w(e,"invalid --condition JEXL")}let c=u2(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?B(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2352
|
+
`),0}function a2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?B(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2351
2353
|
`)}${i.length>0?`
|
|
2352
|
-
`:""}`),0}function
|
|
2353
|
-
`),0)}function
|
|
2354
|
+
`:""}`),0}function l2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=xf(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?B(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2355
|
+
`),0)}function c2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=xf(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
|
|
2354
2356
|
`),0):w(e,`project workflow not found: ${s}`)}function OS(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let o=xf(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?B(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2355
|
-
`),0)}function
|
|
2356
|
-
`),0}function
|
|
2357
|
-
`),0}function
|
|
2358
|
-
`),0}function
|
|
2357
|
+
`),0)}function u2(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function xf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function d2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?B(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2358
|
+
`),0}function f2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?B(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2359
|
+
`),0}function m2(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?LS(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let b=_!==void 0?_:h2(d)||ns(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:b});return M(n,"--json")?B(e,E):e.stdout.write(`created project ${E.name}
|
|
2360
|
+
`),0}function p2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2359
2361
|
`)}${s.length>0?`
|
|
2360
|
-
`:""}`),0}function
|
|
2362
|
+
`:""}`),0}function h2(t){try{let e=LS(t,"durable-memory");return t2(e)&&r2(e).isDirectory()}catch{return!1}}var n2,MS=T(()=>{"use strict";ke();mn();ss();n2=`usage: lmctl project <create|list|show|status|workflow>
|
|
2361
2363
|
|
|
2362
2364
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2363
2365
|
per-project workflow bindings and routing conditions.
|
|
2364
|
-
`});import{createHash as
|
|
2366
|
+
`});import{createHash as _2,randomBytes as g2}from"node:crypto";import{readFile as w2}from"node:fs/promises";function DS(t=new Date,e=g2(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function y2(t){return _2("sha256").update(t).digest("hex")}async function PS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await w2(n);return{path:r,sha256:y2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function FS(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var jf=T(()=>{"use strict"});import{spawnSync as US}from"node:child_process";import{mkdir as Af,writeFile as WS,readFile as E2,rm as BS}from"node:fs/promises";import{tmpdir as b2}from"node:os";import{dirname as qS,join as Rf}from"node:path";async function HS(t){let e=t.stagingDir??Rf(b2(),`lmctl-diag-${t.ticketId}`),r=Rf(e,`diagnostic-${t.ticketId}`);await Af(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Rf(r,d);if(await Af(qS(m),{recursive:!0}),typeof f=="string")await WS(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await WS(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2365
2367
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2366
2368
|
`:`${d.pid}
|
|
2367
2369
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2379,31 +2381,31 @@ per-project workflow bindings and routing conditions.
|
|
|
2379
2381
|
`:`# source=${f}
|
|
2380
2382
|
# tail_lines=${d.tail_lines}
|
|
2381
2383
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2382
|
-
`:""}`)}if(await s("README.md",
|
|
2383
|
-
`)}var JS=T(()=>{"use strict";jf();zs()});import{spawnSync as
|
|
2384
|
+
`:""}`)}if(await s("README.md",T2(t)),t.sanitized)for(let d of n){let f=await E2(d.absPath);try{Kf(d.bundlePath,f.toString("utf8"))}catch(m){throw await BS(e,{recursive:!0,force:!0}),m instanceof br,m}}let i=await PS(n),a=FS({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Af(qS(t.outputPath),{recursive:!0});let l=US("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=US("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await BS(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function T2(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
|
|
2385
|
+
`)}var JS=T(()=>{"use strict";jf();zs()});import{spawnSync as S2}from"node:child_process";import{stat as k2}from"node:fs/promises";async function XS(t){try{if(!(await k2(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return v2(t);case"hq":return I2(t)}}function v2(t){let r=S2("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function I2(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var GS=T(()=>{"use strict"});var VS={};le(VS,{parseDiagnoseArgs:()=>KS,runDiagnose:()=>x2});import{tmpdir as N2}from"node:os";import{join as $2}from"node:path";async function x2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${R2()}
|
|
2384
2386
|
`),0;let r=KS(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2385
2387
|
`),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
|
|
2386
2388
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2387
|
-
`),2;let n=DS(),s=r.outputPath
|
|
2389
|
+
`),2;let n=DS(),s=r.outputPath??A2(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await L(e,async i=>{let a=await Yf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await HS({ticketId:n,data:a,outputPath:s,lmctlNextVersion:it(),sanitized:!r.noSanitize})}catch(d){if(d instanceof br)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2388
2390
|
`),2;throw d}let c=await XS({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
|
|
2389
2391
|
`):(e.stdout.write(`ticket: ${n}
|
|
2390
2392
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2391
2393
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2392
2394
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2393
|
-
`),1}}function KS(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!
|
|
2394
|
-
`)}var YS=T(()=>{"use strict";Fn();JS();jf();zs();GS();Ye();ke()});var rk={};le(rk,{ATTENTION_STATES:()=>Cf,DAEMON_INTERVAL_FAST_MS:()=>Lf,REQUIRED_TEAM_ALIASES:()=>zS,chooseDiagnoses:()=>ek,collectEvidence:()=>QS,diagnose:()=>ZS,renderReport:()=>tk,runDiagnosePrompt:()=>
|
|
2395
|
+
`),1}}function KS(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!j2(o))return`unknown section: ${o} (expected one of ${Zs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function j2(t){return Zs.includes(t)}function A2(t){return $2(N2(),`lmctl-diag-${t}.tar.gz`)}function R2(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
|
|
2396
|
+
`)}var YS=T(()=>{"use strict";Fn();JS();jf();zs();GS();Ye();ke()});var rk={};le(rk,{ATTENTION_STATES:()=>Cf,DAEMON_INTERVAL_FAST_MS:()=>Lf,REQUIRED_TEAM_ALIASES:()=>zS,chooseDiagnoses:()=>ek,collectEvidence:()=>QS,diagnose:()=>ZS,renderReport:()=>tk,runDiagnosePrompt:()=>C2});function ZS(t,e){let r=QS(t,e),n=ek(r);return tk(r,n)}function QS(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Ns(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=L2(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=zS.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function ek(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>Lf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Lf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Cf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function tk(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${O2(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Cf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
|
|
2395
2397
|
`)+`
|
|
2396
|
-
`}function
|
|
2398
|
+
`}function O2(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function L2(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function C2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Of()}
|
|
2397
2399
|
`),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
|
|
2398
2400
|
`),e.stderr.write(`${Of()}
|
|
2399
2401
|
`),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2400
2402
|
`),e.stderr.write(`${Of()}
|
|
2401
2403
|
`),2;let n=r[0];try{return await L(e,s=>(e.stdout.write(ZS(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2402
2404
|
`),1}}function Of(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
|
|
2403
|
-
`)}var zS,Lf,Cf,nk=T(()=>{"use strict";id();ke();zS=["Coder","Reviewer1","Polisher"],Lf=3e4,Cf=new Set(["attention_needed","paused","escalation"])});var ak={};le(ak,{appendIntent:()=>ik,resolveIntentLogPath:()=>ok,runStatus:()=>
|
|
2404
|
-
`)}catch{}}async function
|
|
2405
|
+
`)}var zS,Lf,Cf,nk=T(()=>{"use strict";id();ke();zS=["Coder","Reviewer1","Polisher"],Lf=3e4,Cf=new Set(["attention_needed","paused","escalation"])});var ak={};le(ak,{appendIntent:()=>ik,resolveIntentLogPath:()=>ok,runStatus:()=>H2});import{appendFileSync as M2,mkdirSync as D2}from"node:fs";import{homedir as P2}from"node:os";import{dirname as F2,join as U2}from"node:path";function ok(){return process.env.LMCTL_INTENT_LOG??U2(P2(),".lmctl","recent-intents.log")}function ik(t){try{let e=ok();D2(F2(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});M2(e,`${r}
|
|
2406
|
+
`)}catch{}}async function H2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(q2),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=x(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):L(e,i=>{let a=J2(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
|
|
2405
2407
|
`),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
|
|
2406
|
-
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=
|
|
2408
|
+
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=X2(i,l,a.source);return o?B(e,c):e.stdout.write(z2(c)),ik({verb:"status",args:t}),0})}function J2(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=hf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function X2(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=G2(t,e.id,B2),a=K2(t,e.id),l=V2(t,e.id,W2);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:Y2(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function G2(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function K2(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function V2(t,e,r){return t.db.prepare(`
|
|
2407
2409
|
SELECT r.*, w.name AS workflow_name
|
|
2408
2410
|
FROM run r
|
|
2409
2411
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2411,13 +2413,13 @@ per-project workflow bindings and routing conditions.
|
|
|
2411
2413
|
WHERE j.project_id = ?
|
|
2412
2414
|
ORDER BY r.id DESC
|
|
2413
2415
|
LIMIT ?
|
|
2414
|
-
`).all(e,r)}function
|
|
2415
|
-
`)}var
|
|
2416
|
+
`).all(e,r)}function Y2(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return sk(o,100)}}}catch{}return sk(t,100)}function sk(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function z2(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
|
|
2417
|
+
`)}var W2,B2,q2,lk=T(()=>{"use strict";ke();gf();W2=5,B2=10,q2=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2416
2418
|
|
|
2417
2419
|
Show the current project context, active run, unacked attentions, and recent
|
|
2418
2420
|
runs. Defaults to resolving the project from the current working directory;
|
|
2419
2421
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2420
|
-
`});Ye();Fn()
|
|
2422
|
+
`});Ye();Fn();$e();import{pathToFileURL as Z2}from"node:url";to();Fn();import{mkdirSync as tv,readFileSync as rv,renameSync as nv,writeFileSync as sv}from"node:fs";import{homedir as ov}from"node:os";import{dirname as iv,join as av}from"node:path";var lv="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",cv=60*60*1e3,uv=1500;function dv(){let t=process.env.HOME??ov();return av(t,".lmctl",".update-check.json")}function fv(t){return t.isTTY===!0}function mv(t,e){let r=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},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function al(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!fv(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function pv(t,e){try{let r=JSON.parse(rv(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<cv)return r.latest}catch{}return null}function hv(t,e){tv(iv(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;sv(r,`${JSON.stringify(e)}
|
|
2421
2423
|
`,"utf8"),nv(r,t)}async function _v(){let t=await Tr(lv,{description:"lmctl npm metadata",timeoutMs:uv}),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 sm(t,e=[],r={}){try{if(al(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??dv();if(pv(s,n)!==null)return;let i=await(r.fetchLatest??_v)();try{hv(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??it();mv(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2422
2424
|
`)}catch{}}var Pf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2423
2425
|
`,Mf=`${Pf}
|
|
@@ -2470,10 +2472,10 @@ Run 'lmctl help <command>' for command-specific help.
|
|
|
2470
2472
|
${Pf}Run 'lmctl help' for usage.
|
|
2471
2473
|
`),2}function dk(t,e){return t.stderr.write(`error: unknown command: ${e}
|
|
2472
2474
|
${Pf}Run 'lmctl help' for usage.
|
|
2473
|
-
`),1}async function
|
|
2475
|
+
`),1}async function Q2(t,e={stdout:process.stdout,stderr:process.stderr}){let r=tm();try{return await eq(t,e)}finally{rm(r)}}async function eq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Df(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Df(e,"missing value for --workspace");if(!He(l))return Df(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){em();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${it()}
|
|
2474
2476
|
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Mf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Mf),0):ck.has(i)?uk(i,[...a,"--help"],e):dk(e,i)}Bf(ue(),e.stderr),Hf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Mf),0;il()&&e.stderr.write(`[debug] lmctl ${it()} | node ${process.version} | cmd ${s} ${o.join(" ")}
|
|
2475
2477
|
[debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
|
|
2476
|
-
`);try{let i=await uk(s,o,e);return ck.has(s)&&!al(r,e)&&await sm(e,r),i}catch(i){return
|
|
2478
|
+
`);try{let i=await uk(s,o,e);return ck.has(s)&&!al(r,e)&&await sm(e,r),i}catch(i){return tq(i,s,o,e)}}function tq(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!il())return n.stderr.write(`error: ${s.message}
|
|
2477
2479
|
`),n.stderr.write(`(re-run with --debug for the full stack trace and context)
|
|
2478
2480
|
`),1;n.stderr.write(`error: ${s.message}
|
|
2479
2481
|
`),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
|
|
@@ -2481,10 +2483,10 @@ ${Pf}Run 'lmctl help' for usage.
|
|
|
2481
2483
|
`),s.stack&&n.stderr.write(`${s.stack}
|
|
2482
2484
|
`);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
|
|
2483
2485
|
`),a.stack&&n.stderr.write(`${a.stack}
|
|
2484
|
-
`),o=a.cause,i+=1}return 1}async function uk(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(kc(),Eh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Gc(),t_));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(cb(),lb));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(db(),ub));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(qb(),Bb));return n(e,r)}case"jobs":{let{runJobs:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(uT(),cT));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(wT(),gT));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(ET(),yT));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ST(),TT));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(qd(),Yb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(vT(),kT));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>($T(),NT));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(eS(),QT));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(sS(),nS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(lS(),aS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(kf(),Sf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(kf(),Sf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(RS(),AS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(MS(),CS));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(YS(),VS));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(nk(),rk));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(lk(),ak));return n(e,r)}case"db":return
|
|
2486
|
+
`),o=a.cause,i+=1}return 1}async function uk(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(kc(),Eh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Gc(),t_));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(cb(),lb));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(db(),ub));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(qb(),Bb));return n(e,r)}case"jobs":{let{runJobs:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(uT(),cT));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(wT(),gT));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(ET(),yT));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ST(),TT));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(qd(),Yb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(vT(),kT));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>($T(),NT));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(eS(),QT));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(sS(),nS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(lS(),aS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(kf(),Sf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(kf(),Sf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(RS(),AS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(MS(),CS));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(YS(),VS));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(nk(),rk));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(lk(),ak));return n(e,r)}case"db":return rq(e,r);default:return dk(r,t)}}function rq(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2485
2487
|
|
|
2486
2488
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2487
2489
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2488
2490
|
`),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2489
2491
|
`),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2490
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2492
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===Z2(process.argv[1]).href){let t=await Q2(process.argv.slice(2));process.exitCode=t}export{Q2 as runCli};
|