@lmctl-ai/lmctl 0.1.71 → 0.1.72
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 +146 -144
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -12,7 +12,7 @@ var gk=Object.defineProperty;var b=(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 Gk(t){let e=it(),r=process.version,n=sl("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Yf(i);let u=sl("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 Yf(a);let u=sl("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 Wk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Kf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Kk(){return process.env.LMCTL_INTENT_LOG??Fk(Pk(),".lmctl","recent-intents.log")}async function Vk(t){let e=t.intentLog??Kk(),r=t.intentLogTailLines??500;try{let s=(await il(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,Wk,ol,Fn=b(()=>{"use strict";zs();Zs=["serve","db","runs","jobs","attentions","env","intents"];Wk=["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"];ol=["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 em,appendFileSync as Yk,mkdirSync as zk,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,Wk,ol,Fn=b(()=>{"use strict";zs();Zs=["serve","db","runs","jobs","attentions","env","intents"];Wk=["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"];ol=["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 em,appendFileSync as Yk,mkdirSync as zk,existsSync as kq,readdirSync as vq,unlinkSync as Iq}from"node:fs";import{join as eo,dirname as Zk}from"node:path";import{homedir as Qk}from"node:os";function al(){return eo(Qk(),".lmctl")}function tm(){Hr=!0,process.env.LMCTL_DEBUG="1"}function rm(){return{cliDebug:Hr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function nm(t){Hr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function we(){if(Hr)return!0;let t=Date.now();return t-Qf>=ev&&(Zf=nv(),Qf=t),Zf}function ll(){return Hr||process.env.LMCTL_DEBUG==="1"}function tv(){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(!Hr)return}else if(!e?.always&&!we())return;try{rv();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};Yk(Qs,JSON.stringify(r)+`
|
|
16
16
|
`)}catch{}}function rv(){if(!Qs){let e=tv().slice(0,13).replace("T","-");Qs=eo(al(),`debug-${e}.log`)}zk(Zk(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 nv(){return sv()||ov()}function sv(){try{let t=em(eo(al(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
17
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 ov(){try{let t=em(eo(al(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Hr,Zf,Qf,ev,Qs,$e=b(()=>{"use strict";Hr=!1,Zf=!1,Qf=0,ev=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 br(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 sm(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 sm(t,e.description,n,a)}}finally{clearTimeout(o)}}function sm(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=b(()=>{"use strict"});import{existsSync as Tv}from"node:fs";import{createRequire as Sv}from"node:module";function kv(){return ul===null&&(ul=Sv(import.meta.url)("node:sqlite").DatabaseSync),ul}function dl(t){return t.length===1&&vv(t[0])?[t[0]]:t}function vv(t){if(!pl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function pl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ul,fl,ro,ml,hl=b(()=>{"use strict";ul=null;fl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!Tv(e))throw new Error("unable to open database file");this.name=e,this.handle=new(kv())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new ml(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=fl,ml=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...dl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...dl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...dl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&pl(e)?Object.values(e):pl(e)?{...e}:e}}});import{existsSync as Iv,mkdirSync as Nv,readFileSync as $v}from"node:fs";import{homedir as xv}from"node:os";import{dirname as im,join as jv,resolve as am}from"node:path";import{fileURLToPath as Av,pathToFileURL as Rv}from"node:url";function gl(t){t.dbPath!==":memory:"&&Nv(im(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=cm(e);return r===0&&(e.exec($v(Ov,"utf8")),e.pragma(`user_version = ${_l}`)),Cv(e,r),e}function Cv(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
|
|
18
18
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
@@ -1054,7 +1054,7 @@ var gk=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
1054
1054
|
ORDER BY id ASC
|
|
1055
1055
|
`)}}function qv(t,e){return t.status==="pending"?!0:t.status!=="running"?!1:t.locked_until!==null&&t.locked_until<e||t.worker_pid!==null&&!Hv(t.worker_pid)}function Hv(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 gm(t){if(t.length===0||t==="operator")return!1;let e=t.lastIndexOf(":");return e>0&&e<t.length-1}function wm(t){if(Buffer.byteLength(t,"utf8")<=mm)return t;let r=Buffer.byteLength(pm,"utf8"),n=Math.max(0,mm-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${pm}`}function Jv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var mm,pm,El,Ue=b(()=>{"use strict";wl();Bn();mm=256*1024,pm=`
|
|
1056
1056
|
...[truncated]`;El=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;claimDelegationJobTxn;finalizeDelegationJobTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Bv(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)=>Jv("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:dm};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(!qv(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,wm(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){hm(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){hm(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=Fv(),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 gm(e)?this.stmts.listDeliverableDelegationJobs.all(e):[]}markDelegationJobDelivered(e){return this.stmts.markDelegationJobDelivered.run(C(),e),this.getDelegationJob(e)}claimDeliverableDelegationJobs(e){if(!gm(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,wm(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 Xv}from"node:fs";import{resolve as Gv}from"node:path";function Tl(t){let e=Gv(t);try{return Xv(e)}catch{return e}}var ym=b(()=>{"use strict"});import{platform as Em}from"node:os";function wt(t){let e=new qn;for(let r of t)e.registerAdapter(r);return e}var qn,Sl=b(()=>{"use strict";ym();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=Tl(e.workspace);o=o.filter(a=>Tl(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=Em()==="darwin"||Em()==="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 bm}from"node:fs";import{createInterface as Tm}from"node:readline";import{stat as Kv}from"node:fs/promises";import{homedir as Vv}from"node:os";async function*We(t){let e=bm(t,{encoding:"utf-8"}),r=Tm({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=bm(t,{encoding:"utf-8"}),s=Tm({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 Kv(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=b(()=>{"use strict";ve=Vv()});import{readdir as oo,stat as Sm,unlink as Yv}from"node:fs/promises";import{join as Xr,basename as km}from"node:path";function zv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Zv(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 vm(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,Im=b(()=>{"use strict";Vt();io=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Xr(ve,".claude"),this.projectsDir=Xr(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=Xr(this.projectsDir,n);if(!(await Sm(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=km(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Xr(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(!zv(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 vm(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:Zv(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 T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.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 T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await vm(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 Yv(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=Xr(this.projectsDir,i);if(!(await Sm(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=km(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Xr(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 e0(t,e,r){if(!r)return"";let n=t.tools[e]??kl[e],s=n?.profiles?.[r]?.flags??kl[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 Nm(t,e){return!!t.tools[e]}function $m(t,e,r,n,s){let o=t.tools[e]??kl[e],i;if(o?.agent){let l=ao(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Qv[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=e0(t,e,s);return a&&(i+=" "+a),i}var kl,Qv,xm=b(()=>{"use strict";kl={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:""}}}},Qv={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 jm(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 Am=b(()=>{"use strict"});var t0,Ae,lo,Rt=b(()=>{"use strict";t0="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: ${t0}`,lo=`send this exact lmctl seed instruction: "${Ae}"`});function Tr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function r0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Hn]:e}}function ze(t,e,r){return r0(Tr(t,e),r)}var Hn,yt=b(()=>{"use strict";Hn="LMCTL_SELF_SESSIONID"});import{spawn as Rm}from"node:child_process";import{mkdirSync as n0}from"node:fs";var vl,Ce,Yt=b(()=>{"use strict";xm();Am();Rt();yt();vl=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 n0(e,{recursive:!0}),new Promise(n=>{let s;try{s=Rm(this.binary,this.seedArgsFor(r),{cwd:e,env:Tr(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}
|
|
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=b(()=>{"use strict";ve=Vv()});import{readdir as oo,stat as Sm,unlink as Yv}from"node:fs/promises";import{join as Xr,basename as km}from"node:path";function zv(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Zv(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 vm(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,Im=b(()=>{"use strict";Vt();io=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Xr(ve,".claude"),this.projectsDir=Xr(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=Xr(this.projectsDir,n);if(!(await Sm(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=km(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Xr(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(!zv(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 vm(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:Zv(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 T of _)if(T.type==="tool_result"){let y=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:T.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 T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await vm(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 Yv(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=Xr(this.projectsDir,i);if(!(await Sm(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=km(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Xr(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 e0(t,e,r){if(!r)return"";let n=t.tools[e]??kl[e],s=n?.profiles?.[r]?.flags??kl[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 Nm(t,e){return!!t.tools[e]}function $m(t,e,r,n,s){let o=t.tools[e]??kl[e],i;if(o?.agent){let l=ao(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Qv[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=e0(t,e,s);return a&&(i+=" "+a),i}var kl,Qv,xm=b(()=>{"use strict";kl={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:""}}}},Qv={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 jm(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 Am=b(()=>{"use strict"});var t0,Ae,lo,Rt=b(()=>{"use strict";t0="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: ${t0}`,lo=`send this exact lmctl seed instruction: "${Ae}"`});function Tr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function r0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Hn]:e}}function ze(t,e,r){return r0(Tr(t,e),r)}var Hn,yt=b(()=>{"use strict";Hn="LMCTL_SELF_SESSIONID"});import{spawn as Rm}from"node:child_process";import{mkdirSync as n0}from"node:fs";var vl,Ce,Yt=b(()=>{"use strict";xm();Am();Rt();yt();vl=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 n0(e,{recursive:!0}),new Promise(n=>{let s;try{s=Rm(this.binary,this.seedArgsFor(r),{cwd:e,env:Tr(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&&Nm(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 vl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=$m(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=jm(r.env),c=Rm(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,Gr=b(()=>{"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 Nl from"node:child_process";function o0(t){if(typeof Nl.spawnSync=="function")try{Nl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Om(t){return t.exitCode!==null||t.signalCode!==null}function Il(t,e){return Om(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??o0;if(Om(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Il(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 Il(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Il(t,s0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var s0,fo=b(()=>{"use strict";s0=1e3});function Lm(t){we()&&process.stderr.write(`[debug] ${t}
|
|
1059
1059
|
`)}function Kr(t,e){let r=a0[t];if(r)return r[e]??r.yolo}function c0(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(l0.has(t)){Lm(`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"?Kr(t,"plan"):i0[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(!c0(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)}Lm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var i0,a0,l0,Jn=b(()=>{"use strict";Gr();$e();i0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},a0={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"]}};l0=new Set(["codex","opencode"])});import{spawn as u0}from"node:child_process";import{existsSync as d0}from"node:fs";function m0(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
|
|
|
@@ -1070,9 +1070,9 @@ ${r}`:r}function Cm(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.b
|
|
|
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
|
-
${r}`:r}function F0(t,e){let r=M0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function U0(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 Pm(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=A0(a);try{zt("codex",o,a)}catch(F){return n(F)}if(e.cwd&&!$0(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=I0(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=N0({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),
|
|
1073
|
+
${r}`:r}function F0(t,e){let r=M0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function U0(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 Pm(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=A0(a);try{zt("codex",o,a)}catch(F){return n(F)}if(e.cwd&&!$0(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=I0(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=N0({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),y=L0(),k=D0();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
|
-
`)}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),Dm(U,
|
|
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),Dm(U,y,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})}Dm(U,y,e.onDelta,R)}if(J==="turn/completed"){let W=U.params;if(we())for(let[I,N]of y.agentItems.entries())N.buffer&&Zt("turn/completed/unflushed-item",{itemId:I,phase:N.phase,bufferLen:N.buffer.length});C0(y),we()&&Zt("turn/completed",{params:W??null});let z=U0(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=F0(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:y.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,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(P0({exitCode:F,stderr:A})))}}),(async()=>{try{if(await $("initialize",O0()),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
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 R0,Fm=b(()=>{"use strict";$e();$e();Gr();fo();Jn();$l();$e();yt();R0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(x0(j0(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 xl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:Um},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Wm.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(Bm.map(t=>[t,{name:t}]))}})}function qm(){return[...Object.keys(Um).map(t=>`github-copilot/${t}`),...Wm.map(t=>`deepseek/${t}`),...Bm.map(t=>`openrouter/${t}`)].sort()}var Um,Wm,Bm,jl=b(()=>{"use strict";Um={"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")},Wm=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Bm=["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 Gm,mkdirSync as W0,readFileSync as Km,writeFileSync as Hm}from"node:fs";import{join as Xn,resolve as B0}from"node:path";function Xm(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:q0}}function H0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function ho(t){return structuredClone(t)}function Vm(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 Al(t,e,r={existsSync:Gm,readFileSync:Km}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=B0(e,s.sessiondir??e);for(let i of J0(o)){let a=X0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Vm(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 J0(t){return[Xn(t,".opencode","opencode.jsonc"),Xn(t,"opencode.jsonc"),Xn(t,"opencode.json")]}function X0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(G0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function G0(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(Vr("lmctl","lmctl_chat",e),!Gm(n)){W0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:xl(),mcp:{lmctl:Xm()}},null,2);return Hm(n,l+`
|
|
1078
1078
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Km(n,"utf-8"))}catch{return console.log(Jm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Jm.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),Vm(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.`}),K0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Xm();return H0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&Hm(n,JSON.stringify(s,null,2)+`
|
|
@@ -1082,26 +1082,26 @@ ${e}
|
|
|
1082
1082
|
|
|
1083
1083
|
${r}`:r}function iI(t){let e=[...t.matchAll(tI)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return zm(t.slice(n).trimStart())}return zm(aI(t.replace(rI,"")))}function aI(t){let e=nI.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(sI)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function zm(t){let e=[...t.matchAll(oI)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Qm(t,e){let r=Q0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{_o(e.cwd)}catch(v){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:v instanceof Error?v.message:String(v)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let v=Kr("gemini","plan"),A=Kr("gemini","yolo");a=a.filter(F=>!(A??[]).includes(F)),v&&a.push(...v)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
|
|
1084
1084
|
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{zt(e.tool,a,l)}catch(v){return s(v)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
|
|
1085
|
-
`),e.cwd&&!Y0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=V0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:ze(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),at(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),at(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=z0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function
|
|
1085
|
+
`),e.cwd&&!Y0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=V0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:ze(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),at(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),at(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=z0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function y(v,A={}){return new Promise((F,U)=>{let J=eI++;m.set(J,{resolve:F,reject:U});let R=JSON.stringify({jsonrpc:"2.0",id:J,method:v,params:A});At({event:"acp_send",direction:"SEND",provider:e.tool,method:v,id:J,params:A}),c.stdin?.write(R+`
|
|
1086
1086
|
`)})}f.on("line",v=>{let A;try{A=JSON.parse(v)}catch{return}if(At({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof A.id=="number"?A.id:void 0,method:typeof A.method=="string"?A.method:void 0,preview:JSON.stringify(A).slice(0,300)}),e.onEvent?.(A),typeof A.id=="number"&&m.has(A.id)){let U=m.get(A.id);if(m.delete(A.id),A.error){let J=A.error,R=typeof J?.message=="string"&&J.message.length>0?J.message:JSON.stringify(A.error);U.reject(uo(`ACP RPC error: ${R}`,J))}else U.resolve(A);return}let F=A.method;if(F){if(typeof A.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:F,id:A.id,params:A.params});let U=JSON.stringify({jsonrpc:"2.0",id:A.id,error:{code:-32601,message:`Method not found: ${F} (lmctl does not implement server-side ACP methods)`}});At({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:A.id,error:"method not found"}),c.stdin?.write(U+`
|
|
1087
1087
|
`);return}if(F==="session/update"){let J=A.params?.update;if(J?.sessionUpdate==="agent_message_chunk"){let W=J.content?.text||"";W&&T&&(h+=W,e.onDelta?.(W))}}}});let k="";c.stderr?.on("data",v=>{k+=v.toString()}),c.on("error",v=>{Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),s(new be(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${v.message}`,{cause:v}))}),c.on("exit",v=>{d||(_?n({result:e.tool==="gemini"?iI(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:v}):(Z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(Z0({tool:e.tool,exitCode:v,stderr:k})))))});function $(v,A={}){let F=JSON.stringify({jsonrpc:"2.0",method:v,params:A});c.stdin?.write(F+`
|
|
1088
|
-
`)}(async()=>{try{if(await
|
|
1089
|
-
`),p=(await
|
|
1090
|
-
`)}if(e.effort&&e.tool==="opencode")try{await
|
|
1091
|
-
`)}h="",T=!0,_t(`acp: prompt sent (${t.length} chars)`),g=(await
|
|
1088
|
+
`)}(async()=>{try{if(await y("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),$("notifications/initialized"),e.sessionId)try{p=(await y("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
|
+
`),p=(await y("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await y("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await y("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
|
+
`)}if(e.effort&&e.tool==="opencode")try{await y("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="",T=!0,_t(`acp: prompt sent (${t.length} chars)`),g=(await y("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 Q0,eI,Zm,tI,rI,nI,sI,oI,ep=b(()=>{"use strict";$e();Gr();fo();Jn();go();$e();yt();Q0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},eI=1,Zm="(?:png|jpe?g|webp|heic|pdf)",tI=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Zm}\\s*`,"gi"),rI=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Zm}\\s*`,"i"),nI=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,sI=/^STANCE:\s+\S+\s*$/gim,oI=/\[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 tp(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=lI){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 cI(){let t=new Map;return(e,r)=>{uI(e,tp(t,r))}}function uI(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?cI():void 0,s=await Cm(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 dI(){let t=new Map;return(e,r)=>{fI(e,tp(t,r))}}function fI(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 Yr(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?dI():void 0,s=await Qm(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 mI(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
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 rp(t,e){let r=await Pm(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=>mI(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var lI,Sr=b(()=>{"use strict";Mm();Fm();ep();$e();lI=256});function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Im();Yt();Sr();Rt();Rl=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 pI,stat as np,unlink as hI}from"node:fs/promises";import{join as Gn,basename as _I}from"node:path";function gI(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Kn(t,e,r){let n=gI(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function sp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function wI(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 op(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=wI(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,ip=b(()=>{"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 np(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 pI(e)}catch{return r}for(let s of n){let o=Gn(e,s),i=await np(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=_I(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 op(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:sp(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=sp(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 T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let
|
|
1096
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}async function op(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=wI(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,ip=b(()=>{"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 np(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 pI(e)}catch{return r}for(let s of n){let o=Gn(e,s),i=await np(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=_I(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 op(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:sp(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=sp(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 T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let y=T.text.trim();c||(c=K(y,80)),u=K(y,80),Kn(s,m,{role:"user",timestamp:g,content:de(y)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&Kn(s,m,{role:"assistant",timestamp:g,content:de(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&Kn(s,m,{role:"system",timestamp:g,content:de(T.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 T=_.summary.map(y=>yo(y.text)).join(`
|
|
1097
1097
|
`);T.trim()&&Kn(s,m,{role:"thinking",timestamp:g,content:de(T)});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 op(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 hI(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 Ml(t){return new Cl(t)}var Cl,Dl=b(()=>{"use strict";ip();Yt();Sr();Rt();Cl=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:rp})}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?yI(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 yI(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&ap(t.tokens)&&ap(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function ap(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function lp(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 Pl=b(()=>{"use strict"});import{createHash as EI}from"node:crypto";import{readdir as Yn,readFile as cp,stat as To,unlink as bI}from"node:fs/promises";import{join as Xe,basename as TI,dirname as SI}from"node:path";import{cwd as kI}from"node:process";function up(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function dp(t){return t==="user"}function Fl(t){return t==="gemini"||t==="assistant"}function kr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function vI(t){return`${t.sessionId}\0${t.cwd}`}function II(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 fp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Fl(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 NI(t){return EI("sha256").update(t).digest("hex")}function zn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=SI(r);if(n===r)break;r=n}}var ko,mp=b(()=>{"use strict";Vt();Pl();$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=vI(s),i=r.get(o);r.set(o,i?II(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 _=kr(g.timestamp),T=g.type,
|
|
1102
|
-
`).trim();v&&o.push({role:"thinking",timestamp:kr($.timestamp,_),content:de(v)})}o.push({role:"assistant",timestamp:_,content:
|
|
1101
|
+
`}var Pl=b(()=>{"use strict"});import{createHash as EI}from"node:crypto";import{readdir as Yn,readFile as cp,stat as To,unlink as bI}from"node:fs/promises";import{join as Xe,basename as TI,dirname as SI}from"node:path";import{cwd as kI}from"node:process";function up(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function dp(t){return t==="user"}function Fl(t){return t==="gemini"||t==="assistant"}function kr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function vI(t){return`${t.sessionId}\0${t.cwd}`}function II(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 fp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Fl(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 NI(t){return EI("sha256").update(t).digest("hex")}function zn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=SI(r);if(n===r)break;r=n}}var ko,mp=b(()=>{"use strict";Vt();Pl();$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=vI(s),i=r.get(o);r.set(o,i?II(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 _=kr(g.timestamp),T=g.type,y=de(up(g.content));if(dp(T)){let $=y.trim();$&&(u||(u=K($,80)),d=K($,80)),o.push({role:"user",timestamp:_,content:$||y});continue}if(Fl(T)){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:kr($.timestamp,_),content:de(v)})}o.push({role:"assistant",timestamp:_,content:y,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${y}`.trim()})}let m=kr(n.startTime,s.createdAt),p=kr(n.lastUpdated,s.modifiedAt),h=fp(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(dp(m.type)){d++;let p=up(m.content).trim();p&&(l||(l=K(de(p),80)),c=K(de(p),80))}else Fl(m.type)&&(d++,m.model&&(u=m.model));let f=fp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:kr(r.startTime,n.createdAt),modifiedAt:kr(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 cp(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=TI(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 bI(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:kr(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,kI());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(NI(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await cp(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 $I,writeFileSync as xI,mkdirSync as jI}from"node:fs";import{join as AI,dirname as RI}from"node:path";import{randomUUID as OI}from"node:crypto";function Wl(t){return new Ul(t)}var Ul,Bl=b(()=>{"use strict";mp();Yt();Sr();Rt();Pl();Ul=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)=>Yr(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=$I(n,"utf-8"),o=Vn(s),i=bo(s),a=OI();i.sessionId=a,i.kind="main";let l=RI(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=AI(l,d);return jI(l,{recursive:!0}),xI(f,lp(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 pp,readFile as LI,rm as CI,stat as zr}from"node:fs/promises";import{basename as MI,join as lt}from"node:path";function DI(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 vr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function PI(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,hp=b(()=>{"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 pp(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||MI(r)||e;if(o)for await(let _ of We(s)){let T=vr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=vr(_.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
|
|
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 vr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function PI(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,hp=b(()=>{"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 pp(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||MI(r)||e;if(o)for await(let _ of We(s)){let T=vr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=vr(_.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 y=_.data.content||"",k=y.trim();k&&(m||(m=K(k,80)),p=K(k,80)),l.push({role:"user",timestamp:T,content:de(k||y)});continue}if(_.type==="assistant.message"&&_.data){let y=(_.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:T,content:de(y),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,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 y=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(y),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let y=_.data?.message||"";y.trim()&&l.push({role:"system",timestamp:T,content:de(y)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=K(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??vr(n?.created_at)??a.createdAt,modifiedAt:vr(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=vr(_.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 T=(_.data.content||"").trim();T&&(p||(p=K(T,80)),h=K(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=K(_,80))}let g=o?await PI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??vr(n?.created_at)??a.createdAt,modifiedAt:vr(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 LI(r,"utf-8");return DI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await CI(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await pp(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 ql(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)=>Yr(e,{...r,acpTool:"copilot"})})}var Hl=b(()=>{"use strict";hp();Yt();Sr();Rt()});import{existsSync as _p}from"node:fs";import{join as Io}from"node:path";import{createRequire as FI}from"node:module";function gp(){return Jl===null&&(Jl=FI(import.meta.url)("node:sqlite").DatabaseSync),Jl}function UI(){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 Jl,No,wp=b(()=>{"use strict";Vt();Jl=null;No=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=UI().find(r=>_p(r))??null}openDb(){return!this.dbPath||!_p(this.dbPath)?null:new(gp())(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
|
|
@@ -1174,7 +1174,7 @@ ${r}`:r}function iI(t){let e=[...t.matchAll(tI)];if(e.length>0){let r=e[e.length
|
|
|
1174
1174
|
JOIN run r ON r.id = s.run_id
|
|
1175
1175
|
JOIN job j ON j.id = r.job_id
|
|
1176
1176
|
WHERE j.project_id = ? AND s.outcome IS NOT NULL
|
|
1177
|
-
${n!==null?"AND r.started_at >= ?":""}`,...s),i=new Map,a=0,l=0;for(let
|
|
1177
|
+
${n!==null?"AND r.started_at >= ?":""}`,...s),i=new Map,a=0,l=0;for(let y of o){let k=i.get(y.state_name)??{total:0,rc:0};k.total++,y.outcome==="request_changes"&&k.rc++,i.set(y.state_name,k),a++,y.outcome==="request_changes"&&l++}let c=[...i.entries()].map(([y,k])=>({state_name:y,total:k.total,request_changes:k.rc,rate_pct:k.total>0?`${(k.rc/k.total*100).toFixed(1)}%`:"0.0%"})),u={total:a,request_changes:l,rate_pct:a>0?`${(l/a*100).toFixed(1)}%`:"0.0%",by_state:c},d=t.query(`SELECT s.state_name,
|
|
1178
1178
|
CAST((julianday(s.ended_at) - julianday(s.started_at)) * 86400000 AS INTEGER) AS duration_ms
|
|
1179
1179
|
FROM step s
|
|
1180
1180
|
JOIN run r ON r.id = s.run_id
|
|
@@ -1186,14 +1186,14 @@ ${r}`:r}function iI(t){let e=[...t.matchAll(tI)];if(e.length>0){let r=e[e.length
|
|
|
1186
1186
|
JOIN job j ON j.id = r.job_id
|
|
1187
1187
|
WHERE j.project_id = ? AND s.ended_at IS NULL
|
|
1188
1188
|
${n!==null?"AND r.started_at >= ?":""}
|
|
1189
|
-
GROUP BY s.state_name`,...f),p=new Map;for(let
|
|
1189
|
+
GROUP BY s.state_name`,...f),p=new Map;for(let y of d){let k=p.get(y.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},$=y.duration_ms;$<3e5?k.lt5++:$<9e5?k.btw5_15++:$<36e5?k.btw15_60++:k.gt60++,p.set(y.state_name,k)}for(let y of m){let k=p.get(y.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};k.noEnd+=y.cnt,p.set(y.state_name,k)}let h=[...p.entries()].map(([y,k])=>({state_name:y,lt_5min:k.lt5,btw_5_15min:k.btw5_15,btw_15_60min:k.btw15_60,gt_60min:k.gt60,no_end:k.noEnd})),g=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
|
|
1190
1190
|
FROM step s
|
|
1191
1191
|
JOIN run r ON r.id = s.run_id
|
|
1192
1192
|
JOIN job j ON j.id = r.job_id
|
|
1193
1193
|
WHERE j.project_id = ?
|
|
1194
1194
|
${n!==null?"AND r.started_at >= ?":""}
|
|
1195
1195
|
GROUP BY s.run_id, s.state_name
|
|
1196
|
-
HAVING COUNT(*) > 1`,...s),_=new Map;for(let
|
|
1196
|
+
HAVING COUNT(*) > 1`,...s),_=new Map;for(let y of g){let k=_.get(y.state_name)??{runs:0,total_attempts:0};k.runs++,k.total_attempts+=y.attempt_count,_.set(y.state_name,k)}let T=[..._.entries()].map(([y,k])=>({state_name:y,retried_runs:k.runs,avg_retries:k.runs>0?Number((k.total_attempts/k.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:T}}function kc(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
|
|
1197
1197
|
FROM session_event se
|
|
1198
1198
|
JOIN run r ON r.id = se.run_id
|
|
1199
1199
|
JOIN job j ON j.id = r.job_id
|
|
@@ -1236,17 +1236,17 @@ ${r}`:r}function iI(t){let e=[...t.matchAll(tI)];if(e.length>0){let r=e[e.length
|
|
|
1236
1236
|
json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function oh(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function rn(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?oh(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
|
|
1237
1237
|
FROM interactive_session
|
|
1238
1238
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1239
|
-
ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),
|
|
1239
|
+
ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),y="pending",k=null;if(g.startsWith("@terminal:"))y=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?y=_&&u===g?"paused":"running":T.outcome===null?y="failed":y="done",T.ended_at!==null)){let $=Date.parse(T.started_at),v=Date.parse(T.ended_at);!Number.isNaN($)&&!Number.isNaN(v)&&(k=v-$)}_&&u===g&&(y="paused"),h.push({id:g,status:y,is_current:_,elapsed_ms:k,prompt:_&&y==="paused"?f:null,expected:_&&y==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Jo(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...$N(o));return`${e.join(`
|
|
1240
1240
|
`)}
|
|
1241
1241
|
`}function $N(t){let e=[],r=xN(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function xN(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Xo(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?oh(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
|
|
1242
1242
|
FROM session_event
|
|
1243
1243
|
WHERE run_id = ? AND step_id IS NOT NULL
|
|
1244
|
-
GROUP BY step_id`,e))$.step_id!==null&&h.set($.step_id,$.timestamp_ms);let _=jN(c,d,u),T=AN(s.current_state),
|
|
1244
|
+
GROUP BY step_id`,e))$.step_id!==null&&h.set($.step_id,$.timestamp_ms);let _=jN(c,d,u),T=AN(s.current_state),y=t.query(`SELECT kind, severity, payload
|
|
1245
1245
|
FROM attention
|
|
1246
1246
|
WHERE run_id = ?
|
|
1247
1247
|
AND kind = 'session_hung'
|
|
1248
1248
|
AND acknowledged_at IS NULL
|
|
1249
|
-
ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:PN($.payload)})),k=_.map($=>{let v=f.get($),A=p.get($),F=RN(s,$,T,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=FN(A?.last_activity_at??null,W,g),I=o===null||A===void 0?void 0:CN(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:LN(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:ON(k,s.terminal_state!==null),related_attentions:
|
|
1249
|
+
ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:PN($.payload)})),k=_.map($=>{let v=f.get($),A=p.get($),F=RN(s,$,T,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=FN(A?.last_activity_at??null,W,g),I=o===null||A===void 0?void 0:CN(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:LN(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:ON(k,s.terminal_state!==null),related_attentions:y}}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} (${Gp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Xp(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Xp(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 ${Gp(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}${UN(a.payload)}`)}return`${n.join(`
|
|
1250
1250
|
`)}
|
|
1251
1251
|
`}function jN(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 AN(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function RN(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 ON(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 LN(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 CN(t,e,r,n,s){let o=MN(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 MN(t,e,r){let n=DN(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 DN(t){try{let e=JSON.parse(t);return tr(e)?e:null}catch{return null}}function PN(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 FN(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Xp(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 Gp(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 UN(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 rh,Pt=b(()=>{"use strict";Ue();rh=`SELECT a.id AS attention_id,
|
|
1252
1252
|
a.kind AS kind,
|
|
@@ -1521,9 +1521,9 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
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
|
|
|
1524
|
-
${sn}`:sn;return e.setMemberPromptSnapshot(o.id,l)??o}function Dj(t){return`${Ej(t.local_path)}-code`}var Qh,Vc=b(()=>{"use strict";Zn();Lo();ss();$c();xc();Ue();an();Xc();ke();Ic();Qh="spec-driven-task"});import n_ from"jexl";function ar(t){n_.compile(s_(t))}async function Rr(t,e){return n_.eval(s_(t),e)}function s_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var fn=b(()=>{"use strict"});import{z as y}from"zod";function ru(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var Pj,o_,Yc,zc,Zc,Qc,eu,tu,i_,Fj,Uj,Wj,fs,Bj,yi,Ei,bi,Ti,Si,a_,qj,Hj,Jj,Xj,ki,mn=b(()=>{"use strict";fn();Pj=y.object({kind:y.enum(["success","neutral","failure"])}),o_=y.enum(["string","number","boolean","object","array"]),Yc=y.object({name:y.string().min(1),type:o_,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),zc=y.object({name:y.string().min(1),type:o_,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Zc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Qc="__failure__",eu=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),tu=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),i_=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),Fj=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),Uj=y.union([y.string().min(1),Fj]),Wj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),fs=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(Uj).optional(),skills:y.array(Wj).optional()}),Bj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),yi=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:fs,pre_checks:y.array(Bj).optional(),reviewers:y.array(fs.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Ei=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(fs.extend({topic:y.string().min(1)})).optional(),consolidator:fs,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),bi=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:fs.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),Ti=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Si=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),a_=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{ar(ru(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),qj=y.discriminatedUnion("type",[i_,yi,Ei,bi,Ti,Si,a_]),Hj=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:qj,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{ar(ru(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),Jj=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{ar(ru(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),Xj=y.discriminatedUnion("type",[i_,yi,Ei,bi,Ti,Si,a_,Hj,Jj]),ki=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),Xj),terminals:y.record(y.string().min(1),Pj),errors:tu,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Yc).optional(),outputs:y.array(zc).optional(),triggers:y.array(Zc).optional(),read_only:y.boolean().optional(),requires:eu}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var Gj,vi,Kj,Vj,Yj,St,pn=b(()=>{"use strict";mn();Gj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,vi=Q.string().regex(Gj),Kj=Q.object({step_id:vi,type:Q.literal("main"),index:Q.number().int().min(0)}),Vj=Q.record(vi,Q.record(Q.string().min(1),Q.array(Q.array(Kj)))),Yj=Q.object({id:vi,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),St=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:tu,inputs:Q.array(Yc).optional(),outputs:Q.array(zc).optional(),steps:Q.array(Yj).min(1),connections:Vj.default({}),entry_step_id:vi,triggers:Q.array(Zc).optional(),read_only:Q.boolean().optional(),requires:eu}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Ii(t){return su(t)}function su(t){if(Array.isArray(t))return t.map(su);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=su(e[n]);if(typeof r.type=="string"){let n=Zj[r.type];n!==void 0&&(r.type=n)}return r}var nu,zj,Zj,ou=b(()=>{"use strict";nu="lmctl.builtin.",zj={Review:`${nu}Review`,Research:`${nu}Research`,Consolidate:`${nu}Consolidate`},Zj=Object.fromEntries(Object.entries(zj).map(([t,e])=>[e,t]))});import{readFileSync as Qj}from"node:fs";function u_(t){return eA(t)}function eA(t){let e=Ii(nA(t));if(rA(e),d_(e)===3)return tA(e);let r=ki.safeParse(e);if(!r.success)throw new Ut({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=sA(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ut(n);return r.data}function tA(t){let e=St.safeParse(t);if(!e.success)throw new Ut({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function rA(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=d_(t);if(!(e===null||l_.includes(e)))throw new Ut({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${l_.join(", ")}`}]})}function d_(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function nA(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1524
|
+
${sn}`:sn;return e.setMemberPromptSnapshot(o.id,l)??o}function Dj(t){return`${Ej(t.local_path)}-code`}var Qh,Vc=b(()=>{"use strict";Zn();Lo();ss();$c();xc();Ue();an();Xc();ke();Ic();Qh="spec-driven-task"});import n_ from"jexl";function ar(t){n_.compile(s_(t))}async function Rr(t,e){return n_.eval(s_(t),e)}function s_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var fn=b(()=>{"use strict"});import{z as E}from"zod";function ru(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var Pj,o_,Yc,zc,Zc,Qc,eu,tu,i_,Fj,Uj,Wj,fs,Bj,yi,Ei,bi,Ti,Si,a_,qj,Hj,Jj,Xj,ki,mn=b(()=>{"use strict";fn();Pj=E.object({kind:E.enum(["success","neutral","failure"])}),o_=E.enum(["string","number","boolean","object","array"]),Yc=E.object({name:E.string().min(1),type:o_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),zc=E.object({name:E.string().min(1),type:o_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Zc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Qc="__failure__",eu=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),tu=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),i_=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),Fj=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),Uj=E.union([E.string().min(1),Fj]),Wj=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),fs=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(Uj).optional(),skills:E.array(Wj).optional()}),Bj=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),yi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:fs,pre_checks:E.array(Bj).optional(),reviewers:E.array(fs.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Ei=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(fs.extend({topic:E.string().min(1)})).optional(),consolidator:fs,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),bi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:fs.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Ti=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),Si=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),a_=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{ar(ru(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),qj=E.discriminatedUnion("type",[i_,yi,Ei,bi,Ti,Si,a_]),Hj=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:qj,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((t,e)=>{try{ar(ru(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),Jj=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{ar(ru(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),Xj=E.discriminatedUnion("type",[i_,yi,Ei,bi,Ti,Si,a_,Hj,Jj]),ki=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),Xj),terminals:E.record(E.string().min(1),Pj),errors:tu,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(Yc).optional(),outputs:E.array(zc).optional(),triggers:E.array(Zc).optional(),read_only:E.boolean().optional(),requires:eu}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var Gj,vi,Kj,Vj,Yj,St,pn=b(()=>{"use strict";mn();Gj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,vi=Q.string().regex(Gj),Kj=Q.object({step_id:vi,type:Q.literal("main"),index:Q.number().int().min(0)}),Vj=Q.record(vi,Q.record(Q.string().min(1),Q.array(Q.array(Kj)))),Yj=Q.object({id:vi,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),St=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:tu,inputs:Q.array(Yc).optional(),outputs:Q.array(zc).optional(),steps:Q.array(Yj).min(1),connections:Vj.default({}),entry_step_id:vi,triggers:Q.array(Zc).optional(),read_only:Q.boolean().optional(),requires:eu}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Ii(t){return su(t)}function su(t){if(Array.isArray(t))return t.map(su);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=su(e[n]);if(typeof r.type=="string"){let n=Zj[r.type];n!==void 0&&(r.type=n)}return r}var nu,zj,Zj,ou=b(()=>{"use strict";nu="lmctl.builtin.",zj={Review:`${nu}Review`,Research:`${nu}Research`,Consolidate:`${nu}Consolidate`},Zj=Object.fromEntries(Object.entries(zj).map(([t,e])=>[e,t]))});import{readFileSync as Qj}from"node:fs";function u_(t){return eA(t)}function eA(t){let e=Ii(nA(t));if(rA(e),d_(e)===3)return tA(e);let r=ki.safeParse(e);if(!r.success)throw new Ut({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=sA(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ut(n);return r.data}function tA(t){let e=St.safeParse(t);if(!e.success)throw new Ut({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function rA(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=d_(t);if(!(e===null||l_.includes(e)))throw new Ut({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${l_.join(", ")}`}]})}function d_(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function nA(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1525
1525
|
`)||e.startsWith("{")||e.startsWith("[")?c_(t,"$"):e.endsWith(".json")?c_(Qj(e,"utf8"),e):t}function c_(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ut({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function sA(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),oA(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function oA(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var l_,Ut,f_=b(()=>{"use strict";mn();pn();ou();l_=[1,2,3],Ut=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as iA}from"node:crypto";function m_(t,e){let r=aA(e),n=iA("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function aA(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var p_=b(()=>{"use strict";pn()});function uA(t,e){let r=cA[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function w_(t){let e=[],r=(I,N)=>{throw new hn([{line:I,message:N}])},n=t.split(`
|
|
1526
|
-
`),s=[];for(let I=0;I<n.length;I+=1){let O=mA(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,N,O,X,q,P)=>{l.has(I)&&r(X,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(X,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:N,params:O,line:X,isTerminal:q,...P?{members:P}:{}}),u.push(I)},T=I=>{let N=[],O=I+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;N.push({label:X[1],dst:X[2]})}return{branches:N,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:N,text:O}=s[I],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),P=lr(q[1],N,r);for(let te of Object.keys(P))__.has(te)||r(N,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...__].join(", ")} (no grammar inflation; bounded)`);m=P;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=h_[te];ie===void 0&&r(N,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(h_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:$t}=uA(ie,lr(_e,N,r));_(P,ie,ye,N,!1,Object.keys($t).length>0?$t:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=g_[te];ie===void 0&&r(N,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(g_).join(", ")})`),p.has(P)&&r(N,`duplicate trigger id: ${P}`),p.set(P,{id:P,type:ie,parameters:lr(_e,N,r)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),P=q[1],te=q[2].trim(),_e=X==="mcp"?h:g;_e.has(P)&&r(N,`duplicate ${X} declaration: ${P}`);let ie;if(te.startsWith("{")){let ye=lr(te,N,r);X==="mcp"?ie={...ye,name:P}:((typeof ye.content!="string"||ye.content.length===0)&&r(N,`\`skill ${P}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:P,content:ye.content})}else{let ye=y_(te);(typeof ye!="string"||ye.length===0)&&r(N,`\`${X} ${P}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(P,ie);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},N,!0);continue}if(X==="seq"){let P=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(P.length<3||P.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<P.length+1&&!(te+2>P.length-1);te+=2){let _e=P[te],ie=P[te+1],ye=P[te+2],$t=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:$t,dstDeclId:ye,line:N})}continue}if(X==="choice"){let P=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=I+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,$t=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if($t!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Ln=$t[2];te.push({when:$t[1].trim(),next:`@terminal:${Ln}`}),c.push({srcDeclId:P,port:Ln,dstDeclId:$t[3],line:s[ie].n});continue}let el=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(el!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\` has more than one \`default\``);let Ln=el[1];_e=`@terminal:${Ln}`,c.push({srcDeclId:P,port:Ln,dstDeclId:el[2],line:s[ie].n});continue}break}te.length===0&&r(N,`\`choice ${P}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(P,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},N,!1),I=ie-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(q[1],"lmctl/loop",lr(q[2],N,r),N,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),P=lr(q[2],N,r);"mode"in P&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(q[1],"lmctl/foreach",P,N,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),P=q[1],te=lr(q[2],N,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${P}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(P,"lmctl/subflow",{workflow_name:_e,...ye},N,!1),d.push({declId:P,target:_e,line:N});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),P=q[1],te=lr(q[2],N,r),{branches:_e,nextIdx:ie}=T(I);_e.length===0&&r(N,`\`decide ${P}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(P,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:P,port:ye.label,dstDeclId:ye.dst,line:N});I=ie;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}r(N,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=I=>{if(Array.isArray(I)){for(let O of I)E(O);return}if(typeof I!="object"||I===null)return;let N=I;if(typeof N.alias=="string")for(let[O,X]of[["mcp",h],["skills",g]]){let q=N[O];Array.isArray(q)&&(N[O]=q.map(P=>typeof P=="string"&&X.has(P)?structuredClone(X.get(P)):P))}for(let O of Object.values(N))E(O)};for(let I of u){let N=l.get(I);N.members!==void 0&&E(N.members)}let k=I=>m_(i,I),$=u.map(I=>{let N=l.get(I);return{id:k(I),name:I,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),v={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let N=k(I.srcDeclId);v[N]??={},v[N][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),v[N][I.port]=[[{step_id:k(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let N=l.get(I);dA.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let A=new Map;for(let I of c){let N=A.get(I.srcDeclId);N===void 0?A.set(I.srcDeclId,[I.dstDeclId]):N.push(I.dstDeclId)}for(let I of u){let N=l.get(I);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let X=A.get(I);X===void 0?A.set(I,[O]):X.push(O)}}let F=new Set([f]),U=[f];for(;U.length>0;){let I=U.shift();for(let N of A.get(I)??[])F.has(N)||(F.add(N),U.push(N))}for(let I of u)F.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let J=new Map;for(let I of c){let N=J.get(I.srcDeclId);N===void 0&&(N=new Set,J.set(I.srcDeclId,N)),N.add(I.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let N=l.get(I);if(N.isTerminal)continue;let O=J.get(I)??new Set;if(N.type==="lmctl/review"){let q=[...O].some(P=>!R.has(P));!O.has("approve")&&!q&&r(N.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let X=fA[N.type];if(X!==void 0)for(let q of X)O.has(q)||r(N.line,`uncovered outcome: required outcome \`${q}\` of step \`${I}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${I} -${q}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${I}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let N=l.get(I),O=lA[N.type];if(O===void 0)continue;let X={...N.params,...N.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let P=q.error.issues[0],te=P.path.length===0?"$":P.path.map(String).join(".");r(N.line,`step \`${I}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${P.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let W={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:v,entry_step_id:k(f)},z=St.safeParse(W);if(!z.success)throw new hn(z.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return z.data}function mA(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function lr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of pA(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=y_(l)}return s}function pA(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function y_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var lA,cA,h_,hn,dA,fA,__,g_,E_=b(()=>{"use strict";pn();p_();mn();lA={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Ei},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:bi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Ti},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Si}},cA={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};h_={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},hn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1526
|
+
`),s=[];for(let I=0;I<n.length;I+=1){let O=mA(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,N,O,X,q,P)=>{l.has(I)&&r(X,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(X,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:N,params:O,line:X,isTerminal:q,...P?{members:P}:{}}),u.push(I)},T=I=>{let N=[],O=I+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;N.push({label:X[1],dst:X[2]})}return{branches:N,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:N,text:O}=s[I],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),P=lr(q[1],N,r);for(let te of Object.keys(P))__.has(te)||r(N,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...__].join(", ")} (no grammar inflation; bounded)`);m=P;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=h_[te];ie===void 0&&r(N,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(h_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:$t}=uA(ie,lr(_e,N,r));_(P,ie,ye,N,!1,Object.keys($t).length>0?$t:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),P=q[1],te=q[2],_e=q[3],ie=g_[te];ie===void 0&&r(N,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(g_).join(", ")})`),p.has(P)&&r(N,`duplicate trigger id: ${P}`),p.set(P,{id:P,type:ie,parameters:lr(_e,N,r)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),P=q[1],te=q[2].trim(),_e=X==="mcp"?h:g;_e.has(P)&&r(N,`duplicate ${X} declaration: ${P}`);let ie;if(te.startsWith("{")){let ye=lr(te,N,r);X==="mcp"?ie={...ye,name:P}:((typeof ye.content!="string"||ye.content.length===0)&&r(N,`\`skill ${P}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:P,content:ye.content})}else{let ye=y_(te);(typeof ye!="string"||ye.length===0)&&r(N,`\`${X} ${P}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(P,ie);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},N,!0);continue}if(X==="seq"){let P=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(P.length<3||P.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<P.length+1&&!(te+2>P.length-1);te+=2){let _e=P[te],ie=P[te+1],ye=P[te+2],$t=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:$t,dstDeclId:ye,line:N})}continue}if(X==="choice"){let P=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=I+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,$t=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if($t!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Ln=$t[2];te.push({when:$t[1].trim(),next:`@terminal:${Ln}`}),c.push({srcDeclId:P,port:Ln,dstDeclId:$t[3],line:s[ie].n});continue}let el=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(el!==null){_e!==void 0&&r(s[ie].n,`\`choice ${P}\` has more than one \`default\``);let Ln=el[1];_e=`@terminal:${Ln}`,c.push({srcDeclId:P,port:Ln,dstDeclId:el[2],line:s[ie].n});continue}break}te.length===0&&r(N,`\`choice ${P}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(P,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},N,!1),I=ie-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(q[1],"lmctl/loop",lr(q[2],N,r),N,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),P=lr(q[2],N,r);"mode"in P&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(q[1],"lmctl/foreach",P,N,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),P=q[1],te=lr(q[2],N,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${P}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(P,"lmctl/subflow",{workflow_name:_e,...ye},N,!1),d.push({declId:P,target:_e,line:N});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),P=q[1],te=lr(q[2],N,r),{branches:_e,nextIdx:ie}=T(I);_e.length===0&&r(N,`\`decide ${P}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(P,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:P,port:ye.label,dstDeclId:ye.dst,line:N});I=ie;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}r(N,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=I=>{if(Array.isArray(I)){for(let O of I)y(O);return}if(typeof I!="object"||I===null)return;let N=I;if(typeof N.alias=="string")for(let[O,X]of[["mcp",h],["skills",g]]){let q=N[O];Array.isArray(q)&&(N[O]=q.map(P=>typeof P=="string"&&X.has(P)?structuredClone(X.get(P)):P))}for(let O of Object.values(N))y(O)};for(let I of u){let N=l.get(I);N.members!==void 0&&y(N.members)}let k=I=>m_(i,I),$=u.map(I=>{let N=l.get(I);return{id:k(I),name:I,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),v={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let N=k(I.srcDeclId);v[N]??={},v[N][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),v[N][I.port]=[[{step_id:k(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let N=l.get(I);dA.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let A=new Map;for(let I of c){let N=A.get(I.srcDeclId);N===void 0?A.set(I.srcDeclId,[I.dstDeclId]):N.push(I.dstDeclId)}for(let I of u){let N=l.get(I);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let X=A.get(I);X===void 0?A.set(I,[O]):X.push(O)}}let F=new Set([f]),U=[f];for(;U.length>0;){let I=U.shift();for(let N of A.get(I)??[])F.has(N)||(F.add(N),U.push(N))}for(let I of u)F.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let J=new Map;for(let I of c){let N=J.get(I.srcDeclId);N===void 0&&(N=new Set,J.set(I.srcDeclId,N)),N.add(I.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let N=l.get(I);if(N.isTerminal)continue;let O=J.get(I)??new Set;if(N.type==="lmctl/review"){let q=[...O].some(P=>!R.has(P));!O.has("approve")&&!q&&r(N.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let X=fA[N.type];if(X!==void 0)for(let q of X)O.has(q)||r(N.line,`uncovered outcome: required outcome \`${q}\` of step \`${I}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${I} -${q}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${I}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let N=l.get(I),O=lA[N.type];if(O===void 0)continue;let X={...N.params,...N.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let P=q.error.issues[0],te=P.path.length===0?"$":P.path.map(String).join(".");r(N.line,`step \`${I}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${P.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let W={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:v,entry_step_id:k(f)},z=St.safeParse(W);if(!z.success)throw new hn(z.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return z.data}function mA(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function lr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of pA(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=y_(l)}return s}function pA(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function y_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var lA,cA,h_,hn,dA,fA,__,g_,E_=b(()=>{"use strict";pn();p_();mn();lA={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Ei},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:bi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Ti},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Si}},cA={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};h_={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},hn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1527
1527
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1528
1528
|
`)}`),this.issues=e,this.name="DslCompileError"}},dA=new Set(["lmctl/assert-repo-clean","lmctl/review","lmctl/consolidate","lmctl/interactive","lmctl/loop","lmctl/render-docx","lmctl/render-xlsx","lmctl/shell-step","lmctl/choice","lmctl/foreach","lmctl/subflow","lmctl/terminal","lmctl/trigger-schedule","lmctl/trigger-gh-issue"]),fA={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},__=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),g_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as hA}from"node:fs";function _A(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function gA(t){for(let e of t.split(`
|
|
1529
1529
|
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function De(t){if(typeof t=="string"&&_A()&&gA(t)){let r;try{r=w_(t)}catch(s){throw s instanceof hn?new Wt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=St.safeParse(r);if(!n.success)throw new Wt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Ii(yA(t));if(EA(e)&&e.definition_schema_version===3){let r=St.safeParse(e);if(!r.success)throw new Wt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return wA(e)}function wA(t){let e=ki.safeParse(t);if(!e.success)throw new Wt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Wt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return u_(r)}catch(s){throw s instanceof Ut?new iu(s):s}}function yA(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
@@ -1536,7 +1536,7 @@ ${n}`}function YA(t,e,r,n){let s=Or(t,yu),o=`- [${e}.md](${e}.md)${n!==null?` \u
|
|
|
1536
1536
|
`)?`${i}
|
|
1537
1537
|
${o}
|
|
1538
1538
|
`:`${i}${o}
|
|
1539
|
-
`,wu(s,i,"utf8")}function zA(t,e){let r=Or(t,yu);if(!wn(r))return;let n=Oi(r,"utf8"),s=new RegExp(`^- \\[${D_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&wu(r,n.replace(s,""),"utf8")}function D_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ZA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function dt(t,e){return t.durable_memory_mode==="db"?new gu(e,t.id):new _u(t.local_path)}var KA,yu,C_,_u,gu,Eu=b(()=>{"use strict";KA=/^[a-zA-Z0-9_-]+$/;yu="MEMORY.md",C_="1970-01-01T00:00:00.000Z",_u=class{dir;constructor(e){this.dir=Or(e,"durable-memory")}read(e){rt(e);let r=Or(this.dir,`${e}.md`);if(!wn(r))return null;let n=Oi(r,"utf8");return M_(e,n)}write(e){rt(e.name),JA(this.dir,{recursive:!0});let r=Or(this.dir,`${e.name}.md`),n=!wn(r),s=VA(e.name,e.type,e.description??null,e.body);return wu(r,s,"utf8"),YA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){rt(e);let r=Or(this.dir,`${e}.md`);return wn(r)?(GA(r),zA(this.dir,e),!0):!1}listFiles(){if(!wn(this.dir))return[];let e=XA(this.dir).filter(n=>n.endsWith(".md")&&n!==yu),r=[];for(let n of e){let s=n.slice(0,-3),o=Oi(Or(this.dir,n),"utf8"),i=M_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};gu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){rt(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){rt(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return rt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function F_(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=dt(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=dt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!P_.has(a))return n.json({error:`invalid type: must be one of ${[...P_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=dt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=dt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var P_,U_=b(()=>{"use strict";Eu();P_=new Set(["user","feedback","project","reference"])});function eR(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(QA[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function tR(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function W_(t,e=new Date){let{time:r,date:n}=tR(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=eR(h.data),T=h.data.length,E=new Uint8Array(30+g.length),k=new DataView(E.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let $=new Uint8Array(46+g.length),v=new DataView($.buffer);v.setUint32(0,33639248,!0),v.setUint16(4,20,!0),v.setUint16(6,20,!0),v.setUint16(8,0,!0),v.setUint16(10,0,!0),v.setUint16(12,r,!0),v.setUint16(14,n,!0),v.setUint32(16,_,!0),v.setUint32(20,T,!0),v.setUint32(24,T,!0),v.setUint16(28,g.length,!0),v.setUint16(30,0,!0),v.setUint16(32,0,!0),v.setUint16(34,0,!0),v.setUint16(36,0,!0),v.setUint32(38,0,!0),v.setUint32(42,i,!0),$.set(g,46),o.push($),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var QA,B_=b(()=>{"use strict";QA=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Mi,mkdirSync as rR,readdirSync as nR,readFileSync as J_,statSync as sR,unlinkSync as oR,writeFileSync as iR}from"node:fs";import{join as hs}from"node:path";function X_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ft(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ft(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await ft(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=dt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Li.includes(l))return j(n,`invalid type: must be one of ${Li.join("|")}`,400);try{rt(i)}catch(d){return j(n,d.message,400)}let c=dt(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=dt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await ft(n);if(typeof i=="string")return j(n,i,400);let a=dt(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!Li.includes(d))return j(n,`invalid type: must be one of ${Li.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=dt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(lR(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Ci.has(l))return j(n,`invalid type: must be one of ${[...Ci].join("|")}`,400);try{rt(i)}catch(f){return j(n,f.message,400)}let c=ms(s.local_path),u=hs(c,`${i}.md`);if(Mi(u))return j(n,`chapter already exists: ${i}`,409);rR(c,{recursive:!0}),H_(u,i,l,ae(o,"description"),a);let d=ps(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=ps(ms(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(m){return j(n,m.message,400)}let i=ms(s.local_path),a=ps(i,o);if(a===null)return j(n,"chapter not found",404);let l=await ft(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!Ci.has(d))return j(n,`invalid type: must be one of ${[...Ci].join("|")}`,400);H_(hs(i,`${o}.md`),o,d,u,c);let f=ps(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(a){return j(n,a.message,400)}let i=hs(ms(s.local_path),`${o}.md`);return Mi(i)?(oR(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await ft(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(q_))),t.post("/api/chat/sessions",async n=>{let s=await aR(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(q_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return j(n,"chat session not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=xr(r,s),a=[];for(let c of i){let u=uR(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=J_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=W_(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function j(t,e,r){return t.json({error:e},r)}async function ft(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function aR(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ms(t){return hs(t,"ai-test")}function ps(t,e){let r=hs(t,`${e}.md`);if(!Mi(r))return null;let n=J_(r,"utf8"),s=cR(n),o=sR(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function lR(t){let e=ms(t);return Mi(e)?nR(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=ps(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function H_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1539
|
+
`,wu(s,i,"utf8")}function zA(t,e){let r=Or(t,yu);if(!wn(r))return;let n=Oi(r,"utf8"),s=new RegExp(`^- \\[${D_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&wu(r,n.replace(s,""),"utf8")}function D_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ZA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function dt(t,e){return t.durable_memory_mode==="db"?new gu(e,t.id):new _u(t.local_path)}var KA,yu,C_,_u,gu,Eu=b(()=>{"use strict";KA=/^[a-zA-Z0-9_-]+$/;yu="MEMORY.md",C_="1970-01-01T00:00:00.000Z",_u=class{dir;constructor(e){this.dir=Or(e,"durable-memory")}read(e){rt(e);let r=Or(this.dir,`${e}.md`);if(!wn(r))return null;let n=Oi(r,"utf8");return M_(e,n)}write(e){rt(e.name),JA(this.dir,{recursive:!0});let r=Or(this.dir,`${e.name}.md`),n=!wn(r),s=VA(e.name,e.type,e.description??null,e.body);return wu(r,s,"utf8"),YA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){rt(e);let r=Or(this.dir,`${e}.md`);return wn(r)?(GA(r),zA(this.dir,e),!0):!1}listFiles(){if(!wn(this.dir))return[];let e=XA(this.dir).filter(n=>n.endsWith(".md")&&n!==yu),r=[];for(let n of e){let s=n.slice(0,-3),o=Oi(Or(this.dir,n),"utf8"),i=M_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};gu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){rt(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){rt(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return rt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function F_(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=dt(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=dt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!P_.has(a))return n.json({error:`invalid type: must be one of ${[...P_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=dt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=dt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var P_,U_=b(()=>{"use strict";Eu();P_=new Set(["user","feedback","project","reference"])});function eR(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(QA[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function tR(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function W_(t,e=new Date){let{time:r,date:n}=tR(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=eR(h.data),T=h.data.length,y=new Uint8Array(30+g.length),k=new DataView(y.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),y.set(g,30),s.push(y,h.data);let $=new Uint8Array(46+g.length),v=new DataView($.buffer);v.setUint32(0,33639248,!0),v.setUint16(4,20,!0),v.setUint16(6,20,!0),v.setUint16(8,0,!0),v.setUint16(10,0,!0),v.setUint16(12,r,!0),v.setUint16(14,n,!0),v.setUint32(16,_,!0),v.setUint32(20,T,!0),v.setUint32(24,T,!0),v.setUint16(28,g.length,!0),v.setUint16(30,0,!0),v.setUint16(32,0,!0),v.setUint16(34,0,!0),v.setUint16(36,0,!0),v.setUint32(38,0,!0),v.setUint32(42,i,!0),$.set(g,46),o.push($),i+=y.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var QA,B_=b(()=>{"use strict";QA=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Mi,mkdirSync as rR,readdirSync as nR,readFileSync as J_,statSync as sR,unlinkSync as oR,writeFileSync as iR}from"node:fs";import{join as hs}from"node:path";function X_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ft(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ft(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await ft(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=dt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Li.includes(l))return j(n,`invalid type: must be one of ${Li.join("|")}`,400);try{rt(i)}catch(d){return j(n,d.message,400)}let c=dt(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=dt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await ft(n);if(typeof i=="string")return j(n,i,400);let a=dt(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!Li.includes(d))return j(n,`invalid type: must be one of ${Li.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=dt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(lR(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Ci.has(l))return j(n,`invalid type: must be one of ${[...Ci].join("|")}`,400);try{rt(i)}catch(f){return j(n,f.message,400)}let c=ms(s.local_path),u=hs(c,`${i}.md`);if(Mi(u))return j(n,`chapter already exists: ${i}`,409);rR(c,{recursive:!0}),H_(u,i,l,ae(o,"description"),a);let d=ps(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=ps(ms(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(m){return j(n,m.message,400)}let i=ms(s.local_path),a=ps(i,o);if(a===null)return j(n,"chapter not found",404);let l=await ft(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!Ci.has(d))return j(n,`invalid type: must be one of ${[...Ci].join("|")}`,400);H_(hs(i,`${o}.md`),o,d,u,c);let f=ps(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(a){return j(n,a.message,400)}let i=hs(ms(s.local_path),`${o}.md`);return Mi(i)?(oR(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await ft(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(q_))),t.post("/api/chat/sessions",async n=>{let s=await aR(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(q_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return j(n,"chat session not found",404);let o=await ft(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=xr(r,s),a=[];for(let c of i){let u=uR(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=J_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=W_(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function j(t,e,r){return t.json({error:e},r)}async function ft(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function aR(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ms(t){return hs(t,"ai-test")}function ps(t,e){let r=hs(t,`${e}.md`);if(!Mi(r))return null;let n=J_(r,"utf8"),s=cR(n),o=sR(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function lR(t){let e=ms(t);return Mi(e)?nR(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=ps(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function H_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1540
1540
|
description: ${n}`:"",i=`---
|
|
1541
1541
|
name: ${e}${o}
|
|
1542
1542
|
type: ${r}
|
|
@@ -1606,13 +1606,13 @@ ${s}`;iR(t,i,"utf8")}function cR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1606
1606
|
JOIN step s ON s.id = sa.step_id
|
|
1607
1607
|
WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
|
|
1608
1608
|
JOIN step s ON s.id = sa.step_id
|
|
1609
|
-
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let W=l.get(R.step_id)??[];W.push({kind:R.kind,id:R.id}),l.set(R.step_id,W)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let R of d)try{let W=JSON.parse(R.payload);typeof W.elapsedMs=="number"&&W.elapsedMs>0&&(f+=W.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),
|
|
1610
|
-
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,
|
|
1609
|
+
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let W=l.get(R.step_id)??[];W.push({kind:R.kind,id:R.id}),l.set(R.step_id,W)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let R of d)try{let W=JSON.parse(R.payload);typeof W.elapsedMs=="number"&&W.elapsedMs>0&&(f+=W.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),y=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=y!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
1610
|
+
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,y,g,_):[],v=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
1611
1611
|
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=v?.input!==null&&v?.input!==void 0?`input: ${v.input}, output: ${v.output??0}`:"n/a",F=e.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,J={run_id:t,workflow_name:F?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(J)})}var V_=b(()=>{"use strict"});import{spawnSync as z_}from"node:child_process";function Tu(t){return mR[t]??`no install hint; ensure '${t}' is on PATH`}function pR(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function Y_(t){return z_("which",[t],{encoding:"utf8"}).status===0}function Z_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Y_(e)){let r=Tu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Y_(e)){let s=Tu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=pR(e);if(r===null)continue;let n=z_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:Tu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var mR,Q_=b(()=>{"use strict";mR={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as hR,readdirSync as _R,readFileSync as gR}from"node:fs";import{join as eg}from"node:path";function wR(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
|
|
1612
1612
|
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function tg(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 rg(t,e){if(e.length===0)return null;let r=eg(t,"durable-memory");if(!hR(r))return null;let n;try{n=_R(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=gR(eg(r,o),"utf8");if(wR(i).some(l=>e.includes(l))){let l=tg(i,"name")??o.replace(".md",""),c=tg(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 ng=b(()=>{"use strict"});function vu(t){let e=t.trim().replace(yR,"").trim();for(let r=0;r<4;r+=1){let n=ER.exec(e);if(n===null)break;e=n[2].trim()}return e}function sg(t){let e=t.trim(),r=bR.exec(e);if(r!==null)return r[2];let n=TR.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=vu(r[i]),l=Su.exec(a);if(l===null)continue;let c=l[1].trim();if(ku.test(c))continue;let u=sg(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=vu(r[i]),l=Su.exec(a);if(l===null)break;let c=ku.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function og(t){let e=t.split(`
|
|
1614
1614
|
`),r=null;for(let n=0;n<e.length;n+=1){let s=vu(e[n]),o=Su.exec(s);if(o===null)continue;let i=o[1].trim();if(ku.test(i))continue;let a=sg(i);if(a===null||!Jr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var yR,ER,Su,ku,bR,TR,Iu=b(()=>{"use strict";Bn();yR=/^#{1,6}\s+/,ER=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Su=/^STANCE:\s+(.+)$/,ku=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,bR=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,TR=/^[A-Za-z0-9_-]+/});function ig(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 ag=b(()=>{"use strict"});import{readFileSync as SR}from"node:fs";import{dirname as kR,join as vR}from"node:path";import{fileURLToPath as IR}from"node:url";function xR(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function OR(t){let e=[],r=[];for(let n of t)NR.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function LR(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&$R.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 CR(t,e){if(t.length===0)return{matched:!1};let r=OR(t);for(let n of r){let s=LR(n,e);if(s.matched)return s}return{matched:!1}}function Nu(t){return CR(t,RR)}function MR(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 $u(t){return MR(t).split(" ").filter(e=>e.length>0)}var NR,$R,jR,AR,RR,lg=b(()=>{"use strict";NR=new Set(["&&","||",";","|",">",">>","<","<<"]),$R=/^[A-Za-z_][A-Za-z0-9_]*=/;jR=kR(IR(import.meta.url)),AR=JSON.parse(SR(vR(jR,"side_effect_classifier.json"),"utf-8")),RR=xR(AR)});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 cg(t,e){try{return await Rr(xu(t)??t,Di(e))===!0}catch{return!1}}async function Pi(t,e){try{return await Rr(xu(t)??t,Di(e))}catch{return}}async function ug(t,e){if(typeof t!="string")return t;let r=xu(t);if(r===null)return t;try{return await Rr(r,Di(e))}catch{return}}async function dg(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+=DR(await Rr(a,Di(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function xu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function DR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var gs=b(()=>{"use strict";fn()});import{existsSync as fg,readdirSync as mg,readFileSync as PR,statSync as pg}from"node:fs";import{join as Ui}from"node:path";function hg(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=Jr(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:FR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function FR(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 _g(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=UR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return dg(n,e)}function UR(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=ig(e.dal,e.run_id,()=>o),c=ju(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let
|
|
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 _g(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=UR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return dg(n,e)}function UR(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=ig(e.dal,e.run_id,()=>o),c=ju(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let y=$u(T.summary),k=Nu(y);k.matched&&!c&&(u.violation={summary:T.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),WR(T,(y,k)=>{m+=y,p+=k})},g=await Qr({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})}),BR(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&&Au(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function WR(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 yn(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(fm(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 En(t,e){return(e?.length??0)>0?rg(t.project.local_path,e):null}function gg(t){return Nu($u(t))}function ju(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
|
|
@@ -1631,7 +1631,7 @@ ${u}`:u;try{let f=await ys({context:t,stateId:n,member:o,prompt:d,stepId:l.id,ti
|
|
|
1631
1631
|
ORDER BY sa.id DESC
|
|
1632
1632
|
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Wi(o[0].content)}function Wi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function xO(t,e){let r=Mg(EO.lexer(t,{gfm:!0})),n=new fO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:pO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return hO.toBuffer(n)}function Mg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new mt({heading:MO(r.depth),children:dr(ur(r))}));break;case"paragraph":e.push(new mt({children:dr(ur(r))}));break;case"text":e.push(new mt({children:ur(r).length===0?[new pt(r.text)]:dr(ur(r))}));break;case"blockquote":e.push(...Mg(ur(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":OO(r)&&e.push(...jO(r));break;case"table":LO(r)&&e.push(AO(r));break;case"code":CO(r)&&e.push(...RO(r));break;case"hr":e.push(new mt(""));break;case"html":r.text.trim().length>0&&e.push(new mt({children:[new pt(r.text)]}));break;default:break}return e}function dr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,...Ru(e)}));break;case"strong":r.push(...dr(ur(n),{...e,bold:!0}));break;case"em":r.push(...dr(ur(n),{...e,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,...Ru({...e,code:!0})}));break;case"link":r.push(new mO({link:n.href,children:dr(ur(n),{...e})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,...Ru(e)}));break}return r.length===0?[new pt("")]:r}function Ru(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function jO(t){return t.items.map(e=>new mt({children:dr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Og(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Og(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Og(t){return t.task?`[${t.checked?"x":" "}] `:""}function AO(t){let e=[t.header,...t.rows].map(r=>new wO({children:r.map(n=>new gO({children:[new mt({children:dr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new _O({width:{size:100,type:yO.PERCENTAGE},rows:e})}function RO(t){return t.text.split(`
|
|
1633
1633
|
`).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ur(t){let e=t.tokens;return Array.isArray(e)?e:[]}function OO(t){return t.type==="list"&&Array.isArray(t.items)}function LO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function CO(t){return t.type==="code"&&typeof t.text=="string"}function MO(t){switch(t){case 1:return bn.HEADING_1;case 2:return bn.HEADING_2;case 3:return bn.HEADING_3;case 4:return bn.HEADING_4;case 5:return bn.HEADING_5;default:return bn.HEADING_6}}var Cg,Dg=b(()=>{"use strict";qe();Cg={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>bO(t,t.state)}});import{createHash as DO}from"node:crypto";import{existsSync as PO,mkdirSync as FO,readFileSync as Pg,statSync as UO}from"node:fs";import{dirname as WO,isAbsolute as Fg,normalize as BO,resolve as bs}from"node:path";import{marked as qO}from"marked";import HO from"write-excel-file/node";async function JO(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await XO(t,e),i=GO(e.input_format),a=await KO(t,e),l=await VO(t,e.title),c=i==="markdown"?sL(o):QO(o);await oL({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=UO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=DO("sha256").update(Pg(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function XO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ke(e.source,t,t.stateId)).trim(),n=zO(t.project.local_path,r);if(n!==null){if(!PO(n))throw new Error(`source file not found: ${n}`);return Pg(n,"utf8")}return r}function GO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function KO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=YO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function VO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ke(e,t,t.stateId)).trim();return r.length===0?null:r}function YO(t,e){let r=bs(t);return BO(Fg(e)?bs(e):bs(r,e))}function zO(t,e){return ZO(e)?Fg(e)?bs(e):bs(t,e):null}function ZO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function QO(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!Bi(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>eL(r,n))}function eL(t,e){if(!Bi(t))throw new Error(`sheets[${e}] must be an object`);let r=tL(t.headers,`sheets[${e}].headers`),n=rL(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:nL(t.styles)}}function tL(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function rL(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function nL(t){if(!Bi(t)||!Bi(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function sL(t){let e=qO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(fL(s)){n=s.text;continue}mL(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function oL(t){FO(WO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:cL(n.name,e),data:iL(n),columns:lL(n)}));await HO(r).toFile(t.outputPath)}function iL(t){let e=[];if(t.headers.length>0){let r=dL(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(aL));return e.length===0?[[{}]]:e}function aL(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function lL(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function cL(t,e){let r=uL(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function uL(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function dL(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function fL(t){return t.type==="heading"&&typeof t.text=="string"}function mL(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Bi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ug,Wg=b(()=>{"use strict";qe();Ug={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>JO(t,t.state)}});import{spawnSync as pL}from"node:child_process";async function _L(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(pL("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=En(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await yn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1634
|
-
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=og(p.text);if(g!==null){let _=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),
|
|
1634
|
+
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=og(p.text);if(g!==null){let _=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),y=_s(p.text,T);if(y.outcome===null){let $=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let k=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,y.outcome,"outcomes_from_stance"),Y(t,r,n,y.outcome),V(t.workflow,e.outcomes_from_stance[y.outcome])}let g=_s(p.text,hL);if(g.outcome!==null){let T=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Bt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>yn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1635
1635
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Bt(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1636
1636
|
|
|
1637
1637
|
`),e.loop_feedback_artifact!==void 0){let g=G(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var hL,Bg,qg=b(()=>{"use strict";Iu();qe();hL=["blocked","failed","aborted"],Bg={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>_L(t,t.state)}});import{spawnSync as gL}from"node:child_process";async function wL(t,e){let r=t.stateId,n=t.displayName,s=await Ke(e.command,t,n),o=ju(t,n),i=gg(s);if(i.matched&&!o){let h=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=gL("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Au(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),V(t.workflow,p))}var Hg,Jg=b(()=>{"use strict";qe();Hg={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>wL(t,t.state)}});async function yL(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=De(o.definition),a=await EL(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,r,n,bL(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:ee(t.workflow)}:V(t.workflow,u)}async function EL(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await ug(s,t);r[n]=o===s?await Pi(s,t):o}return r}function bL(t,e,r){let n={};for(let s of r)n[s.name]=TL(t,e,s);return n}function TL(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=SL(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function SL(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var Xg,Gg=b(()=>{"use strict";_n();qe();gs();Xg={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>yL(t,t.state)}});function kL(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Kg,Vg=b(()=>{"use strict";qe();Kg={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>kL(t,t.state)}});async function vL(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=IL(t.cursor),a=o.filter(NL).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function IL(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function NL(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Yg,zg=b(()=>{"use strict";Yg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>vL(t)}});async function $L(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Zg,Qg=b(()=>{"use strict";Zg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>$L(t)}});function ew(t){t.register(yg),t.register(Bg),t.register(Sg),t.register(xg),t.register(Ag),t.register(Cg),t.register(Ug),t.register(Hg),t.register(bg),t.register(vg),t.register(Xg),t.register(Kg),t.register(Zg),t.register(Yg)}var tw=b(()=>{"use strict";Eg();Tg();kg();Ng();jg();Rg();Dg();Wg();qg();Jg();Gg();Vg();zg();Qg()});function Hi(){return qi===null&&(qi=new Ou,ew(qi)),qi}var xL,Ou,qi,Lu=b(()=>{"use strict";tw();xL={Review:"lmctl/review",Consolidate:"lmctl/consolidate",Interactive:"lmctl/interactive",Loop:"lmctl/loop",ShellStep:"lmctl/shell-step",AssertRepoClean:"lmctl/assert-repo-clean",Choice:"lmctl/choice",ForEach:"lmctl/foreach",Subflow:"lmctl/subflow",Terminal:"lmctl/terminal"},Ou=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:xL[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},qi=null});async function sw(t){cw(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=AL(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Ts(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=Z_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Ts(n)){let m=Cu({dal:t.dal,workflow:Xi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:cr(t.job.payload)??{},team_id:t.team.id}),p=await iw(n,m,i.current_state??n.entry_step_id);return nw(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Cu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:cr(t.job.payload)??{},team_id:t.team.id}),f=await ow(d,i.current_state??n.start_at);return nw(t.dal,r.id,i.id,n.name,f),f}function nw(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Cu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Mu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{cw(n);let o=Ts(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Cu({dal:t.dal,workflow:Ts(n)?Xi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Ts(n)?iw(n,a,i.current_state??n.entry_step_id):ow(a,i.current_state??n.start_at)}};return e}async function ow(t,e){let r=e;if(r.startsWith(ws))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return qt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=Ji(t,ee(t.workflow));if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Pe(t);if(l.kind==="terminal")return qt(t,l.terminal);r=l.state;continue}let i,a=lw(t,r);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===Wn)return qt(t,yl);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):nt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Mu(t,r,o);if(i.kind==="paused")return Pe(t);if(i.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},i.token,i.reason),Pe(t);if(i.kind==="terminal"){let l=Ji(t,i.terminal);if(l.kind==="paused")return Pe(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},l.token,l.reason),Pe(t);if(l.kind==="terminal")return qt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Ji(t,ee(t.workflow));return n.kind==="terminal"?qt(t,n.terminal):qt(t,ee(t.workflow))}async function iw(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return nt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Pe(e);let l=lw(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===Wn)return qt(e,yl);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Pe(e);o=h;continue}let c=await jL(e,t,a);if(c.kind==="paused")return Pe(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Pe(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Xi(t,a);try{let p=Ji(e,d);if(p.kind==="paused")return Pe(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Pe(e);if(p.kind==="terminal")return qt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Pe(e);o=h.id;continue}finally{e.workflow=m}}if(Jr(d))return nt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Pe(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),qt(e,"aborted")}async function jL(t,e,r){let n=aw(e,r),s=t.workflow;t.workflow=Xi(e,r);try{return await Mu(t,r.id,n,r.name)}finally{t.workflow=s}}function aw(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Mu(t,e,r,n){let s=Hi().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?LL(t,s):void 0,t.progress_step_id=null;try{return await s.execute(hg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function AL(t,e){try{let r=JSON.parse(t);if(OL(r)&&r.definition_schema_version===3)return St.parse(r)}catch{return e}return e}function Ts(t){return t.definition_schema_version===3}function Xi(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=aw(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:RL(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function RL(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function OL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function LL(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function qt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{K_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Pe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function lw(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function Ji(t,e){if(!CL(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&ML(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function CL(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function ML(t,e,r){let n=DL(t),s=r.capture_evidence&&n!==null?PL(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function DL(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function PL(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function cw(t){if(!rw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${rw.join(", ")}`)}var rw,uw=b(()=>{"use strict";pn();V_();Q_();qe();Lu();Bn();rw=[1,2,3]});import{readFileSync as FL,readdirSync as UL}from"node:fs";import{basename as WL,join as BL,resolve as qL}from"node:path";function mw(t={}){let e=qL(t.workflowsDir??"workflows"),r=UL(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>HL(BL(e,n)))}}function HL(t){let e=WL(t);try{let r=FL(t,"utf8"),n=De(r);return _w(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gw(r)}}}function pw(t,e){try{let r=De(e);return _w(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gw(r)}}}function hw(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
@@ -1782,25 +1782,25 @@ ${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,PD).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,Jy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Jy,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 Xy(t){for(let e of UD)try{e(t)}catch{}}var PD,Jy,UD,Gy=b(()=>{"use strict";PD="request_changes",Jy="reviewer_rejection_rate_high";UD=[FD]});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 Ky(t){let e=t.intervalMs??Ns(),r=t.runOnceFn??Cr,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??qy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Vy(t.dal,t.monitorSessionActivityFn??gc,e,n).finally(()=>{a=null})),a.finally(()=>u(wc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=WD(t.dal,r,t.collectSessionSizesFn??Up,t.scanIntakeFn??gn,t.monitorSessionActivityFn??gc,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 WD(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(yw({dal:t}),Xy({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 Vy(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 Vy(t,e,r,n){let s=wc(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 ld=b(()=>{"use strict";ji();vs();Pu();Mo();Hy();Gy();yc()});function Yy(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 zy=b(()=>{"use strict"});import{mkdirSync as BD,readFileSync as qD,readdirSync as HD,statSync as JD,writeFileSync as XD}from"node:fs";import{dirname as GD,join as Qy,sep as Zy}from"node:path";function _a(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case eE:return KD(t,s.input);case tE:return VD(t,s.input);case rE:return YD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:dd,GetObjectCommand:ud,PutObjectCommand:cd}}}function KD(t,e){let r=nE(t,e.Key);return BD(GD(r),{recursive:!0}),XD(r,e.Body),{}}function VD(t,e){let r=nE(t,e.Key),n;try{n=qD(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 YD(t,e){let r=e.Prefix??"";sE(r);let s=zD(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 nE(t,e){return sE(e),Qy(t,e)}function sE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function zD(t){let e=[],r=(n,s)=>{let o;try{o=HD(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=Qy(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:JD(l).mtime})}}};return r(t,""),e}var eE,tE,rE,cd,ud,dd,fd=b(()=>{"use strict";eE="localfs-put",tE="localfs-get",rE="localfs-list",cd=class{input;_localfsTag=eE;constructor(e){this.input=e}},ud=class{input;_localfsTag=tE;constructor(e){this.input=e}},dd=class{input;_localfsTag=rE;constructor(e){this.input=e}}});function oE(){return{put:0,get:0,list:0}}function md(t,e=ZD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function pd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var ZD,ga,hd=b(()=>{"use strict";ZD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ga=class{counts=oE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=oE(),e}estimateCostUsd(e){return md(this.counts,e)}}});function iE(t){let e=t.now??Date.now,r=t.timers??QD,n=null,s=null;async function o(){let l=e(),c=pd(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=md(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===pd(e())}}}var QD,aE=b(()=>{"use strict";hd();QD={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var _d=b(()=>{"use strict";ea();ra();ra()});function eP(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 tP(t){return t.reply_to!==void 0&&t.response!==void 0}function rP(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function lE(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,cE=b(()=>{"use strict";_d();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(lE(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(lE(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=eP(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(tP(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??rP(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 gd(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 uE=b(()=>{"use strict"});function wd(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 dE=b(()=>{"use strict"});function Ed(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 yd,fE=b(()=>{"use strict";yd="daemon:events"});function pE(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 bd(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 mE,Td=b(()=>{"use strict";_d();mE="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(_E(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function nP(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(_E(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function hE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=nP(t);return r===null?!0:Date.now()/1e3>=r-e}function _E(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 Sd=b(()=>{"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":sP},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 sP,kd=b(()=>{"use strict";sP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as gE,mkdirSync as wE,readFileSync as yE,writeFileSync as EE}from"node:fs";import{homedir as bE}from"node:os";import{dirname as TE,join as SE}from"node:path";function js(){return process.env.LMCTL_DEVICE_AUTH_PATH??SE(bE(),".lmctl","device-auth.json")}function kE(){return process.env.LMCTL_TOKEN_PATH??SE(bE(),".lmctl","cli-tokens.json")}function vd(t=js()){try{let e=JSON.parse(yE(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 vE(t,e=js()){wE(TE(e),{recursive:!0,mode:448}),EE(e,JSON.stringify(t,null,2));try{gE(e,384)}catch{}}function Id(t,e=kE()){let r={};try{r=JSON.parse(yE(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};wE(TE(e),{recursive:!0,mode:448}),EE(e,JSON.stringify(s,null,2));try{gE(e,384)}catch{}}async function IE(t){let e=t.deviceAuthPath??js(),r=vd(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 Id({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??kE()),{idToken:n.idToken,userId:r.userId}}var Nd=b(()=>{"use strict";kd()});function NE(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(!oP.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,oP,vt,$E=b(()=>{"use strict";Ea=["title","description","members"],oP=new Set(Ea),vt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as iP,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(!oP.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,oP,vt,$E=b(()=>{"use strict";Ea=["title","description","members"],oP=new Set(Ea),vt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as iP,writeFileSync as bY,renameSync as TY,existsSync as jE}from"node:fs";import{basename as aP,resolve as $n,dirname as $d}from"node:path";function cP(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 uP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function dP(t){return/^\s*_SESSION_\s+\S/.test(t)}function fP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function ba(t){let e=aP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Le(t){let e=iP(t,"utf-8"),r=$d($n(t)),n=jd(e,ba(t),{baseDir:r,sourcePath:$n(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=$n(r,s.sessiondir));return n}function jd(t,e,r={}){let n=[],s=[],o=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let c=i.indexOf(`
|
|
1786
1786
|
`);i=c>=0?i.slice(c+1):""}let a=null;if(i.startsWith("---"))try{a=NE(i)}catch(c){if(c instanceof vt)o.push(`frontmatter: ${c.message}`);else throw c}let l=t.split(`
|
|
1787
1787
|
`);for(let c=0;c<l.length;c++){let u=l[c],d=c+1;if(dP(u))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${u.trim()})`);if(fP(u)){let h=u.replace(/^\s*_SKILL_\s*/,"").trim(),g=h.length===0?[]:h.split(/\s+/u);if(g.length!==1){o.push(`line ${d}: _SKILL_ requires exactly one https:// URL or local path: ${u.trim()}`);continue}let _=g[0];try{if(new URL(_).protocol!=="https:"){o.push(`line ${d}: _SKILL_ URL must use https:// or a local path: ${_}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(_)&&!/^[A-Za-z]:[\\/]/u.test(_)){o.push(`line ${d}: _SKILL_ URL must use https:// or a local path: ${_}`);continue}}s.push(_);continue}if(!uP(u))continue;let f=cP(u);for(let h of Object.keys(f))if(!xE.includes(h))throw new Error(`line ${d}: unknown key "${h}" on _MEMBER_ line: ${u.trim()}
|
|
1788
|
-
allowed keys: ${xE.join(", ")}`);if(!f.provider&&!f.teamfile){o.push(`line ${d}: member line missing provider (or teamfile): ${u.trim()}`);continue}let p={alias:f.alias||`member${n.length+1}`,provider:f.provider||"",extra:{}};f.sessionid&&(p.session=f.sessionid),Object.prototype.hasOwnProperty.call(f,"sessiondir")&&(p.sessiondir=f.sessiondir),f.teamfile&&(p.teamfile=f.teamfile),f.model&&(p.model=f.model),f.effort&&(p.effort=f.effort),n.push(p)}return{name:e,members:n,skillUrls:s,rawText:t,parseErrors:o,frontmatter:a}}function Ad(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===xd.toLowerCase());n.length>1&&r.push({field:xd,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?$n(e,o.teamfile):$n(o.teamfile);if(!jE(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 lP.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()===xd.toLowerCase())}function Rd(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=$n(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),!jE(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 Rd(l,$d(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||$d(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 xd,lP,xE,Jt=b(()=>{"use strict";$E();xd="Lead",lP=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);xE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as mP,realpathSync as pP}from"node:fs";import{dirname as hP}from"node:path";function Od(t){_P(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function _P(t){let e=t.payload.root_teamfile;try{e=pP(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 xn(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 xn(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=gP(e);if("error"in r)return await xn(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()-EP(t.env??process.env)).toISOString()});if(!s.acquired){let o=yP(r.alias,s.current);return await xn(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 xn(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 xn(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 gP(t){if(!mP(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??hP(t)}}async function xn(t,e){let r=OE(e.message),n=e.response===null?null:OE(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 OE(t){return t.length<=AE?{text:t,truncated:!1}:{text:t.slice(0,AE),truncated:!0}}function wP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function yP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:wP(t,e)}function EP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RE;let r=Number(e);return!Number.isFinite(r)||r<=0?RE:r}var AE,RE,LE=b(()=>{"use strict";bt();Jt();AE=256*1024,RE=30*60*1e3});import{chmodSync as UE,existsSync as bP,mkdirSync as WE,readFileSync as Ia,writeFileSync as BE}from"node:fs";import{dirname as Ld,resolve as Sa,join as qE}from"node:path";import{fileURLToPath as TP}from"node:url";import{homedir as HE}from"node:os";import{CognitoIdentityClient as SP,GetIdCommand as kP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as CE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as vP,ListObjectsV2Command as IP,PutObjectCommand as NP,S3Client as ME}from"@aws-sdk/client-s3";function Rs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:RP(t.selfUrl),n={},s;for(let $ of r)if(bP($)){n=AP($),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)??$P,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??xP,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??jP,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),T=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:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function AP(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 RP(t){let e=Ld(TP(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 OP(t){let e=LP(t.intervalMs)??JE,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 LP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function XE(t){let e=t.tokenPath??qE(HE(),".lmctl","cli-tokens.json"),r=PE(t.tokenPath);if(hE(r.cognito?.idToken)&&vd()!==null)try{await IE({region:t.region,clientId:t.cognitoClientId??Na,cliTokensPath:e}),r=PE(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 FE({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=CE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ME({region:t.region,credentials:a}),c={ListObjectsV2Command:IP,GetObjectCommand:vP,PutObjectCommand:NP},u=xs(n),d=u??o,f=t.deviceId,m=Sn({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&&DP(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),MP(e),i=!1,o=await FE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=CE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ME({region:t.region,credentials:a}),m=Sn({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,T=t.persistentSessionManager,E=t.promptTriggerStore,k=new ga,$=new Mr({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&&gd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&wd(R.payload)){await T.onInbound(R.payload);return}if(!Ed(R.payload)){if(E!==void 0&&bd(R.payload)){Od({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})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let v=R=>$.putMessage({conversation_id:yd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:OP({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??JE,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:iE({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 GE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:_a(t.rootDir),r=Sn({identityId:As,userId:As,deviceId:DE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Mr({bucket:"local",identityId:As,userId:As,deviceId:DE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&gd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&wd(c.payload)){await o.onInbound(c.payload);return}if(!Ed(c.payload)){if(i!==void 0&&bd(c.payload)){Od({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:yd,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 PE(t){let e=t??qE(HE(),".lmctl","cli-tokens.json");try{let r=Ia(e,"utf8");return JSON.parse(r)}catch{return{}}}function CP(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}};WE(Ld(t),{recursive:!0,mode:448}),BE(t,JSON.stringify(n,null,2));try{UE(t,384)}catch{}}function MP(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,WE(Ld(t),{recursive:!0,mode:448}),BE(t,JSON.stringify(r,null,2));try{UE(t,384)}catch{}}async function FE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new SP({region:t.region}).send(new kP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{CP(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 DP(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 JE,ka,Na,$P,xP,jP,As,DE,Cd=b(()=>{"use strict";na();fd();hd();aE();cE();uE();dE();fE();Td();ea();Sd();Nd();LE();JE=3e3,ka=1e3,Na="79u5jhkk46qofog661c9i0bdcs",$P="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",xP="us-east-1_4iUdFggDn",jP="lmctl-next-preview-mailbox-254332045686";As="local",DE="local"});import{spawn as Fd}from"node:child_process";import{createInterface as KE}from"node:readline";var Md,Dd,Pd,VE,YE=b(()=>{"use strict";go();$e();Md=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=Fd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=KE({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: ${xE.join(", ")}`);if(!f.provider&&!f.teamfile){o.push(`line ${d}: member line missing provider (or teamfile): ${u.trim()}`);continue}let p={alias:f.alias||`member${n.length+1}`,provider:f.provider||"",extra:{}};f.sessionid&&(p.session=f.sessionid),Object.prototype.hasOwnProperty.call(f,"sessiondir")&&(p.sessiondir=f.sessiondir),f.teamfile&&(p.teamfile=f.teamfile),f.model&&(p.model=f.model),f.effort&&(p.effort=f.effort),n.push(p)}return{name:e,members:n,skillUrls:s,rawText:t,parseErrors:o,frontmatter:a}}function Ad(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===xd.toLowerCase());n.length>1&&r.push({field:xd,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?$n(e,o.teamfile):$n(o.teamfile);if(!jE(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 lP.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()===xd.toLowerCase())}function Rd(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=$n(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),!jE(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 Rd(l,$d(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||$d(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 xd,lP,xE,Jt=b(()=>{"use strict";$E();xd="Lead",lP=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);xE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as mP,realpathSync as pP}from"node:fs";import{dirname as hP}from"node:path";function Od(t){_P(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function _P(t){let e=t.payload.root_teamfile;try{e=pP(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 xn(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 xn(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=gP(e);if("error"in r)return await xn(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()-EP(t.env??process.env)).toISOString()});if(!s.acquired){let o=yP(r.alias,s.current);return await xn(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 xn(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 xn(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 gP(t){if(!mP(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??hP(t)}}async function xn(t,e){let r=OE(e.message),n=e.response===null?null:OE(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 OE(t){return t.length<=AE?{text:t,truncated:!1}:{text:t.slice(0,AE),truncated:!0}}function wP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function yP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:wP(t,e)}function EP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RE;let r=Number(e);return!Number.isFinite(r)||r<=0?RE:r}var AE,RE,LE=b(()=>{"use strict";bt();Jt();AE=256*1024,RE=30*60*1e3});import{chmodSync as UE,existsSync as bP,mkdirSync as WE,readFileSync as Ia,writeFileSync as BE}from"node:fs";import{dirname as Ld,resolve as Sa,join as qE}from"node:path";import{fileURLToPath as TP}from"node:url";import{homedir as HE}from"node:os";import{CognitoIdentityClient as SP,GetIdCommand as kP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as CE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as vP,ListObjectsV2Command as IP,PutObjectCommand as NP,S3Client as ME}from"@aws-sdk/client-s3";function Rs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:RP(t.selfUrl),n={},s;for(let $ of r)if(bP($)){n=AP($),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)??$P,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??xP,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??jP,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),T=va(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=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:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...y!==void 0?{mailboxKey:y}:{},...k!==void 0?{tokenPath:k}:{}},f}function AP(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 RP(t){let e=Ld(TP(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 OP(t){let e=LP(t.intervalMs)??JE,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 LP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function XE(t){let e=t.tokenPath??qE(HE(),".lmctl","cli-tokens.json"),r=PE(t.tokenPath);if(hE(r.cognito?.idToken)&&vd()!==null)try{await IE({region:t.region,clientId:t.cognitoClientId??Na,cliTokensPath:e}),r=PE(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 FE({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=CE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ME({region:t.region,credentials:a}),c={ListObjectsV2Command:IP,GetObjectCommand:vP,PutObjectCommand:NP},u=xs(n),d=u??o,f=t.deviceId,m=Sn({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&&DP(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),MP(e),i=!1,o=await FE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=CE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ME({region:t.region,credentials:a}),m=Sn({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,T=t.persistentSessionManager,y=t.promptTriggerStore,k=new ga,$=new Mr({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&&gd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&wd(R.payload)){await T.onInbound(R.payload);return}if(!Ed(R.payload)){if(y!==void 0&&bd(R.payload)){Od({store:y,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})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let v=R=>$.putMessage({conversation_id:yd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:OP({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??JE,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:iE({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 GE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:_a(t.rootDir),r=Sn({identityId:As,userId:As,deviceId:DE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Mr({bucket:"local",identityId:As,userId:As,deviceId:DE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&gd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&wd(c.payload)){await o.onInbound(c.payload);return}if(!Ed(c.payload)){if(i!==void 0&&bd(c.payload)){Od({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:yd,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 PE(t){let e=t??qE(HE(),".lmctl","cli-tokens.json");try{let r=Ia(e,"utf8");return JSON.parse(r)}catch{return{}}}function CP(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}};WE(Ld(t),{recursive:!0,mode:448}),BE(t,JSON.stringify(n,null,2));try{UE(t,384)}catch{}}function MP(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,WE(Ld(t),{recursive:!0,mode:448}),BE(t,JSON.stringify(r,null,2));try{UE(t,384)}catch{}}async function FE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new SP({region:t.region}).send(new kP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{CP(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 DP(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 JE,ka,Na,$P,xP,jP,As,DE,Cd=b(()=>{"use strict";na();fd();hd();aE();cE();uE();dE();fE();Td();ea();Sd();Nd();LE();JE=3e3,ka=1e3,Na="79u5jhkk46qofog661c9i0bdcs",$P="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",xP="us-east-1_4iUdFggDn",jP="lmctl-next-preview-mailbox-254332045686";As="local",DE="local"});import{spawn as Fd}from"node:child_process";import{createInterface as KE}from"node:readline";var Md,Dd,Pd,VE,YE=b(()=>{"use strict";go();$e();Md=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=Fd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=KE({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}}}},Dd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Fd(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}})}},Pd=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=Fd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=KE({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}})}}},VE=t=>{switch(t){case"codex":return new Md;case"claude":case"qwen":return new Dd;case"gemini":case"copilot":case"opencode":return new Pd;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as PP}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}})}}},VE=t=>{switch(t){case"codex":return new Md;case"claude":case"qwen":return new Dd;case"gemini":case"copilot":case"opencode":return new Pd;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as PP}from"node:crypto";import{existsSync as oz,mkdirSync as FP,readFileSync as UP,writeFileSync as WP}from"node:fs";import{homedir as BP}from"node:os";import{dirname as qP,join as HP}from"node:path";function $a(){return process.env.LMCTL_DEVICE_FILE??HP(BP(),".lmctl","device.json")}function Dr(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(UP(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 Ud(t=$a()){let e=Dr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:PP(),created_at:new Date().toISOString()};return FP(qP(t),{recursive:!0}),WP(t,`${JSON.stringify(r,null,2)}
|
|
1796
1796
|
`,{encoding:"utf8",mode:384}),r}var Wd=b(()=>{"use strict"});import*as zE from"node:child_process";function XP(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 Bd(t,e={}){let r=e.spawnSync===void 0&&process.env[GP]==="1",n=e.spawnSync??zE.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=XP(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=JP[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,JP,GP,QE=b(()=>{"use strict";xa={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},JP={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"};GP="LMCTL_SKIP_BINARY_CHECK"});var cb={};le(cb,{ProviderBinaryPreflightError:()=>ja,__setProviderBinaryCheckForTest:()=>r1,bootstrapAgentRestMailbox:()=>rb,publishRegisteredWorkflowsOnStart:()=>tb,resolveLocalMailboxDir:()=>ab,resolveLocalWebuiDir:()=>ib,resolveServeConfig:()=>nb,runProviderBinaryPreflight:()=>ob,runServe:()=>ZP,validateServeArgs:()=>lb});import{randomBytes as KP}from"node:crypto";import{existsSync as VP}from"node:fs";import{homedir as YP}from"node:os";import{isAbsolute as eb,resolve as qd}from"node:path";async function ZP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(zP),0;let r=lb(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1797
|
-
`),2;try{ob(e)}catch(
|
|
1798
|
-
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Yy(n);let i;if(r.localWebui!==void 0){let
|
|
1797
|
+
`),2;try{ob(e)}catch(y){return 1}let n=pe({path:ue()}),s={portCli:n1(t)},o;try{o=nb({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(y){return n.close(),e.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
|
|
1798
|
+
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Yy(n);let i;if(r.localWebui!==void 0){let y=ib(r.localWebui.dir,process.env);if(y===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=ab(process.env),{s3:$,commands:v}=_a(k);i={webuiDir:y,rootDir:k,s3:$,commands:v},e.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${k}
|
|
1799
1799
|
`)}let a=r.noDaemon?void 0:Ky({dal:n,intervalMs:Ns()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Rs({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
|
|
1800
|
-
`);let c=await t1({log:
|
|
1801
|
-
`)}),u=new la({adapterFactory:VE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:
|
|
1800
|
+
`);let c=await t1({log:y=>e.stderr.write(`${y}
|
|
1801
|
+
`)}),u=new la({adapterFactory:VE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>e.stderr.write(`${y}
|
|
1802
1802
|
`)}),d=Dr()?.device_id,f=Fy({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:QP(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await rb({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await tb({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
|
|
1803
|
-
`),await new Promise(
|
|
1803
|
+
`),await new Promise(y=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),y()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function QP(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function tb(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
|
|
1804
1804
|
`)}}async function rb(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await GE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1805
1805
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await XE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1806
1806
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(N_({app:t.app,log:r=>t.io?.stderr.write(`${r}
|
|
@@ -1834,7 +1834,7 @@ scan writes JSON output; --project limits the scan to one project.
|
|
|
1834
1834
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
|
|
1835
1835
|
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.
|
|
1836
1836
|
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,y1,E1,Aa,Fr=b(()=>{"use strict";Jt();mr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},y1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,E1=/^ses_[A-Za-z0-9_-]+$/,Aa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Sb(t){let e=bb(t.registry,t.fromTeamfile);if(e===void 0)return jn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Tb(e,t.fromAlias))return jn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=bb(t.registry,t.toTeamfile);return r===void 0?jn(`target team is not registered in policy graph: ${t.toTeamfile}`):Tb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?jn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?jn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:jn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function bb(t,e){return t.teams.find(r=>r.teamfile===e)}function Tb(t,e){return t.aliases.some(r=>r===e)}function jn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var kb=b(()=>{"use strict"});import{basename as T1}from"node:path";function Nb(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=jb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=v1(e.sender,n),o=I1(e.sender,n);o!==null&&o.teamfile===e.root&&!Ib(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=>Ib(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<S1;return{stop:l.length>=1&&u,chain:N1(a)}}function $b(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=jb(t,r),s=Ab(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 vb;let r=Number(e);return!Number.isFinite(r)||r<=0?vb:r}function xb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function k1(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 jb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(k1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function v1(t,e,r={}){let n=new Map;for(let a of e)n.set(Ur(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Ur(t)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(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=Ur(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ab(t,e){let r=Ur(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=Ur(l.sender),u=Ur(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 I1(t,e){let r=Ab(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ib(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Ur(t){return`${t.teamfile}\0${t.alias}`}function N1(t){return t.map(e=>`${T1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var S1,vb,Rb=b(()=>{"use strict";S1=6e4,vb=8*60*60*1e3});async function Cb(t){let e=Mb(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=>Db(t.fromFlag,n,i)):await L1(e,t.selfSessionId,n),o=await Pb(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=Mb(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,$=>Db(t.fromFlag,a,$)),c=await Pb(r,{explicitRoot:t.rootFlag,sender:l,receiverTeamfile:a,operatorOrigin:t.fromFlag===void 0}),u=t.fromFlag===void 0?null:await C1(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}
|
|
1837
|
-
`}),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=>Nb(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=xb($.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 P1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=B1(a,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 T=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(T.text,"utf8"),lastChunkBytes:g,tailPreview:O1(T.text,200)}));let
|
|
1837
|
+
`}),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=>Nb(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=xb($.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 P1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=B1(a,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 T=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(T.text,"utf8"),lastChunkBytes:g,tailPreview:O1(T.text,200)}));let y=T.status==="stalled",k=await La(r,{...n,message:t.prompt,response:y?null:T.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":y?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:y?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:null});return{status:y?"stalled":"ok",replyText:T.text,wroteDelta:f,teamChatLogId:k,durationMs:T.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 W1(r,s),o!==null&&t.skipAutoDelivery!==!0&&await $1(r,o,t.autoDeliverySender??j1)}}async function $1(t,e,r){try{let n=await L(t,s=>s.claimDeliverableDelegationJobs(e.identity));if(n.length===0)return;for(let s of x1(n))try{await r({teamfile:e.teamfile,alias:e.alias,prompt:A1(s.jobs),fromFlag:`${s.teamfile}:${s.alias}`,io:t,env:e.env})}catch{}}catch{}}function x1(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 j1(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 A1(t){return["Background delegation results:",...t.map(r=>`[background job ${r.id} to ${r.alias}: ${r.status}] ${R1(r)} (full: lmctl jobs show ${r.id})`),"","These results were marked delivered; use lmctl jobs for the full timeline."].join(`
|
|
1838
1838
|
`)}function R1(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 Mb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function O1(t,e){return t.slice(-e)}function Db(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>, got '${t}'`);let s=Ne(n.teamfile,r),o=Pr(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 L1(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=Pr(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=Pr(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 Pb(t,e){return e.explicitRoot!==void 0?await L(t,r=>Ne(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await L(t,r=>$b(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function C1(t,e){return await L(t,r=>Sb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:M1(r,e.sender.teamfile,e.receiverTeamfile)}))}function M1(t,e,r){return{teams:[e,r].map(s=>D1(s,t))}}function D1(t,e){let r=Pr(t,e),n=It(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function P1(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&&F1(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 F1(t,e){return t.holder_pid===null?t.started_at<e:!U1(t.holder_pid)}function U1(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 W1(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)}
|
|
1839
1839
|
`)}}function B1(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function La(t,e){let r=Lb(e.message),n=e.response===null?null:Lb(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)}
|
|
1840
1840
|
`),null}}function Lb(t){return t.length<=Ob?{text:t,truncated:!1}:{text:t.slice(0,Ob),truncated:!0}}var Ob,Hd=b(()=>{"use strict";bt();Fr();Jt();cs();kb();mr();Rb();$e();ke();Ob=256*1024});var qb={};le(qb,{parseIdleTimeoutMs:()=>Ub,runChat:()=>J1});import{spawn as q1}from"node:child_process";async function J1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Fb}
|
|
@@ -1871,7 +1871,7 @@ ${Fb}
|
|
|
1871
1871
|
`):e.stdout.write(`${d.text}${d.text.endsWith(`
|
|
1872
1872
|
`)?"":`
|
|
1873
1873
|
`}`),d.status==="stalled"?1:0}catch(u){let d=u instanceof Error?u.message:String(u);return e.stderr.write(`error: ${d}
|
|
1874
|
-
`),1}}function X1(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 T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --permission-mode";if(T!=="plan"&&T!=="yolo")return`--permission-mode must be one of plan|yolo (got "${T}")`;r=T;continue}if(_==="--idle-timeout"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --idle-timeout";let
|
|
1874
|
+
`),1}}function X1(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 T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --permission-mode";if(T!=="plan"&&T!=="yolo")return`--permission-mode must be one of plan|yolo (got "${T}")`;r=T;continue}if(_==="--idle-timeout"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --idle-timeout";let y=Ub(T);if(typeof y=="string")return y;n=y;continue}if(_==="--session"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --session";s=T;continue}if(_==="--provider"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --provider";o=T;continue}if(_==="--from"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --from";i=T;continue}if(_==="--root"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --root";a=T;continue}if(_==="--force"){l=!0;continue}if(_==="--run"){let T=t[++g];if(T===void 0||T.startsWith("--"))return"missing value for --run";c=T;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 Ub(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 Wb(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
1875
1875
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
1876
1876
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
1877
1877
|
`)}function G1(t,e){return t.slice(-e)}function K1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Wb(t,e.alias,e.event):t.stderr.write(e.message)}function V1(t){Bb();let e=process.argv[1];q1(process.execPath,[e,"jobs","run",String(t)],{detached:!0,stdio:"ignore",env:process.env}).unref()}function Bb(){let t=process.argv[1];if(t===void 0||t.length===0)throw new Error("cannot start detached worker: CLI entrypoint is unavailable")}var H1,Fb,Hb=b(()=>{"use strict";bt();ke();Fr();Hd();$e();yt();ua();Pt();H1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Fb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
@@ -1942,7 +1942,7 @@ Cancelling a pending job prevents it from running. Cancelling a running job
|
|
|
1942
1942
|
marks it cancelled; the provider turn cannot be aborted and its result is discarded.
|
|
1943
1943
|
`,sF=8*60*60*1e3,oF=1e3,iF=4096,aF=new Set(["done","error","busy","cancelled"]),lF=new Set(["pending","running","done","error","busy","cancelled"]);tT=`
|
|
1944
1944
|
... [truncated remaining output -- raise with --max-bytes]
|
|
1945
|
-
`});var Ms,
|
|
1945
|
+
`});var Ms,w6,Gd=b(()=>{"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}],w6=Ms.length});import{spawn as IF}from"node:child_process";async function dT(t,e,r){let n=$F.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 xF(n.name,s)}function xF(t,e){return t==="lmctl_chat"?jF(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function jF(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})),AF(o,process.cwd())}function AF(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=IF("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=RF(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(`
|
|
1946
1946
|
`).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 RF(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return uT;let r=Number(e);return!Number.isFinite(r)||r<=0?uT:r}function Kd(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:NF),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 NF,uT,$F,Vd=b(()=>{"use strict";Gd();$e();NF="http://127.0.0.1:8787",uT=30*60*1e3,$F=new Map(Ms.map(t=>[t.name,t]))});async function MF(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Yd({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:OF,capabilities:{tools:{listChanged:!1}},serverInfo:{name:LF,version:CF}}}};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 dT(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 Yd(t){return`${JSON.stringify(t)}
|
|
1947
1947
|
`}async function fT(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(Yd({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 MF(l,t);c.kind==="response"?t.io.write(Yd(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(`
|
|
1948
1948
|
`);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(`
|
|
@@ -2066,7 +2066,8 @@ refresh to create/update native provider sessions for team members.
|
|
|
2066
2066
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
2067
2067
|
`),t.stdout.write(` Messages: ${ht(o.messageCount)}
|
|
2068
2068
|
`),t.stdout.write(` Model: ${o.model??"(unknown)"}
|
|
2069
|
-
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens:
|
|
2069
|
+
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: n/a"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
|
|
2070
|
+
`),(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&t.stdout.write(` n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
2070
2071
|
`),t.stdout.write(` Created: ${i.createdAt}
|
|
2071
2072
|
`),t.stdout.write(` Modified: ${i.modifiedAt}
|
|
2072
2073
|
`),0)}async function AU(t,e,r,n){let s=$r(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=rn(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}
|
|
@@ -2079,64 +2080,65 @@ refresh to create/update native provider sessions for team members.
|
|
|
2079
2080
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
2080
2081
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
2081
2082
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
2082
|
-
`),0)}async function RU(t,e,r){let n;try{n=Le(e)}catch(
|
|
2083
|
-
`)}let g
|
|
2083
|
+
`),0)}async function RU(t,e,r){let n;try{n=Le(e)}catch(h){return w(t,`health: ${h instanceof Error?h.message:String(h)}`)}let s=CU(e),o=s.kind==="repo"?s:null,i=[],a=0,l=o===null?void 0:0,c=o===null?void 0:0;for(let h of n.members){if(h.teamfile!==void 0||h.session===void 0||h.session.length===0)continue;let g=null;try{g=await Ar(h.session,h.provider)}catch($){t.stderr.write(`warning: failed to load session "${h.session}" for ${h.alias} (${h.provider}): ${$ instanceof Error?$.message:String($)}
|
|
2084
|
+
`)}let _=g?.messageCount,T=o===null?void 0:g===null?null:DU(g,o.since),y=o===null?void 0:g===null?null:PU(g)??"n/a",k=o===null?void 0:{messageCount:T??null,tokens:null};i.push({alias:h.alias,provider:h.provider,sessionid:h.session,messageCount:_??null,model:g?.model??"(unknown)",lastContext:g?.lastInputTokens,detailLoaded:g!==null,...o!==null?{activitySinceLastCommit:k,cumulativeTokens:y}:{}}),_===void 0?a=void 0:a!==void 0&&(a+=_),o!==null&&(T==null?l=void 0:l!==void 0&&(l+=T),y==null||y==="n/a"?c=void 0:c!==void 0&&(c+=y))}if(r)return B(t,{team:n.name,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(h=>({ref:h.ref,timestamp:h.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:i.map(({detailLoaded:h,cumulativeTokens:g,..._})=>({..._,lastContext:_.lastContext??null,...g!==void 0?{cumulativeTokens:g==="n/a"?null:g}:{}})),total:{messageCount:a??null}}),0;let u=Math.max(7,...i.map(h=>h.sessionid.length)),d=Math.max(5,...i.map(h=>h.alias.length))+1,f=Math.max(8,...i.map(h=>h.provider.length))+1,m=Math.max(5,...i.map(h=>h.model.length))+1;if(t.stdout.write(`TEAM: ${n.name}
|
|
2084
2085
|
`),s.kind==="repo"){t.stdout.write(`Git progress:
|
|
2085
|
-
`);for(let
|
|
2086
|
+
`);for(let h of s.commits)t.stdout.write(` ${h.ref}: ${h.timestamp.toISOString()}
|
|
2086
2087
|
`);t.stdout.write(` Uncommitted: ${ht(s.working.uncommittedTracked)} changed (tracked), ${ht(s.working.untracked)} untracked
|
|
2087
2088
|
`)}else s.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${s.teamDir} has no commits (no commit-based progress to report)
|
|
2088
2089
|
`):t.stdout.write(`Git progress: no git repository in ${s.teamDir} (no commit-based progress to report)
|
|
2089
2090
|
`);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)}`:"")+`
|
|
2090
|
-
`);for(let
|
|
2091
|
+
`);let p=!1;for(let h of i){let g=LU(h.lastContext,h.detailLoaded,$U);(g==="n/a"||h.cumulativeTokens==="n/a")&&(p=!0),t.stdout.write(` ${h.sessionid.padEnd(u)} ${h.alias.padEnd(d)}${h.provider.padEnd(f)}${h.model.padEnd(m)}${ht(h.messageCount).padStart(6)} ${g.padStart(12)}`+(o!==null?` ${ht(h.activitySinceLastCommit?.messageCount).padStart(17)} ${ht(h.activitySinceLastCommit?.tokens).padStart(19)} ${OU(h.cumulativeTokens).padStart(19)}`:"")+`
|
|
2091
2092
|
`)}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)}`:"")+`
|
|
2092
|
-
`),
|
|
2093
|
+
`),p&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
2094
|
+
`),0}function ht(t){return t==null?"unknown":String(t)}function OU(t){return t==="n/a"?t:ht(t)}function LU(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function CU(t){let e=vU(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:MU(e)}}function MU(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 DU(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 PU(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 IU,NU,AT=b(()=>{"use strict";an();ke();Fr();Jt();mr();Pt();IU={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},NU=`usage: lmctl health [target] [alias]
|
|
2093
2095
|
lmctl health <teamfile> # team rollup
|
|
2094
2096
|
lmctl health <sessionid> [--provider <name>]
|
|
2095
2097
|
[--json]
|
|
2096
2098
|
|
|
2097
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var OT={};le(OT,{runLs:()=>
|
|
2098
|
-
`),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=
|
|
2099
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var OT={};le(OT,{runLs:()=>BU});import{resolve as Qd}from"node:path";function WU(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 BU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${FU}
|
|
2100
|
+
`),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=UU;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(_>RT)return w(e,`--limit ${_} exceeds maximum (${RT})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await L(e,async _=>qU(e,_,h,g))}catch(_){return me(e,_)}}let i=HU(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 lc(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?Qd(c):Qd(process.cwd());f=f.filter(h=>{let g=Qd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=WU(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}.
|
|
2099
2101
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
2100
2102
|
`);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
|
|
2101
2103
|
`);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()}
|
|
2102
|
-
`)}return 0}async function
|
|
2104
|
+
`)}return 0}async function qU(t,e,r,n){let s=tn(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.
|
|
2103
2105
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2104
2106
|
`);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}
|
|
2105
|
-
`)}return 0}function
|
|
2107
|
+
`)}return 0}function HU(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 FU,UU,RT,LT=b(()=>{"use strict";bt();ke();Pt();FU=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2106
2108
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2107
2109
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2108
2110
|
|
|
2109
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2110
|
-
`),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=Ad(s,Br(n)),i=rf(s.members);i.push(...Al(s.members,Br(n))),i.push(...
|
|
2111
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,UU=50,RT=500});import{existsSync as MT,readFileSync as DT}from"node:fs";import{homedir as JU}from"node:os";import{dirname as XU,resolve as PT}from"node:path";import{fileURLToPath as GU}from"node:url";function rf(t,e={}){let r=[],n=YU(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=eW(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: ${CT(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}": `+(Wa??"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: ${CT(i)}`)}return r}function YU(t){if(!t&&Us)return Us;let e=new Map,r,n=t??zU();if(!MT(n))return r=`${n} not found`,t||ef(e),t||(Us=e),t||(Wa=r),e;let s;try{s=DT(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||ef(e),t||(Us=e),t||(Wa=r),e}for(let[o,i]of Object.entries(KU)){let a=ZU(s,i),l=QU(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&ef(e),t||(Us=e),t||(Wa=r),e}function zU(){let t=XU(GU(import.meta.url));return PT(t,"..","..","..","durable-memory","model_selection.md")}function ef(t){for(let[e,r]of Object.entries(VU))t.set(e,r)}function ZU(t,e){let n=new RegExp(`^## ${rW(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 QU(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 eW(t){let e=t??PT(JU(),".config","opencode","opencode.json"),r=qm();if(!MT(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(DT(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([...tW(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function tW(t){if(!tf(t))return[];let e=Ua(t.provider)??Ua(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!tf(s))continue;let o=Ua(s.models)??Ua(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ua(t){return tf(t)?t:null}function tf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function CT(t){return t.length>0?t.join(", "):"(none)"}function rW(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var KU,VU,Us,Wa,FT=b(()=>{"use strict";jl();KU={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},VU={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,{GEMINI_PROVIDER_NOTICE:()=>HT,_setLintSessiondirFsOpsForTests:()=>gW,_setSkillFileOpsForTests:()=>_W,_setTeamfileSeedForTests:()=>hW,buildRootTeamRegistrationRow:()=>VT,registerRootTeam:()=>YT,runHire:()=>vW,runLint:()=>kW,runRefresh:()=>IW,runSeed:()=>GT,sha256Text:()=>KT,skillNameFromSource:()=>ff,skillNameFromUrl:()=>UW});import{createHash as nW,randomUUID as sW}from"node:crypto";import{accessSync as oW,constants as UT,existsSync as iW,mkdirSync as aW,readFileSync as Ja,realpathSync as Ha,renameSync as lW,statSync as cW,unlinkSync as uW,writeFileSync as qs}from"node:fs";import{basename as dW,dirname as Br,isAbsolute as WT,join as of,resolve as df}from"node:path";function hW(t){JT=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(bt(),uc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function _W(t){Bs=t===null?af:{...af,...t}}function gW(t){Wr=t===null?lf:{...lf,...t}}function wW(t,e){let r=Br(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=df(i);if(n.has(a))continue;let l=yW(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 yW(t){try{if(Wr.existsSync(t)){if(!Wr.statSync(t).isDirectory())return"ENOTDIR";Wr.accessSync(t,UT.W_OK);return}let e=TW(t);if(e===void 0)return;if(!Wr.statSync(e).isDirectory())return"ENOTDIR";Wr.accessSync(e,UT.W_OK);return}catch(e){return SW(e)??"permission check failed"}}function EW(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||XT(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function bW(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!XT(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=zT(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function XT(t,e){return BT(t)===BT(e)}function BT(t){let e=df(t);try{return Ha(e)}catch{return e}}function TW(t){let e=t;for(;;){try{if(Wr.existsSync(e))return e}catch{return}let r=Br(e);if(r===e)return;e=r}}function SW(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 kW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(mW),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2112
|
+
`),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=Ad(s,Br(n)),i=rf(s.members);i.push(...Al(s.members,Br(n))),i.push(...wW(s.members,n)),i.push(...EW(s.members,Br(n)));for(let a of o)e.stderr.write(`error: ${a.field}: ${a.message}
|
|
2111
2113
|
`);for(let a of s.members)uf([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}
|
|
2112
2114
|
`);return await L(e,a=>{wb(n,a,l=>e.stderr.write(`${l}
|
|
2113
2115
|
`))}),o.length>0?1:(e.stdout.write(`ok
|
|
2114
|
-
`),0)}async function GT(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(
|
|
2115
|
-
`),2;let r=t[0],n;try{n=await L(e,
|
|
2116
|
-
`),c=
|
|
2117
|
-
`);return 1}uf(i.members,e);for(let
|
|
2118
|
-
`);for(let
|
|
2119
|
-
`);let f=await
|
|
2120
|
-
`),1;let h=i.members.find(
|
|
2121
|
-
`)});let
|
|
2116
|
+
`),0)}async function GT(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(pW),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2117
|
+
`),2;let r=t[0],n;try{n=await L(e,y=>Ne(r,y))}catch(y){return Re(e,`${r}: ${y instanceof Error?y.message:String(y)}`)}let s;try{s=Ha(n)}catch(y){return Re(e,`${r}: ${y instanceof Error?y.message:String(y)}`)}let o=Br(n),i;try{i=Le(n)}catch(y){return Re(e,`${r}: ${y instanceof Error?y.message:String(y)}`)}let l=Ja(n,"utf8").split(`
|
|
2118
|
+
`),c=xW(l),u=bW(i.members,l,c,o),d=Ad(i,o);if(d.length>0){uf(i.members,e);for(let y of d)e.stderr.write(`error: ${y.field}: ${y.message}
|
|
2119
|
+
`);return 1}uf(i.members,e);for(let y of rf(i.members))e.stderr.write(`warning: ${y}
|
|
2120
|
+
`);for(let y of Al(i.members,o))e.stderr.write(`warning: ${y}
|
|
2121
|
+
`);let f=await MW(i.skillUrls,o,e);if(f!==0)return f;let m=0,p=i.members.filter(y=>y.teamfile!==void 0?!1:y.session===void 0||y.session.length<Ws);for(let y of p)if(!QT(y.provider))return e.stderr.write(`error: ${y.alias}: invalid provider "${y.provider}"
|
|
2122
|
+
`),1;let h=i.members.find(y=>y.alias.toLowerCase()==="lead");if(h!==void 0){Vr("lmctl","lmctl_chat",{warn:$=>e.stderr.write(`${$}
|
|
2123
|
+
`)});let y=h.sessiondir??o,k=Uc(h.provider,y);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
|
|
2122
2124
|
`):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
|
|
2123
|
-
`:`.mcp.json installed in ${
|
|
2124
|
-
`)}for(let
|
|
2125
|
-
`);continue}let k=
|
|
2126
|
-
`),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: ${
|
|
2127
|
-
`),1}let v=c.get(
|
|
2128
|
-
`),1;let A=
|
|
2129
|
-
`),"utf8"),e.stdout.write(`${
|
|
2125
|
+
`:`.mcp.json installed in ${y}
|
|
2126
|
+
`)}for(let y of i.members){if(y.teamfile!==void 0)continue;if(y.session!==void 0&&y.session.length>=Ws){e.stderr.write(`warning: ${y.alias}: existing sessionid preserved; skipping
|
|
2127
|
+
`);continue}let k=y.sessiondir??o,$=await JT({provider:y.provider,cwd:k,...y.model!==void 0?{model:y.model}:{},...y.effort!==void 0?{effort:y.effort}:{},...y.alias.toLowerCase()==="lead"?{prompt:NW(n,l.join(`
|
|
2128
|
+
`),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: ${y.alias}: seed failed${$.error!==void 0?`: ${$.error}`:`; ${F}`}
|
|
2129
|
+
`),1}let v=c.get(y.alias.toLowerCase());if(v===void 0)return e.stderr.write(`error: ${y.alias}: could not find matching _MEMBER_ line to update
|
|
2130
|
+
`),1;let A=OW(l[v],"sessionid",$.sessionId);l[v]=A,m+=1,qs(n,l.join(`
|
|
2131
|
+
`),"utf8"),e.stdout.write(`${y.alias}: seeded ${$.sessionId}
|
|
2130
2132
|
`)}let g=l.join(`
|
|
2131
|
-
`),_=
|
|
2132
|
-
`);let T=new Date().toISOString();return await L(e,
|
|
2133
|
+
`),_=CW(g,Ha(n));(_!==g||u)&&qs(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
|
|
2134
|
+
`);let T=new Date().toISOString();return await L(e,y=>{YT(y,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function vW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(qa),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return sf(e,r.error,qa);if(r.positionals.length!==2)return sf(e,"expected <teamfile.lmctl> and <alias>",qa);let[n,s]=r.positionals;if(!RW(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 sf(e,"missing value for --provider",qa);if(!QT(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=Ja(i,"utf8")}catch(d){return Re(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(AW(a,s))return Re(e,`${s}: alias already exists in ${i}`);let l=x(r,"--sessiondir"),c=[`_MEMBER_ alias=${cf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${cf(l)}`]].join(" "),u=LW(a,c);return qs(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
2133
2135
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
2134
|
-
`),0}async function
|
|
2135
|
-
`),a
|
|
2136
|
-
`),"utf8"),GT([s],e))}function KT(t){return
|
|
2137
|
-
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i
|
|
2138
|
-
`)}function
|
|
2139
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Hs(r,"alias")===e)return!0;return!1}function
|
|
2136
|
+
`),0}async function IW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(nf),0;let r,n;if(t.length===1){let d=Ls(t[0]);if(d===null)return e.stderr.write(nf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(nf),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=Ja(s,"utf8")}catch(d){return Re(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
2137
|
+
`),a=jW(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]=zT(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),qs(s,i.join(`
|
|
2138
|
+
`),"utf8"),GT([s],e))}function KT(t){return nW("sha256").update(t).digest("hex")}function VT(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:KT(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function YT(t,e){let r=VT(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function NW(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(`
|
|
2139
|
+
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=$W(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(`
|
|
2140
|
+
`)}function $W(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 xW(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 jW(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 AW(t,e){for(let r of t.split(`
|
|
2141
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Hs(r,"alias")===e)return!0;return!1}function RW(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 OW(t,e,r){let n=`${e}=${cf(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function zT(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function cf(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function LW(t,e){let r=t.split(`
|
|
2140
2142
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
|
|
2141
2143
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
2142
2144
|
`),i=r.slice(s).join(`
|
|
@@ -2144,24 +2146,24 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2144
2146
|
|
|
2145
2147
|
`:""}${e}${i.length>0?`
|
|
2146
2148
|
${i}`:`
|
|
2147
|
-
`}`}function
|
|
2149
|
+
`}`}function CW(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
|
|
2148
2150
|
`),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}
|
|
2149
2151
|
${o}`:`${r}
|
|
2150
2152
|
`:t.length>0?`${r}
|
|
2151
2153
|
${t}`:`${r}
|
|
2152
|
-
`}async function
|
|
2154
|
+
`}async function MW(t,e,r){if(t.length===0)return 0;let n=of(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await ZT(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}
|
|
2153
2155
|
`);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
|
|
2154
2156
|
${i.body}${i.body.endsWith(`
|
|
2155
2157
|
`)?"":`
|
|
2156
|
-
`}`;try{Bs.mkdirSync(n,{recursive:!0}),
|
|
2157
|
-
`)}return 0}async function ZT(t,e,r,n,s){if(s>Ba)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ba}`);let o=await
|
|
2158
|
+
`}`;try{Bs.mkdirSync(n,{recursive:!0}),FW(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
|
|
2159
|
+
`)}return 0}async function ZT(t,e,r,n,s){if(s>Ba)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ba}`);let o=await DW(t,e),i=PW(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:ff(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>=Ba)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${Ba}`);for(let a of i)await ZT(a,o.base,r,n,s+1)}async function DW(t,e){if(e.kind==="https"){if(Kt(t)||!WT(t)){let o=qT(t,e),i;try{i=await br(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=qT(t,e),i;try{i=await br(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=WT(t)?t:df(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Ha(r),s=Ja(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:Br(n)},text:s}}function qT(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 PW(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 FW(t,e,r){let n=of(t,`${e}.md`),s=of(t,`${e}.${process.pid}.${sW().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 UW(t){return ff(t)}function ff(t){let e=gt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(dW(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,fW).replace(/-+$/gu,"")||"skill"}function QT(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}
|
|
2158
2160
|
`),1}function sf(t,e,r){return t.stderr.write(`error: ${e}
|
|
2159
2161
|
${r}`),2}function uf(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_
|
|
2160
2162
|
`),r.provider==="gemini"&&e.stderr.write(`${HT.replace("%s",r.alias)}
|
|
2161
|
-
`)}var Ws,
|
|
2163
|
+
`)}var Ws,fW,Ba,mW,pW,qa,nf,HT,af,lf,JT,Bs,Wr,Xs=b(()=>{"use strict";Jt();FT();go();yt();mo();ke();mr();to();cs();Fr();mr();Ws=5,fW=80,Ba=16,mW=`usage: lmctl lint <teamfile.lmctl>
|
|
2162
2164
|
|
|
2163
2165
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
2164
|
-
`,
|
|
2166
|
+
`,pW=`usage: lmctl seed <teamfile.lmctl>
|
|
2165
2167
|
|
|
2166
2168
|
Seed missing or placeholder session ids in an lmctl teamfile by calling each
|
|
2167
2169
|
member's configured native provider.
|
|
@@ -2178,32 +2180,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2178
2180
|
re-seed.
|
|
2179
2181
|
A member cannot refresh its own running session; run the refresh from a
|
|
2180
2182
|
meta-Lead or operator shell outside that sessiondir.
|
|
2181
|
-
`,HT='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',af={mkdirSync:
|
|
2182
|
-
`),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=tS(r);if(!mf(c))throw new Error(`source not found: ${r}`);let d=rS(c).isDirectory()?
|
|
2183
|
-
`),1}let i=tS(n),a=
|
|
2184
|
-
`),1;let l=
|
|
2183
|
+
`,HT='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',af={mkdirSync:aW,writeFileSync:qs,renameSync:lW,unlinkSync:uW},lf={existsSync:iW,statSync:cW,accessSync:oW},JT=async t=>{let{seed:e}=await Promise.resolve().then(()=>(bt(),uc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Bs=af,Wr=lf});var sS={};le(sS,{runClone:()=>KW});import{existsSync as mf,mkdirSync as WW,readFileSync as BW,readdirSync as qW,statSync as rS,writeFileSync as HW}from"node:fs";import{basename as eS,dirname as JW,extname as XW,join as nS,resolve as tS}from"node:path";async function KW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(GW),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2184
|
+
`),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=tS(r);if(!mf(c))throw new Error(`source not found: ${r}`);let d=rS(c).isDirectory()?VW(c):c;s=BW(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2185
|
+
`),1}let i=tS(n),a=YW(i,o,n);if(mf(a))return e.stderr.write(`error: ${a} already exists.
|
|
2186
|
+
`),1;let l=ZW(zW(s));return WW(JW(a),{recursive:!0}),HW(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
2185
2187
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2186
2188
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2187
2189
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
2188
|
-
`),0}function
|
|
2190
|
+
`),0}function VW(t){let e=qW(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 nS(t,e[0])}function YW(t,e,r){if(r.endsWith("/")||mf(t)&&rS(t).isDirectory()){let n=eS(e).endsWith(".lmctl")?eS(e):"team.lmctl";return nS(t,n)}return XW(t)?t:`${t}.lmctl`}function zW(t){return t.split(`
|
|
2189
2191
|
`).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(`
|
|
2190
|
-
`)}function
|
|
2192
|
+
`)}function ZW(t){return t.split(`
|
|
2191
2193
|
`).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(`
|
|
2192
|
-
`)}var
|
|
2194
|
+
`)}var GW,oS=b(()=>{"use strict";GW=`usage: lmctl clone <source> <dest>
|
|
2193
2195
|
|
|
2194
2196
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2195
2197
|
|
|
2196
2198
|
Examples:
|
|
2197
2199
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2198
|
-
`});var lS={};le(lS,{runPlan:()=>
|
|
2200
|
+
`});var lS={};le(lS,{runPlan:()=>oB});import{existsSync as QW,mkdirSync as eB,writeFileSync as tB}from"node:fs";import{basename as iS,extname as aS,join as rB,resolve as nB}from"node:path";async function oB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(sB),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2199
2201
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2200
2202
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2201
|
-
`),2;let n=
|
|
2202
|
-
`),1):(
|
|
2203
|
+
`),2;let n=nB(r.positionals[0]);eB(n,{recursive:!0});let s=x(r,"--team")??iS(n),o=x(r,"--provider")??"claude",i=rB(n,iB(s));return QW(i)?(e.stderr.write(`error: ${i} already exists.
|
|
2204
|
+
`),1):(tB(i,lB({teamName:aB(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
|
|
2203
2205
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2204
2206
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2205
2207
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2206
|
-
`),0)}function
|
|
2208
|
+
`),0)}function iB(t){return aS(t)?t:`${t}.lmctl`}function aB(t){let e=aS(t);return e?iS(t,e):t}function lB(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
|
|
2207
2209
|
|
|
2208
2210
|
# Lead, you take tasks from the operator. Clarify only when needed,
|
|
2209
2211
|
# then first use lmctl_chat to ping each of your members with a one-line
|
|
@@ -2247,7 +2249,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
|
|
|
2247
2249
|
refreshed or swapped-in agent loses its chat history but NOT what's written
|
|
2248
2250
|
here. When a task is done, record durable project knowledge in durable-memory/
|
|
2249
2251
|
and keep durable-memory/index.md current so any agent can get up to speed fast.
|
|
2250
|
-
`}var
|
|
2252
|
+
`}var sB,cS=b(()=>{"use strict";ke();sB=`usage: lmctl plan [options] <directory>
|
|
2251
2253
|
|
|
2252
2254
|
Generate a starter lmctl team document template for a directory.
|
|
2253
2255
|
|
|
@@ -2262,7 +2264,7 @@ Examples:
|
|
|
2262
2264
|
|
|
2263
2265
|
# Same shape, codex for the Lead and Reviewer2
|
|
2264
2266
|
lmctl plan ./backend --provider codex
|
|
2265
|
-
`});var fS={};le(fS,{SIZE_WARN_EST_TOKENS:()=>Gs,estimateTokens:()=>dS,runTerminal:()=>
|
|
2267
|
+
`});var fS={};le(fS,{SIZE_WARN_EST_TOKENS:()=>Gs,estimateTokens:()=>dS,runTerminal:()=>fB});import{spawn as cB}from"node:child_process";import{statSync as uB}from"node:fs";async function fB(t,e){if(t.includes("--help")||t.includes("-h"))return gB(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=py(i,s,a);return"err"in l?w(e,l.err):pf(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(dB,{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=>mB(e,a.teamfile,a.alias,l))}try{return await L(e,async s=>{let o=pB(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return M(r,"--size")?_B(e,s,o,i,M(r,"--json")):hB(e,s,o,i)})}catch(s){return me(e,s)}}async function mB(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 pf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function pf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!ti(r))return w(t,`no resume incantation for provider "${r}"`);if(!Nh.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Rc(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=cB(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 pB(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 hB(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`):pf(t,{provider:xe(s),sessionid:o,sessiondir:s.sessiondir})}function dS(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=uB(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 _B(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 Ar(l,c));let d=dS(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?on(c,l):null})}if(s)return B(t,{estimate:!0,legend:uS,guide_tokens:Gs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2266
2268
|
`),t.stdout.write(`${uS}
|
|
2267
2269
|
`);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)
|
|
2268
2270
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2270,7 +2272,7 @@ Examples:
|
|
|
2270
2272
|
session yourself:
|
|
2271
2273
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2272
2274
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2273
|
-
`)}return 0}function
|
|
2275
|
+
`)}return 0}function gB(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2274
2276
|
lmctl terminal <teamfile> <alias>
|
|
2275
2277
|
lmctl terminal --run <id> [--alias A]
|
|
2276
2278
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2301,56 +2303,56 @@ Examples:
|
|
|
2301
2303
|
tokens it surfaces the resume incantation so YOU can
|
|
2302
2304
|
open & self-compact. Nothing is ever changed
|
|
2303
2305
|
automatically; ${Gs} is a guide, not a gate.
|
|
2304
|
-
`),0}var
|
|
2306
|
+
`),0}var dB,Gs,uS,mS=b(()=>{"use strict";Ue();an();ke();Vc();Fr();Jt();yt();cs();ua();dB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Gs=2e5,uS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as hf,dirname as gS}from"node:path";function _f(t,e){let r=hf(t);for(;;){let n=wB(e,r);if(n!==null)return n;let s=gS(r);if(s===r)return null;r=s}}function wB(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Xa(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Ga(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function gf(t){if(t.io.dal!==void 0){let o=pS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new st(hS(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(Xa()||Ga()){let o=ue(),i=pe({path:o}),a=pS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new st(hS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Ga()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Xa()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?yS(t.cwd):yB(t.projectName),r=ES(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 wS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Xa()||Ga()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Ga()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Xa()?"explicit-db":"explicit-workspace"}}let e;try{e=yS(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=ES(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 pS(t,e,r){return r!==void 0?t.findProjectByName(r):_f(e,t)}function hS(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 yB(t){let e=[];for(let r of tl())for(let n of bS(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 yS(t){let e=EB(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of tl())for(let o of bS(s)){let i=hf(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 ES(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>
|
|
2305
2307
|
${_S(n)}`):new st(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2306
2308
|
${_S(n)}`)}function _S(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2307
|
-
`)}function
|
|
2308
|
-
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return hr(e,r.error);if(r.positionals.length>1)return hr(e,Ka);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 hr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Kt(c))return hr(e,Ka);if(sr(c))return TS(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):TS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return hr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return hr(e,Ka);if(i!==void 0&&(o!==void 0||a!==void 0))return hr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=
|
|
2309
|
+
`)}function EB(t){let e=[],r=hf(t);for(;;){e.push(r);let n=gS(r);if(n===r)return e;r=n}}function bS(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>_l)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,wf=b(()=>{"use strict";hl();wl();Ue();Ye();st=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var kf={};le(kf,{assertNoCrossWorkflowSubflowCycle:()=>$S,firstUnregisteredArchetype:()=>Sf,runWorkflow:()=>LB});import{createHash as bf,randomUUID as bB}from"node:crypto";import{existsSync as TB,readFileSync as Ya,readdirSync as SB,writeFileSync as kB}from"node:fs";import{basename as vB,join as IB,resolve as NB}from"node:path";import{pathToFileURL as $B}from"node:url";function Tf(t,e){return{source_uri:$B(NB(t)).href,source_sha256:bf("sha256").update(e).digest("hex")}}function kS(t){return bf("sha256").update(t).digest("hex")}async function RB(t){let e=await br(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:kS(e),remote:!0}}async function Va(t){if(sr(t)){let n=await is(t),s=Ya(n,"utf8");return{definition:s,source_uri:t,source_sha256:kS(s),remote:!1}}let e=Un(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(gt(t))return RB(t);let r=Ya(t,"utf8");return{definition:r,...Tf(t,r),remote:!1}}function vS(t){return De(t.definition)}function IS(t){if(t.definition_schema_version!==3)return null;let e=Sf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function OB(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 LB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(AB),0;try{return r==="run"?await CB(n,e):await L(e,s=>{switch(r){case"load":return FB(n,e,s);case"author":return UB(n,e,s);case"list":return WB(n,e,s);case"sync":return BB(n,e,s);case"export":return qB(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 CB(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Ka}
|
|
2310
|
+
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return hr(e,r.error);if(r.positionals.length>1)return hr(e,Ka);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 hr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Kt(c))return hr(e,Ka);if(sr(c))return TS(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):TS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return hr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return hr(e,Ka);if(i!==void 0&&(o!==void 0||a!==void 0))return hr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=MB(i);if(m===null)return hr(e,`invalid --job: ${i}`);let p=wS({cwd:process.cwd(),io:e});try{let h=await ks({dal:p.dal,job_id:m,worker_id:yf()});return Ef(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=NS(a,e);if(d===za)return 2;let f=gf({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:yf()});return Ef(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 TS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=NS(o,r);if(l===za)return 2;let c,u;try{c=await Va(t),u=vS(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=IS(u);if(d!==null)return w(r,d);if(c.remote&&!await DB(r,c,u,a))return 1;let f=gf({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:yf()});return Ef(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 hr(t,e){return t.stderr.write(`error: ${e}
|
|
2309
2311
|
`),2}function NS(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)}
|
|
2310
2312
|
`),za}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2311
|
-
`),za):r}function
|
|
2313
|
+
`),za):r}function MB(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function yf(){return`cli-${process.pid}-${bB().slice(0,8)}`}function Ef(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})`:""}
|
|
2312
2314
|
`),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}
|
|
2313
2315
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2314
2316
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2315
2317
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
2316
|
-
`)),e.status==="failed"?1:0}async function
|
|
2318
|
+
`)),e.status==="failed"?1:0}async function DB(t,e,r,n){let s=OB(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(`
|
|
2317
2319
|
`)+`
|
|
2318
|
-
`),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
|
|
2319
|
-
`),a}function
|
|
2320
|
+
`),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 PB(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
|
|
2321
|
+
`),a}function PB(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 FB(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 Va(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(gt(s))try{o=await Va(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 Va(s)}let i;try{i=vS(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?IS(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}
|
|
2320
2322
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2321
2323
|
sha256: ${o.source_sha256}
|
|
2322
|
-
`),0}function Sf(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 SS(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 $S(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
|
|
2323
|
-
`),0}function
|
|
2324
|
+
`),0}function Sf(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 SS(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 $S(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 UB(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=Ya(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=Sf(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{$S(u,SS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return SS(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,...Tf(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:bf("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)
|
|
2325
|
+
`),0}function WB(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(`
|
|
2324
2326
|
`)}${s.length>0?`
|
|
2325
|
-
`:""}`),0}function
|
|
2326
|
-
`),0}function
|
|
2327
|
-
`,c=x(n,"--out");return c!==void 0?(
|
|
2328
|
-
`)):e.stdout.write(l),0}var
|
|
2327
|
+
`:""}`),0}function BB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);ii({swallow:!0});let s=Rh(),o=[];try{o=TB(s)?SB(s).filter(c=>xB.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=IB(s,c),d=Ya(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:vB(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=Tf(u,d),y=r.getWorkflowByName(p);if(y!==null&&y.source_sha256===T.source_sha256){l+=1;continue}let k=y===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),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
|
|
2328
|
+
`),0}function qB(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:jB,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)}
|
|
2329
|
+
`,c=x(n,"--out");return c!==void 0?(kB(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2330
|
+
`)):e.stdout.write(l),0}var xB,jB,AB,Ka,za,vf=b(()=>{"use strict";Lu();_n();li();Dc();ke();wf();to();vs();xB=[".compound.json",".lmctl"],jB="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",AB=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2329
2331
|
|
|
2330
2332
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2331
2333
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2332
2334
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2333
2335
|
remote https:// workflow after a trust prompt.
|
|
2334
|
-
`,Ka="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]";za=Symbol("inputs-error")});function If(t,e){let r=
|
|
2335
|
-
`)}return 0}function
|
|
2336
|
-
`),0}function
|
|
2336
|
+
`,Ka="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]";za=Symbol("inputs-error")});function If(t,e){let r=HB[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 HB,xS=b(()=>{"use strict";HB={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 MS={};le(MS,{initWorkspace:()=>LS,runWorkspace:()=>zB,setWorkspaceProvider:()=>CS});import{copyFileSync as JB,cpSync as XB,existsSync as Fe,mkdirSync as _r,readdirSync as $f,renameSync as GB,rmSync as Za,statSync as Qa,writeFileSync as KB}from"node:fs";import{spawnSync as VB}from"node:child_process";import{homedir as jS}from"node:os";import{dirname as xf,join as Ks}from"node:path";async function zB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(YB),0;switch(r){case"list":return ZB(n,e);case"create":return QB(n,e);case"use":return e2(n,e);case"show":return t2(n,e);case"delete":return r2(n,e);case"migrate":return n2(n,e);case"init":return LS(n,e);case"set-provider":return CS(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function RS(){let t=Ys(),e=[],r=new Set,n=yr.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(wr())){let i;try{i=$f(wr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!He(a))continue;let l=!1;try{l=Qa(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 ZB(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=RS();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}
|
|
2337
|
+
`)}return 0}function QB(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")??rl(n);_r(s,{recursive:!0}),_r(o,{recursive:!0});let i=Xt(n);_r(xf(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}
|
|
2338
|
+
`),0}function e2(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!==yr.default&&!Fe(jt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Vs();return _r(xf(s),{recursive:!0}),KB(s,`${n}
|
|
2337
2339
|
`),M(r,"--json")?B(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2338
|
-
`),0}function
|
|
2339
|
-
`),0}function
|
|
2340
|
-
`),0):w(e,`workspace not found: ${n}`)}function Nf(t,e,r){try{
|
|
2341
|
-
`),Qa(t).isDirectory()?
|
|
2340
|
+
`),0}function t2(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=RS().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)?Qa(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)}
|
|
2341
|
+
`),0}function r2(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===yr.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)?(Za(o,{recursive:!0,force:!0}),M(r,"--json")?B(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2342
|
+
`),0):w(e,`workspace not found: ${n}`)}function Nf(t,e,r){try{GB(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
|
|
2343
|
+
`),Qa(t).isDirectory()?XB(t,e,{recursive:!0}):JB(t,e),!Fe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Za(t,{recursive:!0,force:!0})}function n2(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=nl(),o=wr(),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}
|
|
2342
2344
|
`);e.stdout.write(f?`migration complete
|
|
2343
2345
|
`:`${m??"nothing to migrate"}
|
|
2344
|
-
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=$f(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Qa(Ks(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Za(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))Nf(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\`)`);_r(o,{recursive:!0});for(let m of c)Nf(Ks(s,m),Ks(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{$f(s).length===0&&(Za(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Hf(),d=Vs();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Nf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function OS(t,e){return
|
|
2346
|
+
`)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=$f(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Qa(Ks(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Za(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))Nf(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\`)`);_r(o,{recursive:!0});for(let m of c)Nf(Ks(s,m),Ks(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{$f(s).length===0&&(Za(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Hf(),d=Vs();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Nf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function OS(t,e){return VB(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function i2(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 AS(t){return t==="~"?jS():t.startsWith("~/")?Ks(jS(),t.slice(2)):t}async function LS(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(`
|
|
2345
2347
|
`)+`
|
|
2346
2348
|
`),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??OS,a=On.map(v=>If(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
|
|
2347
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2349
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??i2,u=r.promptLine!==void 0||l,d=v=>(e.stderr.write(`error: ${v} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2348
2350
|
`),2),f,m=x(s,"--name");if(m!==void 0){if(!He(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2349
2351
|
`),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)
|
|
2350
2352
|
`)}}let p=jt(f);if(Fe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2351
|
-
`),2;let h,g=x(s,"--basedir"),_=rl(f);if(g!==void 0)h=AS(g);else{if(!u)return d("--basedir");let v=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=v.length===0?_:AS(v)}let T={};for(let v of["provider1","provider2","provider3"]){let A=x(s,`--${v}`),F=
|
|
2352
|
-
`),2;T[v]=A;continue}if(!u)return d(`--${v}`);for(;;){let J=(await c(`${v} (${
|
|
2353
|
-
`)}}_r(p,{recursive:!0}),_r(h,{recursive:!0});let
|
|
2353
|
+
`),2;let h,g=x(s,"--basedir"),_=rl(f);if(g!==void 0)h=AS(g);else{if(!u)return d("--basedir");let v=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=v.length===0?_:AS(v)}let T={};for(let v of["provider1","provider2","provider3"]){let A=x(s,`--${v}`),F=s2[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(", ")})
|
|
2354
|
+
`),2;T[v]=A;continue}if(!u)return d(`--${v}`);for(;;){let J=(await c(`${v} (${o2[v]}) [${U}]: `)).trim(),R=J.length===0?U:J;if(a.includes(R)){T[v]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
|
|
2355
|
+
`)}}_r(p,{recursive:!0}),_r(h,{recursive:!0});let y=Xt(f);_r(xf(y),{recursive:!0});let k=pe({path:y});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",T.provider1),k.setConfig("workspace.provider2",T.provider2),k.setConfig("workspace.provider3",T.provider3)}finally{k.close()}let $={name:f,dir:p,db_path:y,basedir:h,providers:{...T}};return M(s,"--json")?B(e,$):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2354
2356
|
`),e.stdout.write(` basedir: ${h}
|
|
2355
2357
|
`),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
|
|
2356
2358
|
`),e.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
@@ -2360,7 +2362,7 @@ remote https:// workflow after a trust prompt.
|
|
|
2360
2362
|
`),2;let c=r.spawn??OS,u=On.map(p=>If(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
|
|
2361
2363
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2362
2364
|
`),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()??yr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2363
|
-
`),0}var
|
|
2365
|
+
`),0}var YB,On,s2,o2,DS=b(()=>{"use strict";Ue();xS();ke();Ye();YB=`usage: lmctl workspace list [--json]
|
|
2364
2366
|
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
2365
2367
|
lmctl workspace use <name> [--json]
|
|
2366
2368
|
lmctl workspace show <name> [--json]
|
|
@@ -2372,18 +2374,18 @@ remote https:// workflow after a trust prompt.
|
|
|
2372
2374
|
Manage isolated workspace state directories, active workspace selection,
|
|
2373
2375
|
legacy profile migration, and configured provider slots.
|
|
2374
2376
|
delete requires --confirm; deleting default or active workspaces also requires --force.
|
|
2375
|
-
`;On=["claude","codex","gemini","qwen"],
|
|
2376
|
-
`),0}function
|
|
2377
|
+
`;On=["claude","codex","gemini","qwen"],s2={provider1:"claude",provider2:"codex",provider3:"gemini"},o2={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var US={};le(US,{runProject:()=>u2});import{existsSync as a2,statSync as l2}from"node:fs";import{join as FS}from"node:path";async function u2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(c2),0;try{return await L(e,s=>{switch(r){case"create":return y2(n,e,s);case"list":return E2(n,e,s);case"show":return g2(n,e,s);case"status":return w2(n,e,s);case"workflow":return d2(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function d2(t,e,r){let[n,...s]=t;switch(n){case"add":return f2(s,e,r);case"list":return m2(s,e,r);case"show":return p2(s,e,r);case"remove":return h2(s,e,r);case"enable":return PS(s,e,r,!0);case"disable":return PS(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function f2(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=_2(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}
|
|
2378
|
+
`),0}function m2(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(`
|
|
2377
2379
|
`)}${i.length>0?`
|
|
2378
|
-
`:""}`),0}function
|
|
2379
|
-
`),0)}function
|
|
2380
|
+
`:""}`),0}function p2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=jf(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)}
|
|
2381
|
+
`),0)}function h2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=jf(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}
|
|
2380
2382
|
`),0):w(e,`project workflow not found: ${s}`)}function PS(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let o=jf(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}
|
|
2381
|
-
`),0)}function
|
|
2382
|
-
`),0}function
|
|
2383
|
-
`),0}function
|
|
2384
|
-
`),0}function
|
|
2383
|
+
`),0)}function _2(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 jf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function g2(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)}
|
|
2384
|
+
`),0}function w2(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)}
|
|
2385
|
+
`),0}function y2(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?FS(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 T=_!==void 0?_:b2(d)||ns(d)?"folder":"db",y=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:T});return M(n,"--json")?B(e,y):e.stdout.write(`created project ${y.name}
|
|
2386
|
+
`),0}function E2(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(`
|
|
2385
2387
|
`)}${s.length>0?`
|
|
2386
|
-
`:""}`),0}function
|
|
2388
|
+
`:""}`),0}function b2(t){try{let e=FS(t,"durable-memory");return a2(e)&&l2(e).isDirectory()}catch{return!1}}var c2,WS=b(()=>{"use strict";ke();fn();ss();c2=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2387
2389
|
lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2388
2390
|
lmctl project list [--json]
|
|
2389
2391
|
lmctl project show <name> [--json]
|
|
@@ -2398,7 +2400,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2398
2400
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2399
2401
|
per-project workflow bindings and routing conditions.
|
|
2400
2402
|
If project create omits --local-path, project.docroot must be configured.
|
|
2401
|
-
`});import{createHash as
|
|
2403
|
+
`});import{createHash as T2,randomBytes as S2}from"node:crypto";import{readFile as k2}from"node:fs/promises";function BS(t=new Date,e=S2(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 v2(t){return T2("sha256").update(t).digest("hex")}async function qS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await k2(n);return{path:r,sha256:v2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function HS(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 Af=b(()=>{"use strict"});import{spawnSync as JS}from"node:child_process";import{mkdir as Rf,writeFile as XS,readFile as I2,rm as GS}from"node:fs/promises";import{tmpdir as N2}from"node:os";import{dirname as KS,join as Of}from"node:path";async function VS(t){let e=t.stagingDir??Of(N2(),`lmctl-diag-${t.ticketId}`),r=Of(e,`diagnostic-${t.ticketId}`);await Rf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Of(r,d);if(await Rf(KS(m),{recursive:!0}),typeof f=="string")await XS(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await XS(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2402
2404
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2403
2405
|
`:`${d.pid}
|
|
2404
2406
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2416,31 +2418,31 @@ If project create omits --local-path, project.docroot must be configured.
|
|
|
2416
2418
|
`:`# source=${f}
|
|
2417
2419
|
# tail_lines=${d.tail_lines}
|
|
2418
2420
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2419
|
-
`:""}`)}if(await s("README.md"
|
|
2420
|
-
`)}var YS=b(()=>{"use strict";Af();zs()});import{spawnSync as
|
|
2421
|
+
`:""}`)}if(await s("README.md",$2(t)),t.sanitized)for(let d of n){let f=await I2(d.absPath);try{Vf(d.bundlePath,f.toString("utf8"))}catch(m){throw await GS(e,{recursive:!0,force:!0}),m instanceof Er,m}}let i=await qS(n),a=HS({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 Rf(KS(t.outputPath),{recursive:!0});let l=JS("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=JS("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await GS(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function $2(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(`
|
|
2422
|
+
`)}var YS=b(()=>{"use strict";Af();zs()});import{spawnSync as x2}from"node:child_process";import{stat as j2}from"node:fs/promises";async function zS(t){try{if(!(await j2(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 A2(t);case"hq":return R2(t)}}function A2(t){let r=x2("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 R2(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 ZS=b(()=>{"use strict"});var ek={};le(ek,{parseDiagnoseArgs:()=>QS,runDiagnose:()=>C2});import{tmpdir as O2}from"node:os";import{join as L2}from"node:path";async function C2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${P2()}
|
|
2421
2423
|
`),0;let r=QS(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2422
2424
|
`),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)
|
|
2423
2425
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2424
|
-
`),2;let n=BS(),s=r.outputPath??
|
|
2426
|
+
`),2;let n=BS(),s=r.outputPath??D2(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await L(e,async i=>{let a=await zf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await VS({ticketId:n,data:a,outputPath:s,lmctlNextVersion:it(),sanitized:!r.noSanitize})}catch(d){if(d instanceof Er)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2425
2427
|
`),2;throw d}let c=await zS({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)}
|
|
2426
2428
|
`):(e.stdout.write(`ticket: ${n}
|
|
2427
2429
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2428
2430
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2429
2431
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2430
|
-
`),1}}function QS(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(!
|
|
2431
|
-
`)}var tk=b(()=>{"use strict";Fn();YS();Af();zs();ZS();Ye();ke()});var ak={};le(ak,{ATTENTION_STATES:()=>Mf,DAEMON_INTERVAL_FAST_MS:()=>Cf,REQUIRED_TEAM_ALIASES:()=>rk,chooseDiagnoses:()=>ok,collectEvidence:()=>sk,diagnose:()=>nk,renderReport:()=>ik,runDiagnosePrompt:()=>
|
|
2432
|
+
`),1}}function QS(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(!M2(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 M2(t){return Zs.includes(t)}function D2(t){return L2(O2(),`lmctl-diag-${t}.tar.gz`)}function P2(){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(`
|
|
2433
|
+
`)}var tk=b(()=>{"use strict";Fn();YS();Af();zs();ZS();Ye();ke()});var ak={};le(ak,{ATTENTION_STATES:()=>Mf,DAEMON_INTERVAL_FAST_MS:()=>Cf,REQUIRED_TEAM_ALIASES:()=>rk,chooseDiagnoses:()=>ok,collectEvidence:()=>sk,diagnose:()=>nk,renderReport:()=>ik,runDiagnosePrompt:()=>W2});function nk(t,e){let r=sk(t,e),n=ok(r);return ik(r,n)}function sk(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=U2(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=rk.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function ok(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>Cf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Cf}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=>Mf.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 ik(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: ${F2(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=>Mf.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(`
|
|
2432
2434
|
`)+`
|
|
2433
|
-
`}function
|
|
2435
|
+
`}function F2(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 U2(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function W2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Lf()}
|
|
2434
2436
|
`),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
|
|
2435
2437
|
`),e.stderr.write(`${Lf()}
|
|
2436
2438
|
`),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2437
2439
|
`),e.stderr.write(`${Lf()}
|
|
2438
2440
|
`),2;let n=r[0];try{return await L(e,s=>(e.stdout.write(nk(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2439
2441
|
`),1}}function Lf(){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(`
|
|
2440
|
-
`)}var rk,Cf,Mf,lk=b(()=>{"use strict";ld();ke();rk=["Coder","Reviewer1","Polisher"],Cf=3e4,Mf=new Set(["attention_needed","paused","escalation"])});var fk={};le(fk,{appendIntent:()=>dk,resolveIntentLogPath:()=>uk,runStatus:()=>
|
|
2441
|
-
`)}catch{}}async function
|
|
2442
|
+
`)}var rk,Cf,Mf,lk=b(()=>{"use strict";ld();ke();rk=["Coder","Reviewer1","Polisher"],Cf=3e4,Mf=new Set(["attention_needed","paused","escalation"])});var fk={};le(fk,{appendIntent:()=>dk,resolveIntentLogPath:()=>uk,runStatus:()=>Y2});import{appendFileSync as B2,mkdirSync as q2}from"node:fs";import{homedir as H2}from"node:os";import{dirname as J2,join as X2}from"node:path";function uk(){return process.env.LMCTL_INTENT_LOG??X2(H2(),".lmctl","recent-intents.log")}function dk(t){try{let e=uk();q2(J2(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});B2(e,`${r}
|
|
2443
|
+
`)}catch{}}async function Y2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(V2),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=z2(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.
|
|
2442
2444
|
`),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.
|
|
2443
|
-
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=
|
|
2445
|
+
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=Z2(i,l,a.source);return o?B(e,c):e.stdout.write(nq(c)),dk({verb:"status",args:t}),0})}function z2(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=_f(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function Z2(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=Q2(t,e.id,K2),a=eq(t,e.id),l=tq(t,e.id,G2);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:rq(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 Q2(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 eq(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 tq(t,e,r){return t.db.prepare(`
|
|
2444
2446
|
SELECT r.*, w.name AS workflow_name
|
|
2445
2447
|
FROM run r
|
|
2446
2448
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2448,13 +2450,13 @@ If project create omits --local-path, project.docroot must be configured.
|
|
|
2448
2450
|
WHERE j.project_id = ?
|
|
2449
2451
|
ORDER BY r.id DESC
|
|
2450
2452
|
LIMIT ?
|
|
2451
|
-
`).all(e,r)}function
|
|
2452
|
-
`)}var
|
|
2453
|
+
`).all(e,r)}function rq(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 ck(o,100)}}}catch{}return ck(t,100)}function ck(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function nq(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(`
|
|
2454
|
+
`)}var G2,K2,V2,mk=b(()=>{"use strict";ke();wf();G2=5,K2=10,V2=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2453
2455
|
|
|
2454
2456
|
Show the current project context, active run, unacked attentions, and recent
|
|
2455
2457
|
runs. Defaults to resolving the project from the current working directory;
|
|
2456
2458
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2457
|
-
`});Ye();Fn();$e();import{pathToFileURL as
|
|
2459
|
+
`});Ye();Fn();$e();import{pathToFileURL as sq}from"node:url";to();Fn();import{mkdirSync as iv,readFileSync as av,renameSync as lv,writeFileSync as cv}from"node:fs";import{homedir as uv}from"node:os";import{dirname as dv,join as fv}from"node:path";var mv="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",pv=60*60*1e3,hv=1500;function _v(){let t=process.env.HOME??uv();return fv(t,".lmctl",".update-check.json")}function gv(t){return t.isTTY===!0}function wv(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 cl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!gv(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function yv(t,e){try{let r=JSON.parse(av(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<pv)return r.latest}catch{}return null}function Ev(t,e){iv(dv(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;cv(r,`${JSON.stringify(e)}
|
|
2458
2460
|
`,"utf8"),lv(r,t)}async function bv(){let t=await br(mv,{description:"lmctl npm metadata",timeoutMs:hv}),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 om(t,e=[],r={}){try{if(cl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??_v();if(yv(s,n)!==null)return;let i=await(r.fetchLatest??bv)();try{Ev(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??it();wv(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2459
2461
|
`)}catch{}}var Ff=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2460
2462
|
`,Df=`${Ff}
|
|
@@ -2507,10 +2509,10 @@ Run 'lmctl help <command>' for command-specific help.
|
|
|
2507
2509
|
${Ff}Run 'lmctl help' for usage.
|
|
2508
2510
|
`),2}function _k(t,e){return t.stderr.write(`error: unknown command: ${e}
|
|
2509
2511
|
${Ff}Run 'lmctl help' for usage.
|
|
2510
|
-
`),1}async function
|
|
2512
|
+
`),1}async function oq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=rm();try{return await iq(t,e)}finally{nm(r)}}async function iq(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 Pf(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 Pf(e,"missing value for --workspace");if(!He(l))return Pf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){tm();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${it()}
|
|
2511
2513
|
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Df),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Df),0):pk.has(i)?hk(i,[...a,"--help"],e):_k(e,i)}qf(ue(),e.stderr),Jf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Df),0;ll()&&e.stderr.write(`[debug] lmctl ${it()} | node ${process.version} | cmd ${s} ${o.join(" ")}
|
|
2512
2514
|
[debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
|
|
2513
|
-
`);try{let i=await hk(s,o,e);return pk.has(s)&&!cl(r,e)&&await om(e,r),i}catch(i){return
|
|
2515
|
+
`);try{let i=await hk(s,o,e);return pk.has(s)&&!cl(r,e)&&await om(e,r),i}catch(i){return aq(i,s,o,e)}}function aq(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!ll())return n.stderr.write(`error: ${s.message}
|
|
2514
2516
|
`),n.stderr.write(`(re-run with --debug for the full stack trace and context)
|
|
2515
2517
|
`),1;n.stderr.write(`error: ${s.message}
|
|
2516
2518
|
`),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
|
|
@@ -2518,10 +2520,10 @@ ${Ff}Run 'lmctl help' for usage.
|
|
|
2518
2520
|
`),s.stack&&n.stderr.write(`${s.stack}
|
|
2519
2521
|
`);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}
|
|
2520
2522
|
`),a.stack&&n.stderr.write(`${a.stack}
|
|
2521
|
-
`),o=a.cause,i+=1}return 1}async function hk(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Ic(),bh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Vc(),r_));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(ub(),cb));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(fb(),db));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Hb(),qb));return n(e,r)}case"jobs":{let{runJobs:n}=await Promise.resolve().then(()=>(cT(),lT));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(_T(),hT));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(kT(),ST));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(IT(),vT));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(xT(),$T));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Jd(),zb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(AT(),jT));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(LT(),OT));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(()=>(oS(),sS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(cS(),lS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(mS(),fS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(vf(),kf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(vf(),kf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(WS(),US));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(tk(),ek));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(lk(),ak));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(mk(),fk));return n(e,r)}case"db":return
|
|
2523
|
+
`),o=a.cause,i+=1}return 1}async function hk(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Ic(),bh));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Vc(),r_));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(ub(),cb));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(fb(),db));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Hb(),qb));return n(e,r)}case"jobs":{let{runJobs:n}=await Promise.resolve().then(()=>(cT(),lT));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(_T(),hT));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(kT(),ST));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(IT(),vT));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(xT(),$T));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Jd(),zb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(AT(),jT));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(LT(),OT));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(()=>(oS(),sS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(cS(),lS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(mS(),fS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(vf(),kf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(vf(),kf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(WS(),US));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(tk(),ek));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(lk(),ak));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(mk(),fk));return n(e,r)}case"db":return lq(e,r);default:return _k(r,t)}}function lq(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2522
2524
|
|
|
2523
2525
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2524
2526
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2525
2527
|
`),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2526
2528
|
`),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2527
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2529
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===sq(process.argv[1]).href){let t=await oq(process.argv.slice(2));process.exitCode=t}export{oq as runCli};
|