@lmctl-ai/lmctl 0.1.52 → 0.1.53
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 +305 -304
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -12,9 +12,9 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
|
|
|
12
12
|
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:qt(r)}}async function pk(t){let e=st(),r=process.version,n=Ka("uname",["-a"],{encoding:"utf8"}),s=Ln((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Ff(i);let u=Ka("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 Ff(a);let u=Ka("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Ln(o.join(`
|
|
13
13
|
`)),c=[];for(let u of lk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Df(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hk(){return process.env.LMCTL_INTENT_LOG??ik(ok(),".lmctl","recent-intents.log")}async function _k(t){let e=t.intentLog??hk(),r=t.intentLogTailLines??500;try{let s=(await za(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:Ln(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 Gs,lk,Ya,Cn=b(()=>{"use strict";Xs();Gs=["serve","db","runs","jobs","attentions","env","intents"];lk=["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"];Ya=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as qf,appendFileSync as gk,mkdirSync as
|
|
16
|
-
`)}catch{}}function Tk(){if(!Vs){let e=Sk().slice(0,13).replace("T","-");Vs=Ks(Za(),`debug-${e}.log`)}wk(
|
|
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 Ik(){try{let t=qf(Ks(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Fr,Wf,Bf,bk,Vs,je=b(()=>{"use strict";Fr=!1,Wf=!1,Bf=0,bk=5e3;Vs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ht(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Mn(t,e){return!Ht(t)||ht(t)?null:`${e} must use https://: ${t}`}async function
|
|
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 Gs,lk,Ya,Cn=b(()=>{"use strict";Xs();Gs=["serve","db","runs","jobs","attentions","env","intents"];lk=["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"];Ya=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as qf,appendFileSync as gk,mkdirSync as yk,existsSync as QB,readdirSync as e2,unlinkSync as t2}from"node:fs";import{join as Ks,dirname as wk}from"node:path";import{homedir as Ek}from"node:os";function Za(){return Ks(Ek(),".lmctl")}function Hf(){Fr=!0,process.env.LMCTL_DEBUG="1"}function Jf(){return{cliDebug:Fr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Xf(t){Fr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function Se(){if(Fr)return!0;let t=Date.now();return t-Bf>=bk&&(Wf=kk(),Bf=t),Wf}function Qa(){return Fr||process.env.LMCTL_DEBUG==="1"}function Sk(){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 It(t,e){if(e?.verbose){if(!Fr)return}else if(!e?.always&&!Se())return;try{Tk();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};gk(Vs,JSON.stringify(r)+`
|
|
16
|
+
`)}catch{}}function Tk(){if(!Vs){let e=Sk().slice(0,13).replace("T","-");Vs=Ks(Za(),`debug-${e}.log`)}yk(wk(Vs),{recursive:!0})}function ot(...t){It({event:"legacy",msg:t.join(" ")})}function pt(...t){It({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){It(t,{always:!0})}function kk(){return vk()||Ik()}function vk(){try{let t=qf(Ks(Za(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
17
|
+
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Ik(){try{let t=qf(Ks(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Fr,Wf,Bf,bk,Vs,je=b(()=>{"use strict";Fr=!1,Wf=!1,Bf=0,bk=5e3;Vs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ht(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Mn(t,e){return!Ht(t)||ht(t)?null:`${e} must use https://: ${t}`}async function yr(t,e){let r=Mn(t,e.description);if(r!==null||!ht(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 Gf(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 Gf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Gf(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 Ys=b(()=>{"use strict"});import{existsSync as qk}from"node:fs";import{createRequire as Hk}from"node:module";function Jk(){return tl===null&&(tl=Hk(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(t){return t.length===1&&Xk(t[0])?[t[0]]:t}function Xk(t){if(!ol(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ol(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tl,nl,zs,sl,il=b(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!qk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Jk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new sl(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)}}},zs=nl,sl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...rl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...rl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...rl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ol(e)?Object.values(e):ol(e)?{...e}:e}}});import{existsSync as Gk,mkdirSync as Vk,readFileSync as Kk}from"node:fs";import{homedir as Yk}from"node:os";import{dirname as Kf,join as zk,resolve as Yf}from"node:path";import{fileURLToPath as Zk,pathToFileURL as Qk}from"node:url";function ll(t){t.dbPath!==":memory:"&&Vk(Kf(t.dbPath),{recursive:!0});let e=new zs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Zf(e);return r===0&&(e.exec(Kk(ev,"utf8")),e.pragma(`user_version = ${al}`)),rv(e,r),e}function rv(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
|
|
18
18
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
19
19
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
20
|
team_name TEXT NOT NULL,
|
|
@@ -949,10 +949,10 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
|
|
|
949
949
|
AND sender_teamfile = ?
|
|
950
950
|
AND sender_alias = ?
|
|
951
951
|
AND active_count > 1
|
|
952
|
-
`),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>uv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Qs)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!==Dn&&!a.includes(n))return{resumed:!1,reason:em};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}}}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){rm(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,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());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){rm(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,P());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,P())}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,P());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,P()),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,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),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,P());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,P());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,P(),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,P());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",P());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,P());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=P(),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,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),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,P(),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,P(),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=P();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,P(),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,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=iv(),s=P();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=P(),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,P())}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??P(),e.dedupe_key??null,e.concurrency_key??null,P());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=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),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:P();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,P()),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,P()),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??P(),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,P());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=P(),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,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),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)}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,P(),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,P())}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,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),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??P(),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,P());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,P()).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,P()),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,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();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??P());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,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=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=ml(e.workspace);o=o.filter(a=>ml(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=om()==="darwin"||om()==="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 im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({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 Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({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 Ne(t){let e=await mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
953
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as lm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as cm}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function um(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(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 to,dm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await lm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=cm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await Ne(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(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=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await um(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 Ne(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:gv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=V(_.trim(),80)),d=V(_.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 um(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 hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await lm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=cm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Wr(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 Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function yv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[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 fm(t,e){return!!t.tools[e]}function mm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=wv[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(ro).join(" ");i=`printf '%s\\n' ${ro(n)} | ${u}`}else i=c.map(ro).join(" ")}let a=yv(t,e,s);return a&&(i+=" "+a),i}var hl,wv,pm=b(()=>{"use strict";hl={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:""}}}},wv={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 hm(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 _m=b(()=>{"use strict"});var Ev,xe,no,Nt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",xe=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${xe}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as gm}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";pm();_m();Nt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=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===xe?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=gm(this.binary,this.seedArgsFor(r),{cwd: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}
|
|
954
|
-
`: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:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&fm(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 gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=mm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=hm(r.env),c=gm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,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 oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,
|
|
955
|
-
`)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function
|
|
952
|
+
`),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>uv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Qs)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!==Dn&&!a.includes(n))return{resumed:!1,reason:em};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}}}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){rm(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,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());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){rm(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,P());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,P())}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,P());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,P()),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,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),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,P());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,P());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,P(),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,P());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",P());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,P());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=P(),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,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),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,P(),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,P(),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=P();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,P(),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,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=iv(),s=P();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=P(),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,P())}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??P(),e.dedupe_key??null,e.concurrency_key??null,P());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=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),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:P();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,P()),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,P()),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??P(),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,P());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=P(),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,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),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)}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,P(),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,P())}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,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),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??P(),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,P());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,P()).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,P()),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,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();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??P());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,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=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=ml(e.workspace);o=o.filter(a=>ml(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=om()==="darwin"||om()==="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 im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({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 Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function xe(t){let e=await mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
953
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as lm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as cm}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function um(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(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 to,dm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await lm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=cm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(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=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await um(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:gv(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=V(_.trim(),80)),d=V(_.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 um(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 hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await lm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=cm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Wr(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 Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function wv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[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 fm(t,e){return!!t.tools[e]}function mm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=yv[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(ro).join(" ");i=`printf '%s\\n' ${ro(n)} | ${u}`}else i=c.map(ro).join(" ")}let a=wv(t,e,s);return a&&(i+=" "+a),i}var hl,yv,pm=b(()=>{"use strict";hl={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:""}}}},yv={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 hm(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 _m=b(()=>{"use strict"});var Ev,Ne,no,xt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",Ne=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${Ne}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as gm}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";pm();_m();xt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=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===Ne?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=gm(this.binary,this.seedArgsFor(r),{cwd: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}
|
|
954
|
+
`: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:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&fm(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 gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=mm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=hm(r.env),c=gm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,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 oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,we,Nt,so,$t,Br=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},we=class extends Ye{},Nt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},so=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as wl from"node:child_process";function Tv(t){if(typeof wl.spawnSync=="function")try{wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function ym(t){return t.exitCode!==null||t.signalCode!==null}function yl(t,e){return ym(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 it(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??Tv;if(ym(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await yl(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 yl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await yl(t,Sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Sv,io=b(()=>{"use strict";Sv=1e3});function wm(t){Se()&&process.stderr.write(`[debug] ${t}
|
|
955
|
+
`)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function xv(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 Vt(t,e,r="yolo"){if(Iv.has(t)){wm(`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"?qr(t,"plan"):kv[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 we(s)}if(!xv(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 we(o)}wm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var kv,vv,Iv,Un=b(()=>{"use strict";Br();je();kv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},vv={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"]}};Iv=new Set(["codex","opencode"])});import{spawn as Nv}from"node:child_process";import{existsSync as $v}from"node:fs";function Av(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(`
|
|
956
956
|
|
|
957
957
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
958
958
|
|
|
@@ -960,44 +960,44 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
|
|
|
960
960
|
One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
|
|
961
961
|
${e}
|
|
962
962
|
|
|
963
|
-
${r}`:r}function Em(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||jv[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=qr(s,a)??Cv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Vt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!$v(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new
|
|
964
|
-
`);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new
|
|
963
|
+
${r}`:r}function Em(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||jv[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=qr(s,a)??Cv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Vt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!$v(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Nv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Rv({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
|
|
964
|
+
`);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new we(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(pt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(Z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(Lv({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
|
|
965
965
|
`),pt(`stream-json: prompt sent (${t.length} chars)`)})}var jv,Cv,bm=b(()=>{"use strict";Br();io();Un();je();Xt();jv={claude:"claude",qwen:"qwen"};Cv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as Mv,constants as Dv}from"node:fs";import{delimiter as Pv,join as Fv}from"node:path";function Uv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Pv))if(n)try{return Mv(Fv(n,t),Dv.X_OK),!0}catch{}return!1}function Wv(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Hr(t,e,r={}){if(Uv(t,r.env))return;(r.warn??console.warn)(Wv(t,e))}var ao=b(()=>{"use strict"});function lo(t={}){return Hr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${qv}`]}var Bv,qv,El=b(()=>{"use strict";ao();Bv=864e5,qv=Bv/1e3});import{spawn as Hv}from"node:child_process";import{createInterface as Jv}from"node:readline";import{existsSync as Xv,readFileSync as Gv}from"node:fs";import{fileURLToPath as Vv}from"node:url";function Kv(t){return t==="plan"?"read-only":"danger-full-access"}function zv(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Yv},capabilities:{experimentalApi:!1}}}function Kt(t,e){pt(`[codex:${t}] ${JSON.stringify(e)}`)}function Zv(){return{agentItems:new Map,resultText:""}}function Sm(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function Qv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function e0(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function t0(){return{pendingCodexError:null}}function r0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
966
966
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
967
967
|
${e}
|
|
968
968
|
|
|
969
|
-
${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(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 Tm(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(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new
|
|
970
|
-
`)})}function
|
|
971
|
-
`)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Sm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Sm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new
|
|
972
|
-
`);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,km=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(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 bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:vm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Im.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(
|
|
969
|
+
${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(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 Tm(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(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Hv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Jv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Zv(),k=t0();function $(D,C={}){return new Promise((H,R)=>{let U=m++;f.set(U,{resolve:H,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:U,method:D,params:C});c.stdin?.write(z+`
|
|
970
|
+
`)})}function x(D,C={}){let H=JSON.stringify({jsonrpc:"2.0",method:D,params:C});c.stdin?.write(H+`
|
|
971
|
+
`)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Sm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Sm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new we(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:D});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:A.slice(0,500)}),n(new Error(r0({exitCode:D,stderr:A})))}}),(async()=>{try{if(await $("initialize",zv()),x("initialized",{}),e.threadId)try{let D=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((H,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([D,C]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
972
|
+
`);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,km=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(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 bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:vm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Im.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(xm.map(t=>[t,{name:t}]))}})}function Nm(){return[...Object.keys(vm).map(t=>`github-copilot/${t}`),...Im.map(t=>`deepseek/${t}`),...xm.map(t=>`openrouter/${t}`)].sort()}var vm,Im,xm,Sl=b(()=>{"use strict";vm={"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":Yt("GPT-5 mini",["high"]),"gpt-5.2":Yt("GPT-5.2"),"gpt-5.2-codex":Yt("GPT-5.2 Codex"),"gpt-5.3-codex":Yt("GPT-5.3 Codex"),"gpt-5.4":Yt("GPT-5.4"),"gpt-5.4-mini":Yt("GPT-5.4 mini"),"gpt-5.4-nano":Yt("GPT-5.4 nano"),"gpt-5.5":Yt("GPT-5.5")},Im=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],xm=["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 Rm,mkdirSync as o0,readFileSync as Om,writeFileSync as $m}from"node:fs";import{join as Wn,resolve as i0}from"node:path";function Am(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:a0}}function l0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function co(t){return structuredClone(t)}function Lm(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 Tl(t,e,r={existsSync:Rm,readFileSync:Om}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=i0(e,s.sessiondir??e);for(let i of c0(o)){let a=u0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lm(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 c0(t){return[Wn(t,".opencode","opencode.jsonc"),Wn(t,"opencode.jsonc"),Wn(t,"opencode.json")]}function u0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(d0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function d0(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]!==`
|
|
973
973
|
`;)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 uo(t,e={}){let r=Wn(t,".opencode"),n=Wn(r,"opencode.json");if(Hr("lmctl","lmctl_chat",e),!Rm(n)){o0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:bl(),mcp:{lmctl:Am()}},null,2);return $m(n,l+`
|
|
974
974
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Om(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),Lm(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.`}),f0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Am();return l0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&$m(n,JSON.stringify(s,null,2)+`
|
|
975
975
|
`,"utf-8"),o}function f0(t){let e=bl(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=co(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=co(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=co(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Cm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=co(s),r=!0;continue}jt(t[n])&&jt(s)&&Cm(t[n],s)&&(r=!0)}return r}var jm,a0,fo=b(()=>{"use strict";je();Sl();ao();jm={yellow:t=>t},a0=864e5});import{spawn as m0}from"node:child_process";import{existsSync as p0}from"node:fs";import{createInterface as h0}from"node:readline";function _0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
976
976
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
977
977
|
${e}
|
|
978
978
|
|
|
979
|
-
${r}`:r}function k0(t){let e=[...t.matchAll(
|
|
980
|
-
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(e.tool,a,l)}catch(
|
|
981
|
-
`),e.cwd&&!p0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new
|
|
982
|
-
`)})}f.on("line",
|
|
983
|
-
`);return}if(D==="session/update"){let H=A.params?.update;if(H?.sessionUpdate==="agent_message_chunk"){let U=H.content?.text||"";U&&T&&(h+=U,e.onDelta?.(U))}}}});let k="";c.stderr?.on("data",
|
|
979
|
+
${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mm(t.slice(n).trimStart())}return Mm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mm(t){let e=[...t.matchAll(T0)];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 Pm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(x){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:x instanceof Error?x.message:String(x)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let x=qr("gemini","plan"),A=qr("gemini","yolo");a=a.filter(D=>!(A??[]).includes(D)),x&&a.push(...x)}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.
|
|
980
|
+
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(e.tool,a,l)}catch(x){return s(x)}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.
|
|
981
|
+
`),e.cwd&&!p0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=m0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,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"}),it(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=h0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function E(x,A={}){return new Promise((D,C)=>{let H=y0++;m.set(H,{resolve:D,reject:C});let R=JSON.stringify({jsonrpc:"2.0",id:H,method:x,params:A});It({event:"acp_send",direction:"SEND",provider:e.tool,method:x,id:H,params:A}),c.stdin?.write(R+`
|
|
982
|
+
`)})}f.on("line",x=>{let A;try{A=JSON.parse(x)}catch{return}if(It({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 C=m.get(A.id);if(m.delete(A.id),A.error){let H=A.error,R=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(A.error);C.reject(oo(`ACP RPC error: ${R}`,H))}else C.resolve(A);return}let D=A.method;if(D){if(typeof A.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:D,id:A.id,params:A.params});let C=JSON.stringify({jsonrpc:"2.0",id:A.id,error:{code:-32601,message:`Method not found: ${D} (lmctl does not implement server-side ACP methods)`}});It({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:A.id,error:"method not found"}),c.stdin?.write(C+`
|
|
983
|
+
`);return}if(D==="session/update"){let H=A.params?.update;if(H?.sessionUpdate==="agent_message_chunk"){let U=H.content?.text||"";U&&T&&(h+=U,e.onDelta?.(U))}}}});let k="";c.stderr?.on("data",x=>{k+=x.toString()}),c.on("error",x=>{Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:x.message,elapsed_ms:Date.now()-u}),s(new we(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${x.message}`,{cause:x}))}),c.on("exit",x=>{d||(_?n({result:e.tool==="gemini"?k0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:x}):(Z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:x,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(_0({tool:e.tool,exitCode:x,stderr:k})))))});function $(x,A={}){let D=JSON.stringify({jsonrpc:"2.0",method:x,params:A});c.stdin?.write(D+`
|
|
984
984
|
`)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),$("notifications/initialized"),e.sessionId)try{p=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(A){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${A instanceof Error?A.message:String(A)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
985
985
|
`),p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),pt(`acp: set_config_option(model=${e.model}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${D}
|
|
986
986
|
`)}if(e.effort&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),pt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${D}
|
|
987
|
-
`)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(
|
|
987
|
+
`)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){it(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var g0,y0,Dm,w0,E0,b0,S0,T0,Fm=b(()=>{"use strict";je();Br();io();Un();fo();je();Xt();g0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},y0=1,Dm="(?:png|jpe?g|webp|heic|pdf)",w0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dm}\\s*`,"gi"),E0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dm}\\s*`,"i"),b0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,S0=/^STANCE:\s+\S+\s*$/gim,T0=/\[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 Um(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=I0){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 x0(){let t=new Map;return(e,r)=>{N0(e,Um(t,r))}}function N0(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(`
|
|
988
988
|
`).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(`
|
|
989
|
-
`).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 mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?
|
|
989
|
+
`).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 mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?x0():void 0,s=await Em(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 $0(){let t=new Map;return(e,r)=>{j0(e,Um(t,r))}}function j0(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 Jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&It({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?$0():void 0,s=await Pm(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 A0(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(`
|
|
990
990
|
`).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(`
|
|
991
|
-
`).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 Wm(t,e){let r=await Tm(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=>A0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var I0,
|
|
992
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}async function Hm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(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=M0(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 ho,Jm=b(()=>{"use strict";Jt();ho=class{name="codex";codexDirs;constructor(e={}){let r=[Bn(Te,".codex"),Bn(Te,".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:Bn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Bn(r,"sessions");try{await Bm(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 R0(e)}catch{return r}for(let s of n){let o=Bn(e,s),i=await Bm(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=L0(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 Le(e,30),n=await
|
|
993
|
-
`);T.trim()&&qn(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;_&&qn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Hm(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 O0(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 Le(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
|
|
991
|
+
`).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 Wm(t,e){let r=await Tm(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=>A0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var I0,wr=b(()=>{"use strict";bm();km();Fm();je();I0=256});function vl(t){return new kl(t)}var kl,Il=b(()=>{"use strict";dm();Gt();wr();xt();kl=class extends Oe{constructor(e){super({provider:new to(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ne,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mo})}}});import{readdir as R0,stat as Bm,unlink as O0}from"node:fs/promises";import{join as Bn,basename as L0}from"node:path";function C0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function qn(t,e,r){let n=C0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function qm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function M0(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 po(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 po(r)}).filter(r=>r.length>0).join(`
|
|
992
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}async function Hm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(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=M0(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 ho,Jm=b(()=>{"use strict";Jt();ho=class{name="codex";codexDirs;constructor(e={}){let r=[Bn(Te,".codex"),Bn(Te,".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:Bn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Bn(r,"sessions");try{await Bm(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 R0(e)}catch{return r}for(let s of n){let o=Bn(e,s),i=await Bm(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=L0(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 Le(e,30),n=await xe(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=V(h.trim(),80)),u=V(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=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await Hm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:qm(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 xe(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(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=qm(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 E=T.text.trim();c||(c=V(E,80)),u=V(E,80),qn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&qn(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&&qn(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(po(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(po(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>po(E.text)).join(`
|
|
993
|
+
`);T.trim()&&qn(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;_&&qn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Hm(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 O0(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 Le(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 Nl(t){return new xl(t)}var xl,$l=b(()=>{"use strict";Jm();Gt();wr();xt();xl=class extends Oe{constructor(e){super({provider:new ho(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:`${Ne}
|
|
994
994
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Wm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Hn(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 _o(t){let e=Hn(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(`
|
|
995
995
|
`).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?D0(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 D0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Xm(t.tokens)&&Xm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Xm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gm(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(`
|
|
996
996
|
`)+`
|
|
997
|
-
`}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(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
|
|
998
|
-
`).trim();
|
|
997
|
+
`}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(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 yo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=yo(a.tokens.input),c=yo(a.tokens.cached),u=Math.max(l-c,0),d=yo(a.tokens.output),f=yo(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 J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var wo,Zm=b(()=>{"use strict";Jt();jl();je();wo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".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=>He(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=q0(s),i=r.get(o);r.set(o,i?H0(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 xe(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 _=Er(g.timestamp),T=g.type,E=de(Km(g.content));if(Ym(T)){let $=E.trim();$&&(u||(u=V($,80)),d=V($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Al(T)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let x=[$.subject,$.description].filter(Boolean).join(`
|
|
998
|
+
`).trim();x&&o.push({role:"thinking",timestamp:Er($.timestamp,_),content:de(x)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Er(n.startTime,s.createdAt),p=Er(n.lastUpdated,s.modifiedAt),h=zm(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 xe(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(Ym(m.type)){d++;let p=Km(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Al(m.type)&&(d++,m.model&&(u=m.model));let f=zm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Er(r.startTime,n.createdAt),modifiedAt:Er(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 Vm(e,"utf-8");if(Hn(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 _o(r)}catch{return null}}extractSessionIdFromFilename(e){let r=U0(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 Jn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await F0(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 xe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Er(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;Xn(e,B0());for(let n of this.extraWorkspacePaths)Xn(e,n);for(let n of await this.collectGeminiProjectPaths())Xn(e,n);for(let n of await this.collectCodexCwds())Xn(e,n);for(let n of await this.collectClaudeCwds())Xn(e,n);let r=new Map;for(let n of e)r.set(J0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Vm(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 Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Jn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await go(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Jn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await go(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 X0,writeFileSync as G0,mkdirSync as V0}from"node:fs";import{join as K0,dirname as Y0}from"node:path";import{randomUUID as z0}from"node:crypto";function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Zm();Gt();wr();xt();jl();Rl=class extends Oe{constructor(e){super({provider:new wo(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",Ne,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Jr(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(`
|
|
999
999
|
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,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=X0(n,"utf-8"),o=Hn(s),i=_o(s),a=z0();i.sessionId=a,i.kind="main";let l=Y0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=K0(l,d);return V0(l,{recursive:!0}),G0(f,Gm(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 Qm,readFile as Z0,rm as Q0,stat as Xr}from"node:fs/promises";import{basename as eI,join as at}from"node:path";function tI(t){let e={};for(let r of t.split(`
|
|
1000
|
-
`)){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 br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(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=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await
|
|
1000
|
+
`)){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 br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(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=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await xe(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:T,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),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 E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),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 E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??br(n?.created_at)??a.createdAt,modifiedAt:br(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=at(e,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(e,"workspace.yaml"),a=await xe(o?s:e),l=o?await Le(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=br(_.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=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await rI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=at(e,"workspace.yaml");try{let n=await Z0(r,"utf-8");return tI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Q0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Qm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=at(this.sessionStateDir,e);if((await Xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=at(this.sessionStateDir,s);(await Xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=at(this.sessionStateDir,s);if(!(await Xr(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 Cl(t){return new Oe({provider:new Eo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ne,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Jr(e,{...r,acpTool:"copilot"})})}var Ml=b(()=>{"use strict";ep();Gt();wr();xt()});import{existsSync as tp}from"node:fs";import{join as bo}from"node:path";import{createRequire as nI}from"node:module";function rp(){return Dl===null&&(Dl=nI(import.meta.url)("node:sqlite").DatabaseSync),Dl}function sI(){let t=process.env.XDG_DATA_HOME||bo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||bo(Te,".config");return[bo(t,"opencode","opencode.db"),bo(e,"opencode","opencode.db")]}var Dl,So,np=b(()=>{"use strict";Jt();Dl=null;So=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=sI().find(r=>tp(r))??null}openDb(){return!this.dbPath||!tp(this.dbPath)?null:new(rp())(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,
|
|
1001
1001
|
s.time_created, s.time_updated
|
|
1002
1002
|
FROM session s
|
|
1003
1003
|
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
|
|
@@ -1010,9 +1010,9 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1010
1010
|
FROM session s
|
|
1011
1011
|
WHERE s.id LIKE ?
|
|
1012
1012
|
ORDER BY s.time_updated DESC
|
|
1013
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";np();Gt();
|
|
1013
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";np();Gt();wr();xt();Pl=class extends Oe{constructor(){super({provider:new So,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",Ne],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Jr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??Ne),r}}});import{readdir as To,readFile as oI,rm as iI}from"node:fs/promises";import{basename as sp,join as zt}from"node:path";function op(t){return t.type==="user"||t.message?.role==="user"}function ip(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ap(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
|
|
1014
1014
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1015
|
-
`):"":""}function lp(t){return t.model||t.message?.model}var ko,cp=b(()=>{"use strict";Jt();ko=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||zt(Te,".qwen")}async discoverSessions(){let e=zt(this.baseDir,"projects"),r;try{r=await To(e)}catch{return[]}let n=[];for(let s of r){let o=zt(e,s,"chats"),i;try{i=await To(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=zt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await Ne(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),op(d)){let f=ap(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(ip(d)){let f=lp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=sp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ne(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(op(f)){let h=ap(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ip(f)){let h=lp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=zt(this.baseDir,"projects");try{let n=await To(r),s=[];for(let o of n){let i=zt(r,o,"chats",`${e}.jsonl`);try{return await oI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=zt(r,o,"chats"),a;try{a=await To(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;sp(l,".jsonl").startsWith(e)&&s.push(zt(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await iI(r),!0}catch{return!1}}}});function Bl(){return new Wl}var Wl,ql=b(()=>{"use strict";cp();Gt();yr();Nt();Wl=class extends Oe{constructor(){super({provider:new ko,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",xe,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mo})}}});import{readdir as up,readFile as aI,rm as dp,stat as fp}from"node:fs/promises";import{basename as Hl,join as At}from"node:path";async function lI(t){let e=await Promise.all(t.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function cI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function mp(t){return t.type==="USER_INPUT"}function pp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function uI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function hp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function _p(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function dI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function fI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=mI(s);if(o)return o}let n=pI(e.content);if(n)return n}return null}function mI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function pI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function gp(t){if(t.endsWith(".db"))return Hl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var vo,wp=b(()=>{"use strict";Jt();vo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await up(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Hl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return At(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await fp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await lI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=_p(f.content);if(m&&(a=m),mp(f)){let p=hp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else pp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=gp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=cI(u.created_at,s.modifiedAt),f=_p(u.content);if(f&&(a=f),mp(u)){let m=hp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:dI(m.args),toolName:m.name||"tool"});pp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):uI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await fp(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let o of await up(n)){if(!o.endsWith(".db"))continue;Hl(o,".db").startsWith(e)&&s.push(At(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=gp(r);return n?(await dp(this.conversationPath(n),{force:!0}),await dp(At(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await fI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await aI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as hI}from"node:child_process";function Xl(t){return new Jl(t)}async function _I(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",wI(e.timeoutMs)];e.model&&n.push("--model",e.model),Vt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await gI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function gI(t,e,r){return new Promise((n,s)=>{let o;try{o=hI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function wI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Jl,Gl=b(()=>{"use strict";wp();Gt();Nt();Xt();Un();Jl=class extends Oe{constructor(e){super({provider:new vo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",xe,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_I})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as yI}from"node:crypto";import{join as EI}from"node:path";function bI(t){return yI("sha256").update(t).digest("hex").slice(0,8)}function SI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function TI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function kI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Io(t){return Math.max(1,Math.ceil(t.length/4))}function yp(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Yl(){return new Kl}var Sr,Vl,Kl,zl=b(()=>{"use strict";Sr=new Map;Vl=class{name="ClaudeMock";async discoverSessions(){return[...Sr.values()].map(yp)}async loadSession(e){let r=Sr.get(e);return r===void 0?null:{...yp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Sr.get(e)?.filePath??null}async deleteSession(e){return Sr.delete(e)}},Kl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Vl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=SI(TI(e,r)),s=`mock-${n}-${bI(`${e}:${n}`)}`,o=new Date,i=Sr.get(s),a=r?.prompt??"ClaudeMock seed",l=Io(a),c={sessionId:s,cwd:e,filePath:EI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Io("ACK: ClaudeMock seeded"),Sr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Sr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${kI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Io(e),s.totalOutputTokens+=Io(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function gt(t){let e=[vl({claudeDir:t?.claudeDir}),xl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ol({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Cl({copilotDir:t?.copilotDir}),Fl(),Bl(),Xl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Yl()),e}var Zl=b(()=>{"use strict";Il();$l();Ll();Ml();Ul();ql();Gl();zl();Il();$l();Ll();Ml();Ul();ql();Gl();zl()});var rc={};ce(rc,{ProviderRegistry:()=>Fn,TransportConnectionError:()=>ye,TransportError:()=>Ye,TransportJsonError:()=>so,TransportProcessError:()=>xt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>vI,chat:()=>Tr,countTokens:()=>tc,createAdapterRegistry:()=>_t,createAllAdapters:()=>gt,listSessions:()=>ec,seed:()=>Ql});function xo(){return No===null&&(No=_t(gt())),No}function vI(){No=null}function bp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Tr(t){let e=t.registry??xo(),r=bp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Ql(t){let e=t.registry??xo(),r=bp(e,t.provider),n=await Ep(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Ep(e,t.provider,t.cwd),i=II(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ep(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function II(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ec(t={}){return(t.registry??xo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tc(t){let r=await(t.registry??xo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var No,Rt=b(()=>{"use strict";pl();Zl();pl();Zl();Br();No=null});function NI(){return nc===null&&(nc=_t(gt())),nc}async function Vr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await $I(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Gr.delete(r),e.setMemberState(r,"idle");else{let i=xI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function xI(t,e){if(!(t instanceof Ee))return Gr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Gr.get(e)??0)+1;return r>=3?(Gr.delete(e),"consecutive_timeouts"):(Gr.set(e,r),null)}return Gr.delete(e),null}async function $I(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=NI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,sc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Sp(u)}`,sc(t.sessionid,t.sessiondir,"unresolved")))}let o=sc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Tr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):jI(u,o)}finally{a!==null&&clearTimeout(a)}}function sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sp(t){return t instanceof Error?t.message:String(t)}function jI(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof xt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,Sp(t),e)}var Ee,nc,Gr,Gn=b(()=>{"use strict";Rt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},nc=null;Gr=new Map});function Tp(){return oc===null&&(oc=_t(gt())),oc}function RI(t,e){if(!AI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Kr(t){let e=RI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await OI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function OI(t){let e=t.member.provider,r=t.member.sessiondir,n=ic("seed",r,e);try{let s=await Ql({provider:e,cwd:r,registry:Tp()});if(!s.success)throw CI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ac(s,n)}}async function kp(t){return LI(t)}async function LI(t){let e=Tp(),r=ic("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ac(o,r)}let s=ic("tokens",t.sessionid,n);try{let o=await tc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ac(o,s)}}function ic(t,e,r){return["<library>",t,e,"--provider",r]}function CI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ac(t,e){return t instanceof ke?t:t instanceof ye?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof xt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,oc,AI,$o=b(()=>{"use strict";Rt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},oc=null;AI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Kn(t){return Buffer.from(t,"base64url").toString("utf8")}async function vp(t,e=r=>kp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of MI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Ip(t,e,r){let n=Np(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Vn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Vr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:xp(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function lc(t,e,r){let n=Np(t,e,r);if(n===null)throw new Error("session member not found");let s=await Kr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:xp(t,e,r)}}function MI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Np(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function xp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Vn,Ao=b(()=>{"use strict";Gn();$o();Vn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function cc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??PI(e),s=r-n,o=e.query(`
|
|
1015
|
+
`):"":""}function lp(t){return t.model||t.message?.model}var ko,cp=b(()=>{"use strict";Jt();ko=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||zt(Te,".qwen")}async discoverSessions(){let e=zt(this.baseDir,"projects"),r;try{r=await To(e)}catch{return[]}let n=[];for(let s of r){let o=zt(e,s,"chats"),i;try{i=await To(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=zt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await xe(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),op(d)){let f=ap(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(ip(d)){let f=lp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=sp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(op(f)){let h=ap(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ip(f)){let h=lp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=zt(this.baseDir,"projects");try{let n=await To(r),s=[];for(let o of n){let i=zt(r,o,"chats",`${e}.jsonl`);try{return await oI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=zt(r,o,"chats"),a;try{a=await To(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;sp(l,".jsonl").startsWith(e)&&s.push(zt(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await iI(r),!0}catch{return!1}}}});function Bl(){return new Wl}var Wl,ql=b(()=>{"use strict";cp();Gt();wr();xt();Wl=class extends Oe{constructor(){super({provider:new ko,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ne,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mo})}}});import{readdir as up,readFile as aI,rm as dp,stat as fp}from"node:fs/promises";import{basename as Hl,join as At}from"node:path";async function lI(t){let e=await Promise.all(t.map(r=>xe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function cI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function mp(t){return t.type==="USER_INPUT"}function pp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function uI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function hp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function _p(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function dI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function fI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=mI(s);if(o)return o}let n=pI(e.content);if(n)return n}return null}function mI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function pI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function gp(t){if(t.endsWith(".db"))return Hl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var vo,yp=b(()=>{"use strict";Jt();vo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await up(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Hl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return At(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await fp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await lI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=_p(f.content);if(m&&(a=m),mp(f)){let p=hp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else pp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=gp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=cI(u.created_at,s.modifiedAt),f=_p(u.content);if(f&&(a=f),mp(u)){let m=hp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:dI(m.args),toolName:m.name||"tool"});pp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):uI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await fp(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let o of await up(n)){if(!o.endsWith(".db"))continue;Hl(o,".db").startsWith(e)&&s.push(At(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=gp(r);return n?(await dp(this.conversationPath(n),{force:!0}),await dp(At(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await fI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await aI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as hI}from"node:child_process";function Xl(t){return new Jl(t)}async function _I(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",yI(e.timeoutMs)];e.model&&n.push("--model",e.model),Vt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await gI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function gI(t,e,r){return new Promise((n,s)=>{let o;try{o=hI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function yI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Jl,Gl=b(()=>{"use strict";yp();Gt();xt();Xt();Un();Jl=class extends Oe{constructor(e){super({provider:new vo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Ne,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_I})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as wI}from"node:crypto";import{join as EI}from"node:path";function bI(t){return wI("sha256").update(t).digest("hex").slice(0,8)}function SI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function TI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function kI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Io(t){return Math.max(1,Math.ceil(t.length/4))}function wp(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Yl(){return new Kl}var Sr,Vl,Kl,zl=b(()=>{"use strict";Sr=new Map;Vl=class{name="ClaudeMock";async discoverSessions(){return[...Sr.values()].map(wp)}async loadSession(e){let r=Sr.get(e);return r===void 0?null:{...wp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Sr.get(e)?.filePath??null}async deleteSession(e){return Sr.delete(e)}},Kl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Vl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=SI(TI(e,r)),s=`mock-${n}-${bI(`${e}:${n}`)}`,o=new Date,i=Sr.get(s),a=r?.prompt??"ClaudeMock seed",l=Io(a),c={sessionId:s,cwd:e,filePath:EI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Io("ACK: ClaudeMock seeded"),Sr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Sr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${kI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Io(e),s.totalOutputTokens+=Io(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function gt(t){let e=[vl({claudeDir:t?.claudeDir}),Nl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ol({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Cl({copilotDir:t?.copilotDir}),Fl(),Bl(),Xl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Yl()),e}var Zl=b(()=>{"use strict";Il();$l();Ll();Ml();Ul();ql();Gl();zl();Il();$l();Ll();Ml();Ul();ql();Gl();zl()});var rc={};ce(rc,{ProviderRegistry:()=>Fn,TransportConnectionError:()=>we,TransportError:()=>Ye,TransportJsonError:()=>so,TransportProcessError:()=>Nt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>vI,chat:()=>Tr,countTokens:()=>tc,createAdapterRegistry:()=>_t,createAllAdapters:()=>gt,listSessions:()=>ec,seed:()=>Ql});function No(){return xo===null&&(xo=_t(gt())),xo}function vI(){xo=null}function bp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Tr(t){let e=t.registry??No(),r=bp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Ql(t){let e=t.registry??No(),r=bp(e,t.provider),n=await Ep(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Ep(e,t.provider,t.cwd),i=II(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ep(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function II(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ec(t={}){return(t.registry??No()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tc(t){let r=await(t.registry??No()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var xo,Rt=b(()=>{"use strict";pl();Zl();pl();Zl();Br();xo=null});function xI(){return nc===null&&(nc=_t(gt())),nc}async function Vr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await $I(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Gr.delete(r),e.setMemberState(r,"idle");else{let i=NI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function NI(t,e){if(!(t instanceof Ee))return Gr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Gr.get(e)??0)+1;return r>=3?(Gr.delete(e),"consecutive_timeouts"):(Gr.set(e,r),null)}return Gr.delete(e),null}async function $I(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=xI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,sc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Sp(u)}`,sc(t.sessionid,t.sessiondir,"unresolved")))}let o=sc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Tr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):jI(u,o)}finally{a!==null&&clearTimeout(a)}}function sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sp(t){return t instanceof Error?t.message:String(t)}function jI(t,e){if(t instanceof Ee)return t;if(t instanceof we){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof Nt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,Sp(t),e)}var Ee,nc,Gr,Gn=b(()=>{"use strict";Rt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},nc=null;Gr=new Map});function Tp(){return oc===null&&(oc=_t(gt())),oc}function RI(t,e){if(!AI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Kr(t){let e=RI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await OI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function OI(t){let e=t.member.provider,r=t.member.sessiondir,n=ic("seed",r,e);try{let s=await Ql({provider:e,cwd:r,registry:Tp()});if(!s.success)throw CI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ac(s,n)}}async function kp(t){return LI(t)}async function LI(t){let e=Tp(),r=ic("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ac(o,r)}let s=ic("tokens",t.sessionid,n);try{let o=await tc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ac(o,s)}}function ic(t,e,r){return["<library>",t,e,"--provider",r]}function CI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ac(t,e){return t instanceof ke?t:t instanceof we?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof Nt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,oc,AI,$o=b(()=>{"use strict";Rt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},oc=null;AI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Kn(t){return Buffer.from(t,"base64url").toString("utf8")}async function vp(t,e=r=>kp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of MI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Ip(t,e,r){let n=xp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Vn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Vr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Np(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function lc(t,e,r){let n=xp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Kr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Np(t,e,r)}}function MI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function xp(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Np(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Vn,Ao=b(()=>{"use strict";Gn();$o();Vn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function cc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??PI(e),s=r-n,o=e.query(`
|
|
1016
1016
|
SELECT
|
|
1017
1017
|
isess.id AS interactive_session_id,
|
|
1018
1018
|
isess.run_id,
|
|
@@ -1058,7 +1058,7 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1058
1058
|
ORDER BY w.name ASC
|
|
1059
1059
|
`)}function Lp(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Cp(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Mp(t,e){return t.getSubmittedPr(e)}function Po(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Yr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function vr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Po(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:JI(t,r.id)}}function JI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Dp(t,r.id)}))}function pc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Dp(t,n.id)}}function Dp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Ir(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Pp(t,e,r){let n=pc(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Fp(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Up(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function Qt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Fo(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Wp}
|
|
1060
1060
|
WHERE ${n}
|
|
1061
|
-
ORDER BY a.created_at DESC`,...r).map(Bp)}function
|
|
1061
|
+
ORDER BY a.created_at DESC`,...r).map(Bp)}function yt(t,e){let n=t.query(`${Wp}
|
|
1062
1062
|
WHERE a.id = ?`,e)[0];return n===void 0?null:Bp(n)}function Bp(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function qp(t){return t.query(`
|
|
1063
1063
|
SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
|
|
1064
1064
|
FROM run r
|
|
@@ -1132,7 +1132,7 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1132
1132
|
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 Hp(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 zr(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?Hp(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
|
|
1133
1133
|
FROM interactive_session
|
|
1134
1134
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1135
|
-
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),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let $=Date.parse(T.started_at),
|
|
1135
|
+
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),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let $=Date.parse(T.started_at),x=Date.parse(T.ended_at);!Number.isNaN($)&&!Number.isNaN(x)&&(k=x-$)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="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 Uo(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(...XI(o));return`${e.join(`
|
|
1136
1136
|
`)}
|
|
1137
1137
|
`}function XI(t){let e=[],r=GI(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 GI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Wo(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?Hp(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
|
|
1138
1138
|
FROM session_event
|
|
@@ -1142,9 +1142,9 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1142
1142
|
WHERE run_id = ?
|
|
1143
1143
|
AND kind = 'session_hung'
|
|
1144
1144
|
AND acknowledged_at IS NULL
|
|
1145
|
-
ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:
|
|
1145
|
+
ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:rx($.payload)})),k=_.map($=>{let x=f.get($),A=p.get($),D=YI(s,$,T,x,A),C=x===void 0?null:Date.parse(x.started_at),H=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),R=x===void 0||Number.isNaN(C??NaN)?null:H!==null&&!Number.isNaN(H)?H-C:D==="running"||D==="paused"?n-C:null,U=x===void 0?null:h.get(x.id)??null,z=nx(A?.last_activity_at??null,U,g),v=o===null||A===void 0?void 0:QI(t,s.team_id,o.definition,A.state_name,x?.state_name??$);return{step_id:x?.id??null,state_id:$,status:D,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:z,elapsed_ms:R,...v!==void 0?{member:v}:{},...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:ZI(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:zI(k,s.terminal_state!==null),related_attentions:E}}function Bo(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} (${Rp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Ap(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Ap(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${qo(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 ${Rp(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}${sx(a.payload)}`)}return`${n.join(`
|
|
1146
1146
|
`)}
|
|
1147
|
-
`}function VI(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 KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(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 zI(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 ZI(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 QI(t,e,r,n,s){let o=
|
|
1147
|
+
`}function VI(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 KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(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 zI(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 ZI(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 QI(t,e,r,n,s){let o=ex(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:Ie(i)}}function ex(t,e,r){let n=tx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Zt(a)?a.id===e||a.name===e||a.name===r:!1),o=Zt(s?.members)?s.members:null,i=o!==null&&Zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Zt(n.states)){let s=n.states[e]??n.states[r];if(!Zt(s))return null;let o=Zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function tx(t){try{let e=JSON.parse(t);return Zt(e)?e:null}catch{return null}}function rx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Ap(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${qo(Math.max(0,n-r)).padEnd(6)}]`}function Rp(t,e){return Number.isNaN(t)?"?":qo(Math.max(0,e-t))}function qo(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 sx(t){if(!Zt(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"?`, ${qo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Wp,Ot=b(()=>{"use strict";Pe();Wp=`SELECT a.id AS attention_id,
|
|
1148
1148
|
a.kind AS kind,
|
|
1149
1149
|
a.severity AS severity,
|
|
1150
1150
|
a.created_at AS created_at,
|
|
@@ -1166,141 +1166,141 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1166
1166
|
ON isess.run_id = a.run_id
|
|
1167
1167
|
AND isess.id = (
|
|
1168
1168
|
SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
|
|
1169
|
-
)`});var ih={};ce(ih,{parseApiArgs:()=>Kp,readApiClientConfig:()=>zn,runApi:()=>
|
|
1169
|
+
)`});var ih={};ce(ih,{parseApiArgs:()=>Kp,readApiClientConfig:()=>zn,runApi:()=>ux});import{readFileSync as ox}from"node:fs";import{basename as ix,extname as ax}from"node:path";async function ux(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(cx),0;if(t[0]==="config")return fx(t.slice(1),e);let r=sh(t,"--direct");if(r.rest[0]==="escalations")return mx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Xo(r.rest.slice(2)))return e.stdout.write(`${gx}
|
|
1170
1170
|
`),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
|
|
1171
|
-
`),2):
|
|
1172
|
-
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Xo(r.rest.slice(2)))return e.stdout.write(`${
|
|
1173
|
-
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?
|
|
1174
|
-
`),2;let s=
|
|
1171
|
+
`),2):dN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Xo(r.rest.slice(2)))return e.stdout.write(`${hx}
|
|
1172
|
+
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Xo(r.rest.slice(2)))return e.stdout.write(`${_x}
|
|
1173
|
+
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?aN(r.rest.slice(2),e):lN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?cN(r.rest.slice(2),e):uN(r.rest.slice(2),e);if(r.present)return Xx(r.rest,e);let n=Kp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1174
|
+
`),2;let s=xr(e),o=s.baseUrl,i=er(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=vx(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1175
1175
|
`),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1176
1176
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1177
|
-
`),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=
|
|
1177
|
+
`),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=xx(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
|
|
1178
1178
|
`),2;let d;try{d=await fetch(new URL(`/api/jobs/${u}/run`,o),{method:"POST",headers:er("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
|
|
1179
1179
|
`),2}if(!d.ok)return e.stderr.write(`error: HTTP ${d.status}: ${await d.text()}
|
|
1180
1180
|
`),d.status===400?2:1;let f=await d.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
|
|
1181
1181
|
`):e.stdout.write(`${JSON.stringify(f)}
|
|
1182
1182
|
`)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1183
1183
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1184
|
-
`));return 0}function Kp(t){let e=Zp(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Jo(o,"/api/status",n):s==="projects"?Jo(o,"/api/projects",n):s==="teams"?Jo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?
|
|
1185
|
-
`);return{baseUrl:o,token:a}}function
|
|
1184
|
+
`));return 0}function Kp(t){let e=Zp(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Jo(o,"/api/status",n):s==="projects"?Jo(o,"/api/projects",n):s==="teams"?Jo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Cx(o.slice(1),e.format):Jo(o,"/api/workflows",n):s==="workflow"?Lx(o,n):s==="upload"?Rx(o,n):s==="submit-job"?Ox(o,n):s==="issues"?Ax(o,n):s==="jobs"?Yn(o,"--status","/api/jobs","status",n):s==="job"?jx(o,n):s==="project"?Mx(o,n):s==="artifact"?Fx(o,n):s==="runs"?Yn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Yn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Xp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Ux(o,n):Xp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Wx(o,n):s==="daemon"?Bx(o,n):s==="intake"?qx(o,n):s==="session"?Hx(o,n):s==="run"?Jx(o,e.format):s==="prs"?Yn(o,"--status","/api/submitted-prs","status",n):s==="pr"?Nx(o,n):`unknown subcommand: ${s}`}function er(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function xr(t){if(t.dal!==void 0)return zn(t.dal,process.env,t);let e=pe({path:ue()});try{return zn(e,process.env,t)}finally{e.close()}}function zn(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=lx;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${dx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1185
|
+
`);return{baseUrl:o,token:a}}function dx(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function fx(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1186
1186
|
`),2;let s=e.dal===void 0,o=e.dal??pe({path:ue()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
1187
1187
|
`),2;let i=n[0];if(!Ho.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ho].join(", ")})
|
|
1188
1188
|
`),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
|
|
1189
1189
|
`),1):(e.stdout.write(`${a}
|
|
1190
1190
|
`),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
|
|
1191
1191
|
`),2;let[i,a]=n;if(!Ho.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ho].join(", ")})
|
|
1192
|
-
`),2;let l=
|
|
1192
|
+
`),2;let l=kx(i,a);return l!==null?(e.stderr.write(`error: ${l}
|
|
1193
1193
|
`),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Jp(i,a,!1)}
|
|
1194
1194
|
`),0)}if(r==="list"){let i=!1;for(let c of n){if(c==="--show-secrets"){i=!0;continue}return e.stderr.write(`error: unknown flag: ${c}
|
|
1195
1195
|
`),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
|
|
1196
1196
|
`),0;for(let c of l)e.stdout.write(`${c} = ${Jp(c,a[c],i)}
|
|
1197
1197
|
`);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
|
|
1198
|
-
`),2}finally{s&&o.close()}}async function
|
|
1198
|
+
`),2}finally{s&&o.close()}}async function mx(t,e,r){if(Xo(t))return e.stdout.write(`${px}
|
|
1199
1199
|
`),0;let n=sh(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
|
|
1200
|
-
`),2):s?
|
|
1201
|
-
`),2)}function Xo(t){return t.some(e=>e==="--help"||e==="-h")}function
|
|
1202
|
-
`),2;let n=
|
|
1200
|
+
`),2):s?yx(i,a,e):i==="list"?Ex(a,e):i==="show"?Sx(a,e):i==="respond"?Tx(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
|
|
1201
|
+
`),2)}function Xo(t){return t.some(e=>e==="--help"||e==="-h")}function yx(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ue()});try{return oh(s,[t,...e],r)}finally{n&&s.close()}}function Yp(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=wx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function wx(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Ex(t,e){let r=Yp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1202
|
+
`),2;let n=xr(e),s=er("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1203
1203
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1204
1204
|
`),a.status===400?2:1;let l=await a.json();return zp(l,r.json,e)}function zp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
|
|
1205
1205
|
`),0;if(t.length===0)return r.stdout.write(`No pending escalations.
|
|
1206
1206
|
`),0;r.stdout.write(`${t.length} pending escalation${t.length===1?"":"s"}:
|
|
1207
1207
|
|
|
1208
1208
|
`);for(let n of t){if(n.run_id===null){r.stderr.write(`warning: attention #${n.attention_id} has no run_id; skipping
|
|
1209
|
-
`);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=
|
|
1209
|
+
`);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=bx(n.created_at);if(r.stdout.write(`#${n.attention_id} ${s} run ${n.run_id} ${o}:${i} (paused ${a})
|
|
1210
1210
|
`),n.prompt!==null&&n.prompt.length>0){let l=n.prompt.replaceAll(`
|
|
1211
1211
|
`," ").trim(),c=l.length>240?`${l.slice(0,240)}\u2026`:l;r.stdout.write(` Q: ${JSON.stringify(c)}
|
|
1212
1212
|
`)}r.stdout.write(` Respond: lmctl api escalations respond ${n.attention_id} "<answer>" [--done to end chat]
|
|
1213
1213
|
`),r.stdout.write(`
|
|
1214
|
-
`)}return 0}function
|
|
1214
|
+
`)}return 0}function bx(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function Sx(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
|
|
1215
1215
|
`),2;let n=se(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1216
|
-
`),2;let s=
|
|
1216
|
+
`),2;let s=xr(e),o=er("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1217
1217
|
`),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
|
|
1218
1218
|
`),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
|
|
1219
1219
|
`),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
|
|
1220
|
-
`),i.status===400?2:1)}async function
|
|
1220
|
+
`),i.status===400?2:1)}async function Tx(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1221
1221
|
`),2;let o=se(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
|
|
1222
|
-
`),2;let i=s[1],a=
|
|
1222
|
+
`),2;let i=s[1],a=xr(e),l=er("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
|
|
1223
1223
|
`),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
|
|
1224
1224
|
`),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
|
|
1225
1225
|
`),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
|
|
1226
1226
|
`):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
|
|
1227
|
-
`),0}function Jp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function kN(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Ro||t===Oo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function vN(t,e){let r=oN(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:IN(t)}),iN(t)),e!==void 0&&s.append("project",e),s}function IN(t){switch(aN(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function NN(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function xN(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Yn(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Zp(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function Jo(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Yn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Xp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function $N(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function jN(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return $N([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=gc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function AN(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Qp(n,e):r==="claim"?eh(n,e):r==="claim-next"?th(n,e):r==="close"?rh(n,e):r==="reopen"?nh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Qp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=gc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function th(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function rh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function nh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function RN(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function ON(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function gc(t){try{return JSON.parse(t)}catch{return t}}function LN(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function CN(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function MN(t,e){let[r,n,...s]=t;return r==="workflow"?DN([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function DN(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=PN(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function PN(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=gc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function FN(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function UN(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function WN(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function BN(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function qN(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function HN(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function JN(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function sh(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function XN(t,e){let r=Zp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1227
|
+
`),0}function Jp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function kx(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Ro||t===Oo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function vx(t,e){let r=ox(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Ix(t)}),ix(t)),e!==void 0&&s.append("project",e),s}function Ix(t){switch(ax(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function xx(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function Nx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Yn(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Zp(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function Jo(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Yn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Xp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function $x(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function jx(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return $x([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;o=p}else if(f==="--source")i=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=gc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function Ax(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Qp(n,e):r==="claim"?eh(n,e):r==="claim-next"?th(n,e):r==="close"?rh(n,e):r==="reopen"?nh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Qp(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=gc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function th(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function rh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function nh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Rx(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function Ox(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function gc(t){try{return JSON.parse(t)}catch{return t}}function Lx(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Cx(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Mx(t,e){let[r,n,...s]=t;return r==="workflow"?Dx([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Dx(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Px(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function Px(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=gc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function Fx(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function Ux(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Wx(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function Bx(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function qx(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function Hx(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function Jx(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function sh(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function Xx(t,e){let r=Zp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1228
1228
|
`),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
|
|
1229
1229
|
`),2;let a=e.dal===void 0,l=e.dal??pe({path:ue()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
|
|
1230
|
-
`),2):c==="create"?
|
|
1231
|
-
`),2)}return o==="status"?
|
|
1230
|
+
`),2):c==="create"?Gx(l,u,e,s):c==="claim"?Vx(l,u,e,s):c==="claim-next"?Kx(l,u,e,s):c==="close"?Yx(l,u,e,s):c==="reopen"?zx(l,u,e,s):c==="list"?tN(l,u,e,s):c==="show"?rN(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
1231
|
+
`),2)}return o==="status"?nN(l,i,e,s):o==="projects"?sN(l,i,e,s):o==="workflows"?oN(l,i,e,s):o==="runs"?iN(l,i,e,s):o==="attentions"||o==="attention"?fN(l,i,e,s):o==="escalations"?oh(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
|
|
1232
1232
|
`),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
1233
1233
|
`),1}finally{a&&l.close()}}function Je(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
|
|
1234
|
-
`)}function
|
|
1234
|
+
`)}function Gx(t,e,r,n){let s=Qp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1235
1235
|
`),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
|
|
1236
|
-
`),1;let a=JSON.parse(s.body),l=
|
|
1237
|
-
`),2;let c=
|
|
1238
|
-
`),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Je(r,u,n),0}function
|
|
1236
|
+
`),1;let a=JSON.parse(s.body),l=Zx(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
|
|
1237
|
+
`),2;let c=Qx(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
|
|
1238
|
+
`),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Je(r,u,n),0}function Vx(t,e,r,n){let s=eh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1239
1239
|
`),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
|
|
1240
1240
|
`),1;let l=t.claimIssue(o,i.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${o} is not in a claimable state (status=${a.status})
|
|
1241
|
-
`),1):(Je(r,l,n),0)}function
|
|
1241
|
+
`),1):(Je(r,l,n),0)}function Kx(t,e,r,n){let s=th(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1242
1242
|
`),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
|
|
1243
|
-
`),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Je(r,{status:"queue_empty"},n),1):(Je(r,l,n),0)}function
|
|
1243
|
+
`),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Je(r,{status:"queue_empty"},n),1):(Je(r,l,n),0)}function Yx(t,e,r,n){let s=rh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1244
1244
|
`),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
|
|
1245
1245
|
`),1;let l=typeof i.closed_run_id=="number"?i.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
|
|
1246
|
-
`),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function
|
|
1246
|
+
`),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function zx(t,e,r,n){let s=nh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1247
1247
|
`),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
|
|
1248
1248
|
`),1;let l=typeof i.source_run_id=="number"?i.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
|
|
1249
|
-
`),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function
|
|
1249
|
+
`),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function Zx(t){if(t!=null)return typeof t=="string"&&Vp.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Qx(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function tN(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
|
|
1250
1250
|
`),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],m=o[++d];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
|
|
1251
|
-
`),2;if(f==="--status"){let p=Gp(m,
|
|
1251
|
+
`),2;if(f==="--status"){let p=Gp(m,eN);if(typeof p=="string")return r.stderr.write(`error: ${p}
|
|
1252
1252
|
`),2;i=p}else if(f==="--severity"){let p=Gp(m,Vp);if(typeof p=="string")return r.stderr.write(`error: ${p}
|
|
1253
1253
|
`),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${ne(f)}
|
|
1254
1254
|
`),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
|
|
1255
|
-
`),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Je(r,u,n),0}function
|
|
1255
|
+
`),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Je(r,u,n),0}function rN(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
|
|
1256
1256
|
`),2;let s=se(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1257
1257
|
`),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
|
|
1258
|
-
`),1):(Je(r,o,n),0)}function
|
|
1259
|
-
`),2):(Je(r,Co(t),n),0)}function
|
|
1260
|
-
`),2):(Je(r,Mo(t),n),0)}function
|
|
1261
|
-
`),2):(Je(r,Do(t),n),0)}function
|
|
1258
|
+
`),1):(Je(r,o,n),0)}function nN(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
|
|
1259
|
+
`),2):(Je(r,Co(t),n),0)}function sN(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
|
|
1260
|
+
`),2):(Je(r,Mo(t),n),0)}function oN(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
|
|
1261
|
+
`),2):(Je(r,Do(t),n),0)}function iN(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
|
|
1262
1262
|
`),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
|
|
1263
1263
|
`),2;s=Number(a)}else return r.stderr.write(`error: ${ne(i)}
|
|
1264
|
-
`),2}return Je(r,Yr(t,s!==void 0?{limit:s}:{}),n),0}function
|
|
1264
|
+
`),2}return Je(r,Yr(t,s!==void 0?{limit:s}:{}),n),0}function aN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
|
|
1265
1265
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1266
1266
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${ne(a)}
|
|
1267
1267
|
`),2}let o=e.dal===void 0,i=e.dal??pe({path:ue()});try{let a=zr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
|
|
1268
1268
|
`),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1269
|
-
`):e.stdout.write(Uo(a)),0)}finally{o&&i.close()}}async function
|
|
1269
|
+
`):e.stdout.write(Uo(a)),0)}finally{o&&i.close()}}async function lN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
|
|
1270
1270
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1271
1271
|
`),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ne(c)}
|
|
1272
|
-
`),2}let o=
|
|
1272
|
+
`),2}let o=xr(e),a=er(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1273
1273
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1274
1274
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1275
1275
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1276
|
-
`),l.status===404?1:l.status===400?2:1)}function
|
|
1276
|
+
`),l.status===404?1:l.status===400?2:1)}function cN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
|
|
1277
1277
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1278
1278
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
|
|
1279
1279
|
`),2}let o=e.dal===void 0,i=e.dal??pe({path:ue()});try{let a=Wo(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
|
|
1280
1280
|
`),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1281
|
-
`):e.stdout.write(Bo(a)),0)}finally{o&&i.close()}}async function
|
|
1281
|
+
`):e.stdout.write(Bo(a)),0)}finally{o&&i.close()}}async function uN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
|
|
1282
1282
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1283
1283
|
`),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ne(c)}
|
|
1284
|
-
`),2}let o=
|
|
1284
|
+
`),2}let o=xr(e),a=er(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1285
1285
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1286
1286
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1287
1287
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1288
|
-
`),l.status===404?1:l.status===400?2:1)}async function
|
|
1289
|
-
`),2}let n=
|
|
1288
|
+
`),l.status===404?1:l.status===400?2:1)}async function dN(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
|
|
1289
|
+
`),2}let n=xr(e),o=er(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1290
1290
|
`),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
|
|
1291
1291
|
`):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1292
1292
|
`)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
|
|
1293
|
-
`),i.status===400?2:1)}function
|
|
1293
|
+
`),i.status===400?2:1)}function fN(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ne(o)}
|
|
1294
1294
|
`),2}return Je(r,Qt(t,{unacked:s}),n),0}function oh(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1295
1295
|
`),2;if(n==="list"){let o=Yp(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1296
1296
|
`),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Fo(t,i);return zp(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
|
|
1297
1297
|
`),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1298
|
-
`),2;let a=
|
|
1298
|
+
`),2;let a=yt(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
|
|
1299
1299
|
`),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1300
|
-
`),0)}return n==="respond"?
|
|
1301
|
-
`),2)}function
|
|
1300
|
+
`),0)}return n==="respond"?mN(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
|
|
1301
|
+
`),2)}function mN(t,e,r){let n=!1,s=!1,o=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}o.push(m)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1302
1302
|
`),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1303
|
-
`),2;let a=o[1],l=
|
|
1303
|
+
`),2;let a=o[1],l=yt(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
|
|
1304
1304
|
`),1;let c=Qt(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
|
|
1305
1305
|
`),1;if(c.kind==="workflow_escalation"){let m=t.resumeEscalation(i,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${i})
|
|
1306
1306
|
`),2;let p=Qt(t).find(g=>g.id===i),h={ok:!0,attention_id:i,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
|
|
@@ -1311,12 +1311,12 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1311
1311
|
`),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
|
|
1312
1312
|
`),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
|
|
1313
1313
|
`):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
|
|
1314
|
-
`),0}function Gp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var
|
|
1314
|
+
`),0}function Gp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var lx,cx,Vp,Ho,px,hx,_x,gx,eN,yc=b(()=>{"use strict";Pe();Ve();Ao();dc();Ot();lx="http://127.0.0.1:8787",cx=`usage: lmctl api [--direct] <subcommand> ...
|
|
1315
1315
|
|
|
1316
1316
|
Call the lmctl HTTP API using the configured daemon URL/token. Some
|
|
1317
1317
|
workflow shellstep-safe commands also support --direct to use the local DAL
|
|
1318
1318
|
without an HTTP round trip.
|
|
1319
|
-
`,Vp=["low","medium","high","critical"];Ho=new Set(["api.url","api.port","api.token","project.docroot",Ro,Oo]);
|
|
1319
|
+
`,Vp=["low","medium","high","critical"];Ho=new Set(["api.url","api.port","api.token","project.docroot",Ro,Oo]);px=`usage: lmctl api escalations <list|show|respond>
|
|
1320
1320
|
|
|
1321
1321
|
list [--project P] [--all] [--since DURATION] [--json]
|
|
1322
1322
|
Print pending operator escalations (interactive_waiting_operator
|
|
@@ -1328,20 +1328,20 @@ without an HTTP round trip.
|
|
|
1328
1328
|
single-record output is always JSON.
|
|
1329
1329
|
|
|
1330
1330
|
respond <attention_id> "<answer>" [--done] [--json]
|
|
1331
|
-
Reply to an interactive escalation. --done ends the chat.`,
|
|
1331
|
+
Reply to an interactive escalation. --done ends the chat.`,hx=`usage: lmctl api run where <run_id> [--json|--text]
|
|
1332
1332
|
|
|
1333
1333
|
Print the workflow-position view (which state of which workflow the run is
|
|
1334
1334
|
at, and any pending operator prompt). Default output is the TTY tree; --json
|
|
1335
1335
|
emits the structured RunWhereDetail payload. Pair with --direct to bypass
|
|
1336
|
-
HTTP for in-workflow shellsteps.`,
|
|
1336
|
+
HTTP for in-workflow shellsteps.`,_x=`usage: lmctl api run timeline <run_id> [--json|--text]
|
|
1337
1337
|
|
|
1338
1338
|
Print the time-ordered run progression view. Default output is the TTY
|
|
1339
1339
|
timeline; --json emits the structured RunTimeline payload. Pair with
|
|
1340
|
-
--direct to bypass HTTP for in-workflow shellsteps.`,
|
|
1340
|
+
--direct to bypass HTTP for in-workflow shellsteps.`,gx=`usage: lmctl api workflows verify [--json|--text]
|
|
1341
1341
|
|
|
1342
1342
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
1343
1343
|
and report the first step that would be started. Default output is the TTY
|
|
1344
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;
|
|
1344
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;eN=["open","assigned","closed","reopened"]});import{existsSync as ah,mkdirSync as pN,readdirSync as hN,readFileSync as lh,writeFileSync as _N}from"node:fs";import{join as Zr}from"node:path";import{fileURLToPath as gN}from"node:url";function Zn(t){try{return yN.some(e=>ah(Zr(t,e)))}catch{return!1}}function wN(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Go(t,e){t.durable_memory_mode!=="db"?EN(t):bN(t,e)}function ch(t){let e=Zn(t),r;try{r=hN(wc).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function EN(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Zr(e,"durable-memory");try{pN(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=ch(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Zr(r,i);if(!ah(a))try{let l=lh(Zr(wc,o),"utf8");_N(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function bN(t,e){let r=t.local_path??"",n=ch(r),s=[];for(let o of n){let i=Zr(wc,o),a;try{a=lh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=wN(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var wc,yN,Qn=b(()=>{"use strict";wc=Zr(gN(import.meta.url),"../../config/durable_memory_templates"),yN=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as SN,mkdirSync as TN,readdirSync as kN,readFileSync as vN,writeFileSync as IN}from"node:fs";import{join as Vo}from"node:path";import{fileURLToPath as xN}from"node:url";function Ko(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zn(e))return;let r=Vo(e,"ai-test");try{TN(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of NN()){let o=s.replace(/\.template$/,""),i=Vo(r,o);if(!SN(i))try{IN(i,$N(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function NN(){try{return kN(uh).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function $N(t){try{return vN(Vo(uh,t),"utf8")}catch{return jN(t)}}function jN(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
|
|
1345
1345
|
|
|
1346
1346
|
Add test chapters in this directory.
|
|
1347
1347
|
`:`---
|
|
@@ -1363,7 +1363,7 @@ last_run_id: 0
|
|
|
1363
1363
|
## Expected
|
|
1364
1364
|
|
|
1365
1365
|
## Cleanup
|
|
1366
|
-
`}var uh,Ec=b(()=>{"use strict";Qn();uh=Vo(
|
|
1366
|
+
`}var uh,Ec=b(()=>{"use strict";Qn();uh=Vo(xN(import.meta.url),"../../config/ai_test_templates")});var Qr,bc=b(()=>{"use strict";Qr=`---
|
|
1367
1367
|
|
|
1368
1368
|
# Durable memory \u2014 how to use it
|
|
1369
1369
|
|
|
@@ -1374,34 +1374,34 @@ ON EVERY NEW TASK:
|
|
|
1374
1374
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
1375
1375
|
3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
|
|
1376
1376
|
|
|
1377
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Yo(t){return
|
|
1378
|
-
`,"utf8"),
|
|
1377
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Yo(t){return AN.has(t)}function Tc(){return Sc===null&&(Sc=_t(gt())),Sc}function kc(t,e,r={}){if(!Yo(t))return null;try{let n=Tc().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?lo({warn:()=>{}}):[];return[...o,...i,...dh[t]??[]]}catch{return null}}function en(t,e){let r=kc(t,e);return r===null?null:r.join(" ")}function Nr(t,e){return Tc().getSession(t,e)}async function zo(t){return(await Tc().resolveSessions(t)).map(r=>r.provider.name)}var dh,AN,fh,Sc,tn=b(()=>{"use strict";Rt();El();dh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},AN=new Set(Object.keys(dh)),fh=/^[\w.:-]+$/;Sc=null});import{createHash as RN}from"node:crypto";import{existsSync as es,mkdirSync as ph,readFileSync as Qo,readdirSync as ON,renameSync as LN,statSync as CN,unlinkSync as MN,writeFileSync as Zo}from"node:fs";import{homedir as DN}from"node:os";import{dirname as Ic,isAbsolute as mh,join as ze,relative as PN,resolve as rn}from"node:path";import{fileURLToPath as FN}from"node:url";function _h(t){let e=rn(t);for(;;){let r=ze(e,xc);try{if(CN(r).isDirectory())return r}catch{}let n=Ic(e);if(n===e)return null;e=n}}function ei(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return rn(e);let r=_h(t);return r!==null?r:ze(hh(),xc)}function gh(t){return ze(ei(t),"templates","workflows")}function yh(){return rn(Ic(FN(import.meta.url)),"..","..","workflows")}function UN(t){let e=ze(t,wh);try{let r=JSON.parse(Qo(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function WN(t,e){ph(t,{recursive:!0});let r=ze(t,wh),n=`${r}.tmp-${process.pid}`;Zo(n,`${JSON.stringify(e,null,2)}
|
|
1378
|
+
`,"utf8"),LN(n,r)}function BN(t,e){if(mh(e)||Ic(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=rn(t,"templates","workflows"),s=rn(t,"templates",e),o=PN(n,s);return o.length===0||o.startsWith("..")||mh(o)||o.includes("/")||o.includes("\\")?null:s}function qN(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=BN(t,n);if(o===null){delete e.files[n];continue}if(!es(o)){delete e.files[n];continue}try{if(vc(Qo(o))!==s)continue;MN(o),delete e.files[n]}catch{}}}function ti(t={}){let e=ei(t.cwd),r=ze(e,"templates","workflows"),n=yh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=es(n)?ON(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;ph(r,{recursive:!0});let i=UN(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Qo(ze(n,c)),f=vc(d),m=ze(r,c);if(!es(m)){try{Zo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=vc(Qo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Zo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Zo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}qN(e,i,l),WN(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Nc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(rn(r));let n=_h(t??process.cwd());return n!==null&&e.push(n),e.push(ze(hh(),xc)),e}function ri(t,e){let r=Nc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(es(i))return i}for(let s of n){let o=ze(yh(),s);if(es(o))return o}return null}var xc,hh,vc,wh,ni=b(()=>{"use strict";Cn();xc=".lmctl",hh=()=>process.env.HOME??DN(),vc=t=>RN("sha256").update(t).digest("hex");wh=".dist-manifest.json"});import{createHash as HN}from"node:crypto";import{existsSync as JN,mkdirSync as XN,writeFileSync as GN}from"node:fs";import{dirname as VN,join as nn}from"node:path";function tr(t){return typeof t=="string"&&t.startsWith(Eh)}function e$(t){if(!tr(t))throw new lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Eh.length),r=e.indexOf("/");if(r<=0)throw new lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!ZN.has(n))throw new lt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function t$(t,e,r){if(t==="workflow")return ri(e,r);let n=t==="mcp"?nn("templates","mcp",`${e}.json`):nn("templates","skills",e,"SKILL.md");for(let s of Nc(r)){let o=nn(s,n);if(JN(o))return o}return null}function r$(t,e,r){let n=nn(ei(r),YN,t);return t==="skill"?nn(n,e,"SKILL.md"):nn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function n$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function ts(t,e){let{kind:r,name:n,ref:s}=e$(t),o=t$(r,n,e);if(o!==null)return o;let i=`${KN}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(zN)})}catch(u){throw new lt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new lt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=QN.exec(s);if(u!==null){let d=HN("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!n$(r,l))throw new lt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=r$(r,n,e);return XN(VN(c),{recursive:!0}),GN(c,l,"utf8"),c}var Eh,KN,YN,zN,ZN,lt,QN,$c=b(()=>{"use strict";ni();Eh="lmctl://",KN="https://lmctl.com/templates/",YN=".cache",zN=8e3,ZN=new Set(["workflow","mcp","skill"]),lt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},QN=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as s$,mkdirSync as o$,readFileSync as i$,renameSync as a$,unlinkSync as l$,writeFileSync as c$}from"node:fs";import{homedir as Th}from"node:os";import{dirname as rs,join as Ue,resolve as u$}from"node:path";function Ac(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function f$(t){let e=Ue(t,".mcp.json"),r=Ac();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
|
|
1379
1379
|
`,"utf8"),!0;let n;try{n=JSON.parse(be.readFileSync(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ct(n.mcpServers)?{...n.mcpServers}:{},o=ct(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,be.writeFileSync(e,JSON.stringify(n,null,2)+`
|
|
1380
1380
|
`,"utf8"),!0)}function Rc(t,e){if(t==="copilot"){let n=m$();return n.present&&h$(e,ns),n}if(t==="codex")return{scope:"codex-cli-flags",path:"codex app-server -c mcp_servers.lmctl.*",changed:!1,present:!1};let r=Ue(e,".mcp.json");try{let n=f$(e);return{scope:"workspace",path:r,changed:n,present:bh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:bh(e),error:n instanceof Error?n.message:String(n)}}}function oi(t,e,r,n,s){if(!e)return;let o=Rc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
|
|
1381
1381
|
`),Z({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),!o.present&&o.scope!=="codex-cli-flags"&&t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
|
|
1382
|
-
`)}function ii(t,e,r){let n=rs(u$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([rr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ns),nr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)_$(i)}function m$(){let t=ai();try{let{changed:e}=Oc(t,{[ns]:Ac()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ai(t=kh??Th()){return Ue(t,".copilot","mcp-config.json")}function Oc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ct(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ct(n[o])?n[o]:void 0;
|
|
1383
|
-
`,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function bh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,vh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=kh??Th();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=
|
|
1384
|
-
`)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Sh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function
|
|
1385
|
-
`,"utf8")}function L$(t,e){let r={};for(let n of t)r[n.name]=ci(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=$h(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?$h(t.replace(/\/skill\.md$/i,"")):e}async function Ah(t,e,r){let n=C$(t),s=Ze(e,n);if(Lh(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Mh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?(
|
|
1386
|
-
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await
|
|
1387
|
-
`)}function
|
|
1382
|
+
`)}function ii(t,e,r){let n=rs(u$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([rr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ns),nr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)_$(i)}function m$(){let t=ai();try{let{changed:e}=Oc(t,{[ns]:Ac()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ai(t=kh??Th()){return Ue(t,".copilot","mcp-config.json")}function Oc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ct(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ct(n[o])?n[o]:void 0;xh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,vh(t,r),{changed:!0}):{changed:!1}}function vh(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
1383
|
+
`,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function bh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,vh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=kh??Th();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=y$(a);if(l===null)return;if(l!==void 0){if(Sh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=w$(a);if(c===null)return;if(c!==void 0&&Sh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;p$(t,s.join(`
|
|
1384
|
+
`)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Sh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function y$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Ih(e[1])}function w$(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Ih(r)}function Ih(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(e)||!ct(e.mcpServers))return!1;let r=ct(e.mcpServers[ns])?e.mcpServers[ns]:void 0;return xh(r,Ac())}catch{return!1}}function xh(t,e){return t!==void 0&&si(t)===si(e)}function si(t){return Array.isArray(t)?`[${t.map(e=>si(e)).join(",")}]`:ct(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${si(t[e])}`).join(",")}}`:JSON.stringify(t)}function ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ns,rr,d$,be,kh,ss=b(()=>{"use strict";je();ns="lmctl",rr="lmctl0",d$={existsSync:s$,mkdirSync:o$,readFileSync:i$,writeFileSync:c$,renameSync:a$,unlinkSync:l$},be=d$});import{spawnSync as Oh}from"node:child_process";import{cpSync as Nh,existsSync as Mc,mkdirSync as Lh,mkdtempSync as E$,readFileSync as Ch,statSync as b$,writeFileSync as Lc}from"node:fs";import{homedir as S$,tmpdir as T$}from"node:os";import{basename as $h,join as Ze}from"node:path";function Lt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Cc(t,e,r){if(Array.isArray(t)){for(let n of t)Cc(n,e,r);return}if(Lt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Cc(n,e,r)}}function x$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Lt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Lt(l)&&l.members!==void 0&&Cc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(I$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Mh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(k$)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>jh)throw new Qe(e,`fetched ${t} exceeds ${jh} bytes`);return n}async function N$(t,e){if(typeof t!="string")return[t];tr(t)&&(t=await ts(t));let r;if(Dc.test(t))r=await Mh(t,e);else{if(!Mc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Ch(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Lt(n)&&Lt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Lt(o)?o:{}}));if(Lt(n)&&typeof n.name=="string")return[n];throw new Qe(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function ci(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function li(t,e,r,n){let s=Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function $$(t,e,r){Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function j$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function A$(t){let e=["mcp","add"];if(ci(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function R$(t){if(ci(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function O$(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(sn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Mc(r))try{let o=JSON.parse(Ch(r,"utf8"));Lt(o)&&(n=o)}catch{}let s=Lt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=ci(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Lh(e,{recursive:!0}),Lc(r,`${JSON.stringify(n,null,2)}
|
|
1385
|
+
`,"utf8")}function L$(t,e){let r={};for(let n of t)r[n.name]=ci(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=$h(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?$h(t.replace(/\/skill\.md$/i,"")):e}async function Ah(t,e,r){let n=C$(t),s=Ze(e,n);if(Lh(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Mh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?(Nh(t,s,{recursive:!0}),{name:n,dir:s}):(Nh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ui(t){let{dal:e,member:r,stderr:n}=t,s=x$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ie(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
1386
|
+
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await N$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(v$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Ah(c,l,r.alias)).dir;li(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Rh[o]!==void 0){let l=Rh[o]();for(let c of s.skills)await Ah(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Dc,k$,jh,v$,I$,sn,Rh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,jh=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Rh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function G(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function F(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function N(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function q(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1387
|
+
`)}function y(t,e){return t.stderr.write(`error: ${e}
|
|
1388
1388
|
`),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
1389
|
-
`),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return
|
|
1390
|
-
`)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return
|
|
1391
|
-
`),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return
|
|
1392
|
-
`);return 0}function q$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return
|
|
1389
|
+
`),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function F$(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
|
|
1390
|
+
`)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=F(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=N(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?q(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
|
|
1391
|
+
`),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=Uh(r.listTeamMembers(s.team.id));if(M(n,"--json"))q(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ie(i)} ${i.sessionid??"(unseeded)"}
|
|
1392
|
+
`);return 0}function q$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(M(n,"--json")?q(e,i):(e.stdout.write(`member ${i.alias}
|
|
1393
1393
|
`),e.stdout.write(`role: ${i.role}
|
|
1394
1394
|
`),e.stdout.write(`provider: ${Ie(i)}
|
|
1395
1395
|
`),e.stdout.write(`model: ${i.model??"(default)"}
|
|
1396
1396
|
`),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
|
|
1397
1397
|
`),e.stdout.write(`sessiondir: ${i.sessiondir}
|
|
1398
|
-
`)),0)}function H$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return
|
|
1399
|
-
`),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return
|
|
1398
|
+
`)),0)}function H$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team rm <alias>");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?q(e,a):e.stdout.write(`retired member ${i.alias}
|
|
1399
|
+
`),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=mi(e,r,s.team,N(n,"--alias"));if(typeof o=="number")return o;let i=await Q$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
|
|
1400
1400
|
`);let a=e.stdin??process.stdin,l=Uc.createInterface({input:a,terminal:!1}),c=i;os(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){os(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
|
|
1401
1401
|
`),0;if(d==="/help"){Z$(e),os(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
|
|
1402
1402
|
`),os(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
|
|
1403
1403
|
`);let f=await Vr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
|
|
1404
|
-
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return
|
|
1404
|
+
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return y(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??Ph,a=r.getWorkflowByName(i);if(a===null)return y(e,`workflow not found: ${i}`);let l=N(n,"--slug")??z$(s),c={task_description:s,slug:l},u=N(n,"--from-requirement"),d=N(n,"--from-plan"),f=N(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=G$(r,e),p=await is(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
|
|
1405
1405
|
`),K$(e,m,p.id)}function G$(t,e){let r=zn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function V$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Ph}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
|
|
1406
1406
|
`)),0}async function K$(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await is(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
|
|
1407
1407
|
`),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
|
|
@@ -1412,32 +1412,32 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1412
1412
|
`);let a=Uc.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
|
|
1413
1413
|
`),0;if(c==="/done")return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function is(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function z$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Fh(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
|
|
1414
1414
|
`)),0}function Z$(t){t.stderr.write(`commands: /help, /exit
|
|
1415
|
-
`)}function os(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function di(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?
|
|
1415
|
+
`)}function os(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function di(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=M$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=Dh(s),i=e.listProjects().find(a=>Dh(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function fi(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function mi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=Uh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function on(t,e,r,n){let s=di(t,e,r);if(typeof s=="number")return s;let o=fi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Uh(t){return t.filter(e=>e.state!=="retired")}async function Q$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
|
|
1416
1416
|
`),Go(r,e),Ko(r);let s=await Kr({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=en(Ie(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
|
|
1417
1417
|
${i}
|
|
1418
1418
|
`),await ui({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
|
|
1419
1419
|
|
|
1420
|
-
${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Ph,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();wc();Ph="spec-driven-task"});import Bh from"jexl";function sr(t){Bh.compile(qh(t))}async function $r(t,e){return Bh.eval(qh(t),e)}function qh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as y}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Hh,Bc,qc,Hc,Jc,Xc,Gc,Jh,rj,nj,sj,as,oj,pi,hi,_i,gi,wi,Xh,ij,aj,lj,cj,yi,ln=b(()=>{"use strict";an();tj=y.object({kind:y.enum(["success","neutral","failure"])}),Hh=y.enum(["string","number","boolean","object","array"]),Bc=y.object({name:y.string().min(1),type:Hh,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),qc=y.object({name:y.string().min(1),type:Hh,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Hc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Jc="__failure__",Xc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Gc=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(),Jh=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),rj=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(),nj=y.union([y.string().min(1),rj]),sj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),as=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(nj).optional(),skills:y.array(sj).optional()}),oj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),pi=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:as,pre_checks:y.array(oj).optional(),reviewers:y.array(as.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"})}),hi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(as.extend({topic:y.string().min(1)})).optional(),consolidator:as,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()}),_i=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:as.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()}),gi=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)}),wi=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()}),Xh=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{sr(Vc(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}`})}}),ij=y.discriminatedUnion("type",[Jh,pi,hi,_i,gi,wi,Xh]),aj=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:ij,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(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}`})}}),lj=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{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=y.discriminatedUnion("type",[Jh,pi,hi,_i,gi,wi,Xh,aj,lj]),yi=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),cj),terminals:y.record(y.string().min(1),tj),errors:Gc,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(Bc).optional(),outputs:y.array(qc).optional(),triggers:y.array(Hc).optional(),read_only:y.boolean().optional(),requires:Xc}).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 uj,Ei,dj,fj,mj,yt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,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()}),yt=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:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).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 bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Kh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(yj(e),Yh(e)===3)return wj(e);let r=yi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function wj(t){let e=yt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function yj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Yh(t);if(!(e===null||Gh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Gh.join(", ")}`}]})}function Yh(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 Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1421
|
-
`)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(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"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(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 Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=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 Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function
|
|
1422
|
-
`),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+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,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))t_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=e_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:Tt}=Nj(ie,or(_e,I,r));_(L,ie,we,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=r_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let we=or(te,I,r);J==="mcp"?ie={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:we.content})}else{let we=s_(te);(typeof we!="string"||we.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=we}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],we=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:we,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let we=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...we}=te;_(L,"lmctl/subflow",{workflow_name:_e,...we},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (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=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Zh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),N={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);N[I]??={},N[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),N[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);xj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:N,entry_step_id:k(f)},z=yt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(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 or(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 Aj(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]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(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 vj,Ij,e_,un,xj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:wi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1420
|
+
${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Ph,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();yc();Ph="spec-driven-task"});import Bh from"jexl";function sr(t){Bh.compile(qh(t))}async function $r(t,e){return Bh.eval(qh(t),e)}function qh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as w}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Hh,Bc,qc,Hc,Jc,Xc,Gc,Jh,rj,nj,sj,as,oj,pi,hi,_i,gi,yi,Xh,ij,aj,lj,cj,wi,ln=b(()=>{"use strict";an();tj=w.object({kind:w.enum(["success","neutral","failure"])}),Hh=w.enum(["string","number","boolean","object","array"]),Bc=w.object({name:w.string().min(1),type:Hh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),qc=w.object({name:w.string().min(1),type:Hh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Hc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Jc="__failure__",Xc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Gc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),Jh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),rj=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),nj=w.union([w.string().min(1),rj]),sj=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),as=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(nj).optional(),skills:w.array(sj).optional()}),oj=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),pi=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:as,pre_checks:w.array(oj).optional(),reviewers:w.array(as.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.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"})}),hi=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(as.extend({topic:w.string().min(1)})).optional(),consolidator:as,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),_i=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:as.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),gi=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),yi=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),Xh=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{sr(Vc(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}`})}}),ij=w.discriminatedUnion("type",[Jh,pi,hi,_i,gi,yi,Xh]),aj=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:ij,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(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}`})}}),lj=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=w.discriminatedUnion("type",[Jh,pi,hi,_i,gi,yi,Xh,aj,lj]),wi=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),cj),terminals:w.record(w.string().min(1),tj),errors:Gc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(Bc).optional(),outputs:w.array(qc).optional(),triggers:w.array(Hc).optional(),read_only:w.boolean().optional(),requires:Xc}).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 uj,Ei,dj,fj,mj,wt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,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()}),wt=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:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).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 bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Kh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(wj(e),Yh(e)===3)return yj(e);let r=wi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function yj(t){let e=wt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function wj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Yh(t);if(!(e===null||Gh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Gh.join(", ")}`}]})}function Yh(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 Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1421
|
+
`)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(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"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(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 Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=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 Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function xj(t,e){let r=Ij[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 n_(t){let e=[],r=(v,I)=>{throw new un([{line:v,message:I}])},n=t.split(`
|
|
1422
|
+
`),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+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,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))t_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=e_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:Tt}=xj(ie,or(_e,I,r));_(L,ie,ye,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=r_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let ye=or(te,I,r);J==="mcp"?ie={...ye,name:L}:((typeof ye.content!="string"||ye.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:ye.content})}else{let ye=s_(te);(typeof ye!="string"||ye.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],ye=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:ye,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(L,"lmctl/subflow",{workflow_name:_e,...ye},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:L,port:ye.label,dstDeclId:ye.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (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=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Zh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);x[I]??={},x[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),x[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);Nj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:x,entry_step_id:k(f)},z=wt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(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 or(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 Aj(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]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(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 vj,Ij,e_,un,Nj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:yi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1423
1423
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1424
|
-
`)}`),this.issues=e,this.name="DslCompileError"}},
|
|
1425
|
-
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=n_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=
|
|
1426
|
-
`)||e.startsWith("{")||e.startsWith("[")?i_(t):e.endsWith(".json")?i_(Rj(e,"utf8")):t}function i_(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Zc,Mt,dn=b(()=>{"use strict";ln();zh();zc();cn();o_();Zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Mt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Si(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Qc=b(()=>{"use strict"});var a_={};ce(a_,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>eu,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function eu(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ti(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Ti(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ki(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Si({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var tu=b(()=>{"use strict";dn();Qc()});async function c_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return l_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=l_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function l_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function Jj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var u_=b(()=>{"use strict";an();tu()});import{spawnSync as Xj}from"node:child_process";async function nu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Xj(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!Vj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await c_({dal:t.dal,project:t.project,issue:Kj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function fn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await nu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ru(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function Vj(t){return Array.isArray(t)&&t.every(e=>{if(!ru(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:ru(n)&&typeof n.name=="string"))})}function Kj(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function ru(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var vi=b(()=>{"use strict";u_()});function f_(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[Ii]:su},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function d_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Ii&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Ii,su,Yj,ou=b(()=>{"use strict";Ii="x-mailbox-channel",su="1",Yj="http://mailbox.local"});import{createHash as m_,createHmac as eA,timingSafeEqual as tA}from"node:crypto";function p_(){return async(t,e)=>{let r=h_();if(r===null||iA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Ii)===su){await e();return}let n=t.req.query("token");if(n!==void 0&&Ni(n,r)){au(t,r),await e();return}if(oA(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function h_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function __(t){let e=h_();return e!==null&&Ni(t,e)}function au(t,e,r=new Date){t.header("Set-Cookie",`${iu}=${nA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function g_(t){t.header("Set-Cookie",`${iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${w_(t,n)}`,"utf8").toString("base64url")}function sA(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:Ni(s[2],w_(e,`${s[0]}|${s[1]}`))}function Ni(t,e){return tA(m_("sha256").update(t).digest(),m_("sha256").update(e).digest())}function oA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Ni(r,e))return!0;let n=aA(t.req.header("cookie")??"")[iu];return n!==void 0&&sA(n,e)}function iA(t){return t==="/login"||t==="/logout"}function aA(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function w_(t,e){return eA("sha256",t).update(e).digest("hex")}var iu,rA,y_=b(()=>{"use strict";ou();iu="lmctl_next_session",rA=30});import{existsSync as mn,mkdirSync as lA,readdirSync as cA,readFileSync as xi,unlinkSync as uA,writeFileSync as uu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!dA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function b_(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return hA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:E_,updated_at:E_}:null}function fA(t,e,r,n){let s=r!==null?`
|
|
1424
|
+
`)}`),this.issues=e,this.name="DslCompileError"}},Nj=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"]),$j={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},t_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),r_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Rj}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Lj(t){for(let e of t.split(`
|
|
1425
|
+
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=n_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=wt.safeParse(r);if(!n.success)throw new Mt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=bi(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=wt.safeParse(e);if(!r.success)throw new Mt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=wi.safeParse(t);if(!e.success)throw new Mt(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 Mt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Kh(r)}catch(s){throw s instanceof Ct?new Zc(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1426
|
+
`)||e.startsWith("{")||e.startsWith("[")?i_(t):e.endsWith(".json")?i_(Rj(e,"utf8")):t}function i_(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Zc,Mt,dn=b(()=>{"use strict";ln();zh();zc();cn();o_();Zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Mt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Si(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Qc=b(()=>{"use strict"});var a_={};ce(a_,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>eu,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function eu(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ti(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Ti(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ki(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Si({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var tu=b(()=>{"use strict";dn();Qc()});async function c_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return l_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=l_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function l_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function Jj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var u_=b(()=>{"use strict";an();tu()});import{spawnSync as Xj}from"node:child_process";async function nu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Xj(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!Vj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await c_({dal:t.dal,project:t.project,issue:Kj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function fn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await nu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ru(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function Vj(t){return Array.isArray(t)&&t.every(e=>{if(!ru(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:ru(n)&&typeof n.name=="string"))})}function Kj(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function ru(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var vi=b(()=>{"use strict";u_()});function f_(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[Ii]:su},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function d_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Ii&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Ii,su,Yj,ou=b(()=>{"use strict";Ii="x-mailbox-channel",su="1",Yj="http://mailbox.local"});import{createHash as m_,createHmac as eA,timingSafeEqual as tA}from"node:crypto";function p_(){return async(t,e)=>{let r=h_();if(r===null||iA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Ii)===su){await e();return}let n=t.req.query("token");if(n!==void 0&&xi(n,r)){au(t,r),await e();return}if(oA(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function h_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function __(t){let e=h_();return e!==null&&xi(t,e)}function au(t,e,r=new Date){t.header("Set-Cookie",`${iu}=${nA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function g_(t){t.header("Set-Cookie",`${iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${y_(t,n)}`,"utf8").toString("base64url")}function sA(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:xi(s[2],y_(e,`${s[0]}|${s[1]}`))}function xi(t,e){return tA(m_("sha256").update(t).digest(),m_("sha256").update(e).digest())}function oA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xi(r,e))return!0;let n=aA(t.req.header("cookie")??"")[iu];return n!==void 0&&sA(n,e)}function iA(t){return t==="/login"||t==="/logout"}function aA(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function y_(t,e){return eA("sha256",t).update(e).digest("hex")}var iu,rA,w_=b(()=>{"use strict";ou();iu="lmctl_next_session",rA=30});import{existsSync as mn,mkdirSync as lA,readdirSync as cA,readFileSync as Ni,unlinkSync as uA,writeFileSync as uu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!dA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function b_(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return hA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:E_,updated_at:E_}:null}function fA(t,e,r,n){let s=r!==null?`
|
|
1427
1427
|
description: ${r}`:"";return`---
|
|
1428
1428
|
name: ${t}${s}
|
|
1429
1429
|
type: ${e}
|
|
1430
1430
|
---
|
|
1431
|
-
${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=mn(s)?
|
|
1431
|
+
${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=mn(s)?Ni(s,"utf8"):"",a=new RegExp(`^- \\[${S_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
|
|
1432
1432
|
`)?`${i}
|
|
1433
1433
|
${o}
|
|
1434
1434
|
`:`${i}${o}
|
|
1435
|
-
`,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=xi(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=xi(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(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){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=xi(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(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){et(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 et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(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=ut(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=ut(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||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(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=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function wA(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 I_(t,e=new Date){let{time:r,date:n}=wA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(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),N=new DataView($.buffer);N.setUint32(0,33639248,!0),N.setUint16(4,20,!0),N.setUint16(6,20,!0),N.setUint16(8,0,!0),N.setUint16(10,0,!0),N.setUint16(12,r,!0),N.setUint16(14,n,!0),N.setUint32(16,_,!0),N.setUint32(20,T,!0),N.setUint32(24,T,!0),N.setUint16(28,g.length,!0),N.setUint16(30,0,!0),N.setUint16(32,0,!0),N.setUint16(34,0,!0),N.setUint16(36,0,!0),N.setUint32(38,0,!0),N.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 _A,N_=b(()=>{"use strict";_A=(()=>{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 Ai,mkdirSync as yA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(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 dt(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 dt(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 dt(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 dt(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=ut(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 dt(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||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(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=ut(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 dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(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(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.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=ut(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(vA(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 dt(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||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);yA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(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{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(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{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(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(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(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{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(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 dt(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(x_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(x_,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 dt(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=Ir(r,s),a=[];for(let c of i){let u=NA(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=I_(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 dt(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 kA(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 ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=cs(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 $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1435
|
+
`,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=Ni(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=Ni(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(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){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=Ni(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(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){et(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 et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(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=ut(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=ut(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||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(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=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function yA(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 I_(t,e=new Date){let{time:r,date:n}=yA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(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),x=new DataView($.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,T,!0),x.setUint32(24,T,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.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 _A,x_=b(()=>{"use strict";_A=(()=>{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 Ai,mkdirSync as wA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(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 dt(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 dt(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 dt(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 dt(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=ut(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 dt(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||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(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=ut(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 dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(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(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.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=ut(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(vA(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 dt(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||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);wA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(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{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(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{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(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(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(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{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(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 dt(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(N_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(N_,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 dt(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=Ir(r,s),a=[];for(let c of i){let u=xA(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=I_(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 dt(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 kA(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 ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=cs(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 $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1436
1436
|
description: ${n}`:"",i=`---
|
|
1437
1437
|
name: ${e}${o}
|
|
1438
1438
|
type: ${r}
|
|
1439
1439
|
---
|
|
1440
|
-
${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function
|
|
1440
|
+
${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function xA(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?NA(t.path):$A(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function NA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function $A(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var $i,ji,N_,R_=b(()=>{"use strict";Ot();x_();fu();$i=["user","feedback","project","reference"],ji=new Set(["smoke","integration","vision","scenario","regression"]),N_="operator"});function Ae(t,e){return`<!doctype html>
|
|
1441
1441
|
<html lang="en">
|
|
1442
1442
|
<head>
|
|
1443
1443
|
<meta charset="utf-8">
|
|
@@ -1503,41 +1503,41 @@ ${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1503
1503
|
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
|
|
1504
1504
|
JOIN step s ON s.id = sa.step_id
|
|
1505
1505
|
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let U=l.get(R.step_id)??[];U.push({kind:R.kind,id:R.id}),l.set(R.step_id,U)}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 U=JSON.parse(R.payload);typeof U.elapsedMs=="number"&&U.elapsedMs>0&&(f+=U.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(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
1506
|
-
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],
|
|
1507
|
-
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=
|
|
1506
|
+
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],x=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
1507
|
+
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",D=e.getWorkflow(n.workflow_id),C=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,H={run_id:t,workflow_name:D?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:C,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(H)})}var L_=b(()=>{"use strict"});import{spawnSync as M_}from"node:child_process";function pu(t){return jA[t]??`no install hint; ensure '${t}' is on PATH`}function AA(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 C_(t){return M_("which",[t],{encoding:"utf8"}).status===0}function D_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!C_(e)){let r=pu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!C_(e)){let s=pu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=AA(e);if(r===null)continue;let n=M_(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:pu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var jA,P_=b(()=>{"use strict";jA={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 RA,readdirSync as OA,readFileSync as LA}from"node:fs";import{join as F_}from"node:path";function CA(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(`
|
|
1508
1508
|
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function U_(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 W_(t,e){if(e.length===0)return null;let r=F_(t,"durable-memory");if(!RA(r))return null;let n;try{n=OA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=LA(F_(r,o),"utf8");if(CA(i).some(l=>e.includes(l))){let l=U_(i,"name")??o.replace(".md",""),c=U_(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 B_=b(()=>{"use strict"});function gu(t){let e=t.trim().replace(MA,"").trim();for(let r=0;r<4;r+=1){let n=DA.exec(e);if(n===null)break;e=n[2].trim()}return e}function q_(t){let e=t.trim(),r=PA.exec(e);if(r!==null)return r[2];let n=FA.exec(e);return n!==null?n[0]:null}function ds(t,e){let r=t.split(`
|
|
1509
1509
|
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=gu(r[i]),l=hu.exec(a);if(l===null)continue;let c=l[1].trim();if(_u.test(c))continue;let u=q_(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=gu(r[i]),l=hu.exec(a);if(l===null)break;let c=_u.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function H_(t){let e=t.split(`
|
|
1510
|
-
`),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,
|
|
1511
|
-
\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 tg(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=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(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=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(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 ir(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 ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=
|
|
1510
|
+
`),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,yu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function J_(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 X_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.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 ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function wu(t){return ZA(t,KA)}function QA(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 Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,G_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(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 V_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function K_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function Y_(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+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as z_,readdirSync as Z_,readFileSync as tR,statSync as Q_}from"node:fs";import{join as Ci}from"node:path";function eg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(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 tt(t,e,r,n,s={}){let o=P(),i=X(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,`${ms}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Ur(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Qs,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:rR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rR(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
1511
|
+
\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 tg(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=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(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=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(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 ir(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 ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=wu(E);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),sR(T,(E,k)=>{m+=E,p+=k})},g=await Vr({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:Ie(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oR(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&&Tu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Li(s.input_tokens),a=Li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Li(o.input_tokens),a=Li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Dt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(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 ps({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 pn(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=X(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(tm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
|
|
1512
1512
|
|
|
1513
|
-
`);try{let p=await ps({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=ds(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 Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?W_(t.project.local_path,e):null}function rg(t){return
|
|
1513
|
+
`);try{let p=await ps({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=ds(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 Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?W_(t.project.local_path,e):null}function rg(t){return wu(Eu(t))}function Su(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
1514
1514
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
1515
1515
|
ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Tu(t,e){if(!z_(t))return!1;let r=Ci(t,"durable-memory");function n(s){let o;try{o=Z_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Q_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function oR(t,e,r){let n=Ci(t.local_path,"durable-memory");if(!z_(n))return;let s;try{s=Z_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Ci(n,o),a;try{a=Q_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=tR(i,"utf8")}catch{continue}let c=aR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
|
|
1516
|
-
`);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function aR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();
|
|
1516
|
+
`);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function aR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();yu();Pn();X_();G_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as ng}from"node:child_process";function lR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=ng("git",["diff","--quiet"],{cwd:o}).status!==0,a=ng("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,Jc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var sg,og=b(()=>{"use strict";We();sg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:t=>lR(t,t.state)}});async function cR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await V_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var ig,ag=b(()=>{"use strict";We();fs();ig={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async t=>cR(t,t.state)}});async function uR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=hn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await pn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
|
|
1517
1517
|
${m}`:null).filter(m=>m!==null).join(`
|
|
1518
1518
|
|
|
1519
1519
|
`),c=`${n}:consolidator`,u=await pn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Dt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var lg,cg=b(()=>{"use strict";We();lg={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>uR(t,t.state)}});async function dR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Oi(e.items_from,t),a=hR(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await mR(t,e,s.id,a,l):await fR(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function fR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await dg(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function mR(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await dg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function dg(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":pR(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function pR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function hR(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var ug,fg=b(()=>{"use strict";We();fs();ug={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>dR(t,t.state)}});async function _R(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=hn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ps({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
|
|
1520
1520
|
|
|
1521
|
-
${u}`:u;try{let f=await ps({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=
|
|
1521
|
+
${u}`:u;try{let f=await ps({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=yR(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:wR(o,3),paused_at:i,created_run_inputs:ir(e.job.payload)}}function yR(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function wR(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var pg,hg=b(()=>{"use strict";Gn();We();pg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>_R(t,t.state)}});async function ER(t,e){let r=t.stateId,n=t.displayName,s=tg(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=bR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function bR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var _g,gg=b(()=>{"use strict";We();_g={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>ER(t,t.state)}});import{createHash as SR}from"node:crypto";import{existsSync as TR,mkdirSync as kR,readFileSync as vR,writeFileSync as IR}from"node:fs";import{dirname as xR,isAbsolute as wg,normalize as NR,resolve as hs}from"node:path";import{Document as $R,ExternalHyperlink as jR,HeadingLevel as _n,LevelFormat as AR,Packer as RR,Paragraph as ft,Table as OR,TableCell as LR,TableRow as CR,TextRun as mt,WidthType as MR}from"docx";import{marked as DR}from"marked";async function PR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await FR(t,e,n),i=await UR(t,e),a=await WR(t,e.title),l=await XR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kR(xR(i),{recursive:!0}),IR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:SR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(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}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function FR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?JR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qR(t.project.local_path,o);if(i!==null){if(!TR(i))throw new Error(`markdown_source file not found: ${i}`);return Mi(vR(i,"utf8"))}return Mi(o)}async function UR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function BR(t,e){let r=hs(t);return NR(wg(e)?hs(e):hs(r,e))}function qR(t,e){return HR(e)?wg(e)?hs(e):hs(t,e):null}function HR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JR(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Mi(s);let o=t.dal.query(`SELECT sa.content
|
|
1522
1522
|
FROM step_artifact sa
|
|
1523
1523
|
JOIN step s ON s.id = sa.step_id
|
|
1524
1524
|
WHERE s.run_id = ?
|
|
1525
1525
|
AND s.state_name LIKE ?
|
|
1526
1526
|
AND sa.content IS NOT NULL
|
|
1527
1527
|
ORDER BY sa.id DESC
|
|
1528
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=bg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function bg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...bg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:
|
|
1529
|
-
`).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={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=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(Tg(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}),K(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}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Tg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(kg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?kg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(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(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=
|
|
1528
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=bg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function bg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...bg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:yg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:yg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function yg(t){return t.task?`[${t.checked?"x":" "}] `:""}function VR(t){let e=[t.header,...t.rows].map(r=>new CR({children:r.map(n=>new LR({children:[new ft({children:lr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OR({width:{size:100,type:MR.PERCENTAGE},rows:e})}function KR(t){return t.text.split(`
|
|
1529
|
+
`).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={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=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(Tg(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}),K(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}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Tg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(kg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?kg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(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(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=yO(t.headers,`sheets[${e}].headers`),n=wO(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:EO(t.styles)}}function yO(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 wO(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 EO(t){if(!Di(t)||!Di(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 bO(t){let e=iO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if($O(s)){n=s.text;continue}jO(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 SO(t){rO(sO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:IO(n.name,e),data:TO(n),columns:vO(n)}));await aO(r).toFile(t.outputPath)}function TO(t){let e=[];if(t.headers.length>0){let r=NO(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(kO));return e.length===0?[[{}]]:e}function kO(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 vO(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 IO(t,e){let r=xO(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 xO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function NO(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 $O(t){return t.type==="heading"&&typeof t.text=="string"}function jO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vg,Ig=b(()=>{"use strict";We();vg={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=>lO(t,t.state)}});import{spawnSync as AO}from"node:child_process";async function OO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(AO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(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?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=hn(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 pn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1530
1530
|
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=H_(p.text);if(g!==null){let _=X(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=X(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),E=ds(p.text,T);if(E.outcome===null){let $=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ds(p.text,RO);if(g.outcome!==null){let T=X(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 _=X(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 Dt(t,n,T,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>pn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1531
1531
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(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 Dt(t,n,_,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1532
1532
|
|
|
1533
|
-
`),e.loop_feedback_artifact!==void 0){let g=X(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=X(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?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var RO,Ng,xg=b(()=>{"use strict";wu();We();RO=["blocked","failed","aborted"],Ng={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=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(s);if(i.matched&&!o){let h=X(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=LO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(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&&Tu(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),K(t.workflow,p))}var $g,jg=b(()=>{"use strict";We();$g={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=>CO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=X(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=Ce(o.definition),a=await DO(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,PO(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)}:K(t.workflow,u)}async function DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(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=UO(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 UO(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 Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={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=>MO(t,t.state)}});function WO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(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 Og,Lg=b(()=>{"use strict";We();Og={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=>WO(t,t.state)}});async function BO(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=qO(t.cursor),a=o.filter(HO).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 qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(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 Cg,Mg=b(()=>{"use strict";Cg={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=>BO(t)}});async function JO(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 Dg,Pg=b(()=>{"use strict";Dg={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=>JO(t)}});function Fg(t){t.register(sg),t.register(Ng),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();xg();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=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:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(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=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(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=D_(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(gs(n)){let m=Nu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Nu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(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 Nu(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 xu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(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=Nu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))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 Pt(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=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(t,r);if(a!==null){let l=X(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===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await xu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(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=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(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 tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(e,a.id);if(l!==null){let m=X(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===Dn)return Pt(e,ul);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 tt(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}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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 tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await xu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(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 xu(t,e,r,n){let s=Fi().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?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return yt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(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]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(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 KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(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 Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(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 Ui(t,e){if(!ZO(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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(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 eL(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 tL(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 Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(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=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return tw(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:rw(r)}}}function Qg(t,e){try{let r=Ce(e);return tw(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:rw(r)}}}function ew(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(`
|
|
1533
|
+
`),e.loop_feedback_artifact!==void 0){let g=X(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=X(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?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var RO,xg,Ng=b(()=>{"use strict";yu();We();RO=["blocked","failed","aborted"],xg={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=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(s);if(i.matched&&!o){let h=X(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=LO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(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&&Tu(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),K(t.workflow,p))}var $g,jg=b(()=>{"use strict";We();$g={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=>CO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=X(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=Ce(o.definition),a=await DO(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,PO(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)}:K(t.workflow,u)}async function DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(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=UO(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 UO(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 Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={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=>MO(t,t.state)}});function WO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(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 Og,Lg=b(()=>{"use strict";We();Og={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=>WO(t,t.state)}});async function BO(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=qO(t.cursor),a=o.filter(HO).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 qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(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 Cg,Mg=b(()=>{"use strict";Cg={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=>BO(t)}});async function JO(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 Dg,Pg=b(()=>{"use strict";Dg={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=>JO(t)}});function Fg(t){t.register(sg),t.register(xg),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();Ng();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=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:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(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=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(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=D_(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(gs(n)){let m=xu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=xu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(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 xu(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 Nu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(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=xu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))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 Pt(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=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(t,r);if(a!==null){let l=X(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===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Nu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(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=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(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 tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(e,a.id);if(l!==null){let m=X(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===Dn)return Pt(e,ul);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 tt(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}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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 tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await Nu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(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 Nu(t,e,r,n){let s=Fi().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?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return wt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(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]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(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 KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(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 Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(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 Ui(t,e){if(!ZO(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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(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 eL(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 tL(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 Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(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=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return ty(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:ry(r)}}}function Qg(t,e){try{let r=Ce(e);return ty(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:ry(r)}}}function ey(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(`
|
|
1534
1534
|
`)}
|
|
1535
|
-
`}function
|
|
1535
|
+
`}function ty(t,e){let r=cL(e),n=uL(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=lL(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function lL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cL(t){return $u(t)?t.entry_step_id:t.start_at}function uL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function ry(t){return t instanceof Mt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function ny(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};Yg(n,e)}else for(let r of Object.values(t.states))Yg(r,e);return[...e].sort()}function Yg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=zg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=zg(i);a!==null&&e.add(a)}}}function zg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Bi=b(()=>{"use strict";dn()});function dL({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,qi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=fL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ys}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:qi,source_ref:ys,payload:JSON.stringify({kind:ys,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
1536
1536
|
FROM run r
|
|
1537
1537
|
JOIN job j ON j.id = r.job_id
|
|
1538
1538
|
WHERE j.project_id = ?
|
|
1539
1539
|
AND r.terminal_state IS NOT NULL
|
|
1540
|
-
${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function
|
|
1540
|
+
${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function sy(t){for(let e of mL)try{e(t)}catch{}}var qi,ys,mL,ju=b(()=>{"use strict";qi="memory_policy",ys="memory_consolidation_request";mL=[dL]});var uy={};ce(uy,{getOrInsertConsolidationWorkflow:()=>iy,runJobById:()=>ws,runOnce:()=>Rr,startWorker:()=>yL});import{createHash as pL}from"node:crypto";import{readFileSync as hL}from"node:fs";import{pathToFileURL as _L}from"node:url";function iy(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ti({swallow:!0});let n=ri(e);if(n===null)return null;let s=hL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:_L(n).href,source_sha256:pL("sha256").update(s).digest("hex")})}catch{return null}}async function Rr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??oy,evaluator:n=>ly(t.dal,n)}),r===null?null:await ay(t.dal,r,e)}catch(n){if(r!==null)return cr(t.dal,r,"worker_run_failed",Ar(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n))})})}catch{}return null}finally{t.max_concurrent}}async function ws(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??oy,evaluator:s=>ly(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ay(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...cr(t.dal,r,"worker_run_failed",Ar(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ay(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return cr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===qi&&e.source_ref===ys,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=iy(t):i=cy(t,e,n),i===null)return cr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return cr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return cr(t,e,"worker_workflow_invalid",Ar(d),r,n)}let u=wL(c,l);if(u.length>0)return cr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await qg({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return cr(t,e,"worker_run_failed",Ar(d),r,n,a)}}function ly(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=cy(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Si({workflow:s,job:e,project:r})}function cy(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function yL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Rr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Hi(Ar(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??gL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function cr(t,e,r,n,s,o,i){let a=Hi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Ar(t){return t instanceof Error?t.message:String(t)}function Hi(t){return t.length>4096?t.slice(0,4096):t}function wL(t,e){let r=ny(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var oy,gL,Es=b(()=>{"use strict";ni();Kg();dn();Bi();Qc();ju();oy=6e5,gL=5e3});import{existsSync as EL,readFileSync as bL}from"node:fs";import{marked as SL}from"marked";function py(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",TL(e.dal)))),t.get("/api/layman",r=>r.json(yy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=my(r);return n===null?r.notFound():r.html(Ae(`Start ${gn(n)}`,IL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=my(r);return n===null?r.notFound():n==="newspaper"?dy(r,e.dal):xL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,jL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.json(WL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>RL(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",FL(e.dal)))),t.post("/layman/newspaper",r=>dy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>fy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>fy(r,e.dal))}function TL(t){let e=yy(t);return`<section class="layman-home">
|
|
1541
1541
|
<h1>Welcome</h1>
|
|
1542
1542
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
1543
1543
|
<div class="grid">${Xi.map(kL).join("")}</div>
|
|
@@ -1552,7 +1552,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1552
1552
|
<h2>${S(t.title)}</h2>
|
|
1553
1553
|
<p>${S(t.description)}</p>
|
|
1554
1554
|
<p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
|
|
1555
|
-
</article>`}function vL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(gn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function IL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(gn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(gn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=
|
|
1555
|
+
</article>`}function vL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(gn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function IL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(gn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(gn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=hy(n);return e==="info-qa"?`<h1>Ask a Question</h1>
|
|
1556
1556
|
<form method="post" action="/layman/start/info-qa">
|
|
1557
1557
|
${s}
|
|
1558
1558
|
<label>Ask anything<textarea name="question" rows="8" required></textarea></label>
|
|
@@ -1565,12 +1565,12 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1565
1565
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
1566
1566
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
1567
1567
|
<button type="submit">Start Document Wizard</button>
|
|
1568
|
-
</form>`:
|
|
1569
|
-
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${LL(t,e,r)}`;let s=
|
|
1568
|
+
</form>`:gy(n,"/layman/start/newspaper")}function hy(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function xL(t,e,r){let n=await t.req.parseBody(),s=by(e,n);if(s===null)return t.html(Ae("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ae("Start workflow",`<p class="error">${S(gn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?NL(n):$L(n);if(typeof i=="string")return t.html(Ae("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Rr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function NL(t){let e=Ge(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ge(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function $L(t){let e=Ge(t.task_description).trim(),r=VL(Ge(t.slug).trim()),n=Ge(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function jL(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(gn(r))}</h1>
|
|
1569
|
+
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${LL(t,e,r)}`;let s=Ey(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${AL(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
1570
1570
|
<h2>Running</h2>
|
|
1571
1571
|
<p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
|
|
1572
|
-
${
|
|
1573
|
-
</section>`}function
|
|
1572
|
+
${_y(e)}
|
|
1573
|
+
</section>`}function _y(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function AL(t,e){return`<section class="metric paused-interactive">
|
|
1574
1574
|
<h2>${S(HL(e.state_name))}</h2>
|
|
1575
1575
|
<p class="muted">The agent is waiting for your response.</p>
|
|
1576
1576
|
<h3>Agent output</h3>
|
|
@@ -1586,15 +1586,15 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1586
1586
|
<p>Status: <strong>${S(e.terminal_state)}</strong></p>
|
|
1587
1587
|
${n?CL(t,e,r):DL(e)}
|
|
1588
1588
|
<h2>Stage Log</h2>
|
|
1589
|
-
${
|
|
1589
|
+
${_y(e)}
|
|
1590
1590
|
</section>`}function CL(t,e,r){if(r==="info-qa"){let n=Lu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Cu(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return ML(t,e);if(r==="newspaper"){let n=Lu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Cu(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function ML(t,e){let r=Ir(t,e.id),n=Au(r,["render_docx"]),s=Au(r,["render_xlsx"]),o=Lu(e,["review:coder[0]_transcript","chat_output_md"])??PL(Au(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
|
|
1591
1591
|
<pre>${S(GL(XL(o??"No preview available."),30))}</pre>
|
|
1592
1592
|
<h3>Downloads</h3>
|
|
1593
1593
|
${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function DL(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Lu(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Au(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function PL(t){if(t===null||!EL(t)||!t.endsWith(".md"))return null;try{return bL(t,"utf8")}catch{return null}}function FL(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
|
|
1594
|
-
${UL(
|
|
1594
|
+
${UL(wy(t))}
|
|
1595
1595
|
<h2>Add Subscription</h2>
|
|
1596
|
-
${e.length===0?'<p class="error">Create a project before subscribing.</p>':
|
|
1597
|
-
${
|
|
1596
|
+
${e.length===0?'<p class="error">Create a project before subscribing.</p>':gy(e,"/layman/newspaper")}`}function gy(t,e){return`<form method="post" action="${S(e)}">
|
|
1597
|
+
${hy(t)}
|
|
1598
1598
|
<label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
|
|
1599
1599
|
<label>Schedule<select name="schedule">
|
|
1600
1600
|
<option value="daily">Daily at 6am</option>
|
|
@@ -1604,31 +1604,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1604
1604
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
1605
1605
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
1606
1606
|
<button type="submit">Create subscription</button>
|
|
1607
|
-
</form>`}async function
|
|
1607
|
+
</form>`}async function dy(t,e){let r=await t.req.parseBody(),n=by(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:qL(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function fy(t,e){let r=Ji(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UL(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=KL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function yy(t){let e=wy(t);return{workflows:Xi,recent_runs:BL(t),newspaper_subscriptions:e.length}}function WL(t,e){let r=Ey(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function BL(t){return t.query(`SELECT r.*, w.name AS workflow_name
|
|
1608
1608
|
FROM run r
|
|
1609
1609
|
JOIN workflow w ON w.id = r.workflow_id
|
|
1610
1610
|
WHERE w.name IN (${Ou.map(()=>"?").join(",")})
|
|
1611
1611
|
ORDER BY r.id DESC
|
|
1612
|
-
LIMIT 10`,...Ou)}function
|
|
1612
|
+
LIMIT 10`,...Ou)}function wy(t){return t.query(`SELECT pw.*, p.name AS project_name
|
|
1613
1613
|
FROM project_workflow pw
|
|
1614
1614
|
JOIN workflow w ON w.id = pw.workflow_id
|
|
1615
1615
|
JOIN project p ON p.id = pw.project_id
|
|
1616
1616
|
WHERE w.name = ?
|
|
1617
|
-
ORDER BY pw.id DESC`,"newspaper")}function
|
|
1617
|
+
ORDER BY pw.id DESC`,"newspaper")}function Ey(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function by(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function my(t){let e=t.req.param("workflow");return Ou.includes(e)?e:null}function gn(t){return Xi.find(e=>e.name===t)?.title??t}function HL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Cu(t){return SL.parse(t,{async:!1})}function JL(t){return t==="done"||t==="pr_ready"||t==="merged"}function XL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function GL(t,e){return t.split(`
|
|
1618
1618
|
`).slice(0,e).join(`
|
|
1619
|
-
`)}function VL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function KL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ji(t,e){return Number(t.req.param(e))}var Xi,Ou,Sw=b(()=>{"use strict";Es();Ot();mu();Xi=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Ou=Xi.map(t=>t.name)});function zL(t){return t.replace(/^\/+/,"")}function Tw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function wn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zL(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Tw(t.userId)&&Tw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YL}/${t.identityId}/`}function QL(t){return String(Math.max(0,Math.floor(t))).padStart(ZL,"0")}function Mu(t,e,r){return`${t}${e}${QL(r)}.json`}function Gi(t,e){return`${t}${e}`}function Vi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var YL,ZL,Ki=b(()=>{"use strict";YL="mailbox";ZL=12});function Ft(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Yi[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Yi[a&15]+i,a=a>>4;let l=Yi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Yi[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Yi,zi=b(()=>{"use strict";Yi="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function xw(t){return t.conversation_id===Nw&&rC(t.payload)}function rC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:xw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var kw,vw,Iw,eC,Nw,tC,Du,Or,Zi=b(()=>{"use strict";Ki();zi();kw=3e3,vw=1e4,Iw=12e3,eC=1e3,Nw="__lmctl_heartbeat__",tC={kind:"heartbeat"},Du={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Or=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=wn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Pu(e.readIntervalMs??e.pollIntervalMs??kw,kw),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??vw,vw),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Iw,Iw)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??Du;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=Gi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:eC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Vi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Ft(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Mu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Mu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Fu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),xw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=nC(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Nw,tC)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as sC}from"@hono/node-server/conninfo";function $w(t,e){let r=e.bucket??oC,n=e.remoteAddressOf??(o=>aC(o)),s=o=>{let i=n(o);return lC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Wu(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Uu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Wu(d)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aC(t){try{return sC(t).remote.address}catch{return}}function lC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var oC,jw=b(()=>{"use strict";Zi();oC="local"});function Aw(t,e){t.get("/mailbox/workspace",r=>dC(r,e)),t.get("/mailbox/projects",r=>fC(r,e)),t.get("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects",r=>pC(r,e)),t.patch("/mailbox/projects/:id",r=>hC(r,e)),t.delete("/mailbox/projects/:id",r=>_C(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gC(r,e)),t.get("/mailbox/prompts/:id",r=>wC(r,e))}function dC(t,e){e.dal.ensureWorkspace({id:En,name:Bu});let r=Rw(e.dal),n={id:En,name:Bu,created_at:uC,projects:r};return t.json({workspace:n})}function fC(t,e){return t.json({projects:Rw(e.dal)})}function mC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=qu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ta(s)})}let n=Lw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Ow(n)})}async function pC(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:En,name:Bu});let s=e.dal.insertWebProject({workspace_id:En,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ta(s)},201)}async function hC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let o=qu(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ta(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _C(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=qu(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function gC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Lw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${cC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await yC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ea}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function wC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=EC(e.dal,r);return t.json({result:n})}function Rw(t){let e=t.listProjects().map(Ow),r=t.listWebProjectsActive(En).map(ta);return[...e,...r].sort(jC)}function Ow(t){return{id:`${ea}${t.id}`,workspace_id:En,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ta(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${yn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function qu(t,e){if(!e.startsWith(yn))return null;let r=e.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Lw(t,e){if(e.startsWith(ea)){let n=e.slice(ea.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function yC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(tu(),a_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EC(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=NC(t,o?.team_id??null),a=IC(s),l=xC(n,a,i.length>0),c=$C(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:bC(t,o.workflow_name),d=u.totalEstimatedMs,f=Cw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:SC(t,s.id),g=TC(s,a,h,u.perStep,i),_=kC(h,u.perStep),T=vC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Qi(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Qi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Qi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Qi(d,f),...T},errors_json:null,duration_ms:c}}function bC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function SC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function TC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Cw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function kC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function vC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Cw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Qi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IC(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function NC(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function xC(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function $C(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function jC(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ea,yn,cC,En,Bu,uC,Mw=b(()=>{"use strict";ea="project:",yn="web_project:",cC="prompt:",En="default",Bu="Default workspace",uC=new Date(0).toISOString()});import{Buffer as Dw}from"node:buffer";function Pw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Fw(t){return OC[t]}function Uw(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var AC,RC,ra,OC,Hu=b(()=>{"use strict";AC=1e4,RC=256*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Pw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,AC),this.pushByteCap=Pw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,RC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Dw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Dw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
|
|
1619
|
+
`)}function VL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function KL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ji(t,e){return Number(t.req.param(e))}var Xi,Ou,Sy=b(()=>{"use strict";Es();Ot();mu();Xi=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Ou=Xi.map(t=>t.name)});function zL(t){return t.replace(/^\/+/,"")}function Ty(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function yn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zL(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Ty(t.userId)&&Ty(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YL}/${t.identityId}/`}function QL(t){return String(Math.max(0,Math.floor(t))).padStart(ZL,"0")}function Mu(t,e,r){return`${t}${e}${QL(r)}.json`}function Gi(t,e){return`${t}${e}`}function Vi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var YL,ZL,Ki=b(()=>{"use strict";YL="mailbox";ZL=12});function Ft(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Yi[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Yi[a&15]+i,a=a>>4;let l=Yi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Yi[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Yi,zi=b(()=>{"use strict";Yi="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function Ny(t){return t.conversation_id===xy&&rC(t.payload)}function rC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Ny(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var ky,vy,Iy,eC,xy,tC,Du,Or,Zi=b(()=>{"use strict";Ki();zi();ky=3e3,vy=1e4,Iy=12e3,eC=1e3,xy="__lmctl_heartbeat__",tC={kind:"heartbeat"},Du={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Or=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=yn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Pu(e.readIntervalMs??e.pollIntervalMs??ky,ky),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??vy,vy),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Iy,Iy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??Du;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=Gi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:eC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Vi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Ft(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Mu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Mu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Fu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Ny(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=nC(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(xy,tC)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as sC}from"@hono/node-server/conninfo";function $y(t,e){let r=e.bucket??oC,n=e.remoteAddressOf??(o=>aC(o)),s=o=>{let i=n(o);return lC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Wu(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Uu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Wu(d)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aC(t){try{return sC(t).remote.address}catch{return}}function lC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var oC,jy=b(()=>{"use strict";Zi();oC="local"});function Ay(t,e){t.get("/mailbox/workspace",r=>dC(r,e)),t.get("/mailbox/projects",r=>fC(r,e)),t.get("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects",r=>pC(r,e)),t.patch("/mailbox/projects/:id",r=>hC(r,e)),t.delete("/mailbox/projects/:id",r=>_C(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gC(r,e)),t.get("/mailbox/prompts/:id",r=>yC(r,e))}function dC(t,e){e.dal.ensureWorkspace({id:En,name:Bu});let r=Ry(e.dal),n={id:En,name:Bu,created_at:uC,projects:r};return t.json({workspace:n})}function fC(t,e){return t.json({projects:Ry(e.dal)})}function mC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(wn)){let s=qu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ta(s)})}let n=Ly(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Oy(n)})}async function pC(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:En,name:Bu});let s=e.dal.insertWebProject({workspace_id:En,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ta(s)},201)}async function hC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(wn)){let o=qu(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ta(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _C(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(wn)){let n=qu(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function gC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Ly(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${cC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await wC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ea}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function yC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=EC(e.dal,r);return t.json({result:n})}function Ry(t){let e=t.listProjects().map(Oy),r=t.listWebProjectsActive(En).map(ta);return[...e,...r].sort(jC)}function Oy(t){return{id:`${ea}${t.id}`,workspace_id:En,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ta(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${wn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function qu(t,e){if(!e.startsWith(wn))return null;let r=e.slice(wn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Ly(t,e){if(e.startsWith(ea)){let n=e.slice(ea.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function wC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(tu(),a_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EC(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=xC(t,o?.team_id??null),a=IC(s),l=NC(n,a,i.length>0),c=$C(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:bC(t,o.workflow_name),d=u.totalEstimatedMs,f=Cy(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:SC(t,s.id),g=TC(s,a,h,u.perStep,i),_=kC(h,u.perStep),T=vC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Qi(d,f),...T},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Qi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Qi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Qi(d,f),...T},errors_json:null,duration_ms:c}}function bC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function SC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function TC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Cy(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function kC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function vC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Cy(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Qi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IC(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function xC(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function NC(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function $C(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function jC(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ea,wn,cC,En,Bu,uC,My=b(()=>{"use strict";ea="project:",wn="web_project:",cC="prompt:",En="default",Bu="Default workspace",uC=new Date(0).toISOString()});import{Buffer as Dy}from"node:buffer";function Py(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Fy(t){return OC[t]}function Uy(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var AC,RC,ra,OC,Hu=b(()=>{"use strict";AC=1e4,RC=256*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Py(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,AC),this.pushByteCap=Py(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,RC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Dy.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${Dy.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
|
|
1620
1620
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
1621
|
-
`,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};OC={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function Bw(t,e){t.post("/mailbox/terminal/launch",r=>LC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CC(r,e)),t.get("/mailbox/terminal/sessions",r=>MC(r,e))}async function LC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Ww.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Uw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Fw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function CC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Ww.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function MC(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Ww,qw=b(()=>{"use strict";Hu();Ww=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as DC}from"node:buffer";function UC(t){try{return DC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Hw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Jw(t){return WC[t]}function Xw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var PC,FC,na,WC,Ju=b(()=>{"use strict";PC=2e3,FC=64*1024,na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Hw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PC),this.pushByteCap=Hw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=UC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};WC={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function Vw(t,e){t.post("/mailbox/chat/launch",r=>BC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qC(r,e)),t.get("/mailbox/chat/sessions",r=>HC(r,e))}async function BC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Gw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Xw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Jw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function qC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Gw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function HC(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Gw,Kw=b(()=>{"use strict";Ju();Gw=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as JC}from"node:fs";function zw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Yw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JC(e.path,{encoding:"utf8"});return Yw(r)}catch{return[]}}function Yw(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var Zw=b(()=>{"use strict"});function Qw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function sa(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
1621
|
+
`,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};OC={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function By(t,e){t.post("/mailbox/terminal/launch",r=>LC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CC(r,e)),t.get("/mailbox/terminal/sessions",r=>MC(r,e))}async function LC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Wy.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Uy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Fy(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function CC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Wy.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function MC(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Wy,qy=b(()=>{"use strict";Hu();Wy=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as DC}from"node:buffer";function UC(t){try{return DC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Hy(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Jy(t){return WC[t]}function Xy(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var PC,FC,na,WC,Ju=b(()=>{"use strict";PC=2e3,FC=64*1024,na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Hy(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PC),this.pushByteCap=Hy(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=UC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};WC={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function Vy(t,e){t.post("/mailbox/chat/launch",r=>BC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qC(r,e)),t.get("/mailbox/chat/sessions",r=>HC(r,e))}async function BC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Gy.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Xy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Jy(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function qC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Gy.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function HC(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Gy,Ky=b(()=>{"use strict";Ju();Gy=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as JC}from"node:fs";function zy(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Yy(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JC(e.path,{encoding:"utf8"});return Yy(r)}catch{return[]}}function Yy(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var Zy=b(()=>{"use strict"});function Qy(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function sa(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
1622
1622
|
WHERE run_id = ?
|
|
1623
1623
|
AND acknowledged_at IS NULL
|
|
1624
1624
|
AND requires_user = 1
|
|
1625
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var oa=b(()=>{"use strict"});function cy(t,e){t.all("/runtime/*",r=>XC(r.req.raw,e))}async function XC(t,e){try{return Response.json(await GC(t,e))}catch(r){if(r instanceof oe)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function GC(t,e){let r=new URL(t.url),n=eM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ia(t,n.id,s[2]),VC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ia(t,n.id,s[2]);let o=ty(e.dal,s[4]);return ey(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xu(t),e.dal.listTeams().map(o=>QC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=ry(e.dal,ny(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return oy(t,n.id,i.context),sy(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=ry(e.dal,ny(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");oy(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return sy(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ia(t,n.id,s[2]);let o=ty(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return zC(e.dal,o,a),ey(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return bs(t,n.id),e.dal.listWorkflows().map(o=>tM(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){bs(t,n.id);let o=nM(e.dal,s[2]);return rM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){bs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return sM(e.dal,o,i).map(l=>ay(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){bs(t,n.id);let o=iy(e.dal,s[2]);return ay(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){bs(t,n.id);let o=iy(e.dal,s[2]),i=iM(e.dal,o);return{runId:zu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function VC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>uy(t,e,r))}}function ey(t,e,r){let n=uy(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:KC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YC(t,r)}}function uy(t,e,r){let n=dy(t,r.id),s=Vu(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function KC(t,e){let r=dy(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Vu(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function YC(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function zC(t,e,r){let n=ZC(t,e.id);if(n!==null){let s=sa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=wt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function dy(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function ZC(t,e){return 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)[0]??null}function Vu(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function ty(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function ry(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function ny(t){return t.startsWith("team:")?t.slice(5):t}function QC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function sy(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??ly}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function eM(t){let e=t.workspaceName??Rn()??_r.default;return{id:e,name:e}}function Xu(t){if(t.headers.get("x-lmctl-workspace-id")!==ly)throw new oe(400,"runtime request requires global-admin workspace identity")}function ia(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function bs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function oy(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");ia(t,e,r.workspaceId);return}Xu(t)}function Ku(t){return`${bn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function tM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description}}}function rM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function aa(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function nM(t,e){if(!e.startsWith(bn))throw new oe(404,`template not found: ${e}`);let r=e.slice(bn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function iy(t,e){if(!e.startsWith(Gu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function sM(t,e,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),o=t.listWorkflows().filter(a=>Yu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function ay(t,e){let r=t.getWorkflow(e.workflow_id),n=Vu(e),s=oM(r,e);return{id:zu(e),templateId:r===null?`${bn}unknown`:Ku(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function oM(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[aa(t.definition).nameToId.get(r)??r]}function iM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:aa(r.definition),s=c=>n.nameToId.get(c)??c,o=zu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=aM(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function aM(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var ly,bn,Gu,oe,fy=b(()=>{"use strict";Ve();oa();Ot();ly="global-admin";bn="template:",Gu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as lM,writeFileSync as cM}from"node:fs";import{randomUUID as my}from"node:crypto";import{dirname as uM,resolve as la,sep as py}from"node:path";async function _y(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!hM(n))return t.text("missing image file",400);if(n.size>dM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=_M(s);if(o===null||!(o in hy))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=fM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?la(pM()):la(i.local_path),l=la(a,"uploads",my()),c=la(l,`${my()}${hy[o]}`);if(!mM(c,a))return t.text("invalid upload path",400);lM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);cM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function fM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function mM(t,e){let r=e.endsWith(py)?e:`${e}${py}`;return t.startsWith(r)}function pM(){return uM(ue())}function hM(t){return typeof File<"u"&&t instanceof File}function _M(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dM,hy,gy=b(()=>{"use strict";Ve();dM=10*1024*1024,hy={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ca}from"node:fs";import{basename as gM,dirname as wM,extname as yM,isAbsolute as EM,join as bM,relative as SM}from"node:path";import{fileURLToPath as TM}from"node:url";import{Hono as kM}from"hono";import{serveStatic as Et}from"@hono/node-server/serve-static";function ky(t){let e=new kM,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):vM();if(t.localWebui!==void 0&&$w(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=IM();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Et({root:n})),e.use("/vendor/*",s,Et({root:n})),e.use("/src/*",s,Et({root:n})),e.get("/",s,Et({root:n,path:"index.html"})),e.get("/admin",s,Et({root:n,path:"index.html"})),e.get("/admin/*",s,Et({root:n,path:"index.html"})),e.get("/terminal",s,Et({root:n,path:"index.html"})),e.get("/terminal/*",s,Et({root:n,path:"index.html"})),e.get("/chat",s,Et({root:n,path:"index.html"})),e.get("/chat/*",s,Et({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",p_()),e.get("/login",s=>s.html(Ae("Login",`
|
|
1625
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var oa=b(()=>{"use strict"});function cw(t,e){t.all("/runtime/*",r=>XC(r.req.raw,e))}async function XC(t,e){try{return Response.json(await GC(t,e))}catch(r){if(r instanceof oe)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function GC(t,e){let r=new URL(t.url),n=eM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ia(t,n.id,s[2]),VC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ia(t,n.id,s[2]);let o=tw(e.dal,s[4]);return ew(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xu(t),e.dal.listTeams().map(o=>QC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=rw(e.dal,nw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return ow(t,n.id,i.context),sw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=rw(e.dal,nw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");ow(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return sw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ia(t,n.id,s[2]);let o=tw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return zC(e.dal,o,a),ew(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return bs(t,n.id),e.dal.listWorkflows().map(o=>tM(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){bs(t,n.id);let o=nM(e.dal,s[2]);return rM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){bs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return sM(e.dal,o,i).map(l=>aw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){bs(t,n.id);let o=iw(e.dal,s[2]);return aw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){bs(t,n.id);let o=iw(e.dal,s[2]),i=iM(e.dal,o);return{runId:zu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function VC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>uw(t,e,r))}}function ew(t,e,r){let n=uw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:KC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YC(t,r)}}function uw(t,e,r){let n=dw(t,r.id),s=Vu(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function KC(t,e){let r=dw(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Vu(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function YC(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function zC(t,e,r){let n=ZC(t,e.id);if(n!==null){let s=sa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=yt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function dw(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function ZC(t,e){return 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)[0]??null}function Vu(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function tw(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function rw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function nw(t){return t.startsWith("team:")?t.slice(5):t}function QC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function sw(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??lw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function eM(t){let e=t.workspaceName??Rn()??_r.default;return{id:e,name:e}}function Xu(t){if(t.headers.get("x-lmctl-workspace-id")!==lw)throw new oe(400,"runtime request requires global-admin workspace identity")}function ia(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function bs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function ow(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");ia(t,e,r.workspaceId);return}Xu(t)}function Ku(t){return`${bn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function tM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description}}}function rM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function aa(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function nM(t,e){if(!e.startsWith(bn))throw new oe(404,`template not found: ${e}`);let r=e.slice(bn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function iw(t,e){if(!e.startsWith(Gu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function sM(t,e,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),o=t.listWorkflows().filter(a=>Yu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function aw(t,e){let r=t.getWorkflow(e.workflow_id),n=Vu(e),s=oM(r,e);return{id:zu(e),templateId:r===null?`${bn}unknown`:Ku(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function oM(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[aa(t.definition).nameToId.get(r)??r]}function iM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:aa(r.definition),s=c=>n.nameToId.get(c)??c,o=zu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=aM(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function aM(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var lw,bn,Gu,oe,fw=b(()=>{"use strict";Ve();oa();Ot();lw="global-admin";bn="template:",Gu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as lM,writeFileSync as cM}from"node:fs";import{randomUUID as mw}from"node:crypto";import{dirname as uM,resolve as la,sep as pw}from"node:path";async function _w(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!hM(n))return t.text("missing image file",400);if(n.size>dM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=_M(s);if(o===null||!(o in hw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=fM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?la(pM()):la(i.local_path),l=la(a,"uploads",mw()),c=la(l,`${mw()}${hw[o]}`);if(!mM(c,a))return t.text("invalid upload path",400);lM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);cM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function fM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function mM(t,e){let r=e.endsWith(pw)?e:`${e}${pw}`;return t.startsWith(r)}function pM(){return uM(ue())}function hM(t){return typeof File<"u"&&t instanceof File}function _M(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dM,hw,gw=b(()=>{"use strict";Ve();dM=10*1024*1024,hw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ca}from"node:fs";import{basename as gM,dirname as yM,extname as wM,isAbsolute as EM,join as bM,relative as SM}from"node:path";import{fileURLToPath as TM}from"node:url";import{Hono as kM}from"hono";import{serveStatic as Et}from"@hono/node-server/serve-static";function kw(t){let e=new kM,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):vM();if(t.localWebui!==void 0&&$y(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=IM();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Et({root:n})),e.use("/vendor/*",s,Et({root:n})),e.use("/src/*",s,Et({root:n})),e.get("/",s,Et({root:n,path:"index.html"})),e.get("/admin",s,Et({root:n,path:"index.html"})),e.get("/admin/*",s,Et({root:n,path:"index.html"})),e.get("/terminal",s,Et({root:n,path:"index.html"})),e.get("/terminal/*",s,Et({root:n,path:"index.html"})),e.get("/chat",s,Et({root:n,path:"index.html"})),e.get("/chat/*",s,Et({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",p_()),e.get("/login",s=>s.html(Ae("Login",`
|
|
1626
1626
|
<h1>Login</h1>
|
|
1627
1627
|
<form method="post" action="/login">
|
|
1628
1628
|
<label>Token <input name="token" type="password"></label>
|
|
1629
1629
|
<button type="submit">Login</button>
|
|
1630
1630
|
</form>
|
|
1631
|
-
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),pw(e,{dal:t.dal}),cy(e,{dal:t.dal}),Aw(e,{dal:t.dal}),Bw(e,{terminalSessionManager:t.terminalSessionManager}),Vw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await lc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Op(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ew(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_y(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uw)),i=Po(t.dal,re(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=yy(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=yy(s.req.query("severity"),Iy);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),MM)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Sn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):B(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=NM(l.path);if(xM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=gM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ua(t.daemon),B(s,i,Ey)):B(s,i,Ey,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ua(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>wy(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vy(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>wy(s,t.dal,o=>{let i=zw(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=wt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=wt(t.dal,o);if(c===null)return s.notFound();let u=Qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ua(t.daemon);let p=Qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return ua(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Cp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),by)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),by)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sy("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,Ty)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,Ty))),e.get("/api/stats/run-throughput",s=>B(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function wy(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return vy(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function vy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ca(`${r}/index.html`))return r;let n=bM(wM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function NM(t){switch(yM(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function xM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(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"}}function $M(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function yy(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function AM(t){if(t!=null)return typeof t=="string"&&Iy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function OM(t){return`<h1>Status</h1><div class="grid">
|
|
1631
|
+
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),py(e,{dal:t.dal}),cw(e,{dal:t.dal}),Ay(e,{dal:t.dal}),By(e,{terminalSessionManager:t.terminalSessionManager}),Vy(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await lc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Op(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ey(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_w(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uy)),i=Po(t.dal,re(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=ww(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=ww(s.req.query("severity"),Iw);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),MM)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Sn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):B(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=xM(l.path);if(NM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=gM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ua(t.daemon),B(s,i,Ew)):B(s,i,Ew,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ua(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>yw(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vw(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>yw(s,t.dal,o=>{let i=zy(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=yt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=yt(t.dal,o);if(c===null)return s.notFound();let u=Qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ua(t.daemon);let p=Qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return ua(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Cp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),bw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),bw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sw("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,Tw)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,Tw))),e.get("/api/stats/run-throughput",s=>B(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function yw(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return vw(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function vw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ca(`${r}/index.html`))return r;let n=bM(yM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function xM(t){switch(wM(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function NM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(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"}}function $M(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function ww(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function AM(t){if(t!=null)return typeof t=="string"&&Iw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function OM(t){return`<h1>Status</h1><div class="grid">
|
|
1632
1632
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
1633
1633
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
1634
1634
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -1648,7 +1648,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1648
1648
|
</fieldset>
|
|
1649
1649
|
</form>
|
|
1650
1650
|
<div id="pause-result" style="margin-top:0.6em;"></div>
|
|
1651
|
-
</section>`}function qM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function
|
|
1651
|
+
</section>`}function qM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Ew(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function HM(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function JM(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function XM(t){let e=`<style>
|
|
1652
1652
|
@keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
|
|
1653
1653
|
tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
|
|
1654
1654
|
tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
|
|
@@ -1662,7 +1662,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1662
1662
|
<dt>submitted_at</dt><dd>${S(t.submitted_at)}</dd>
|
|
1663
1663
|
<dt>last_scanned_at</dt><dd>${S(t.last_scanned_at??"\u2014")}</dd>
|
|
1664
1664
|
<dt>last_known_state</dt><dd>${S(t.last_known_state??"\u2014")}</dd>
|
|
1665
|
-
</dl>`}function
|
|
1665
|
+
</dl>`}function bw(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=jo(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Sw(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function KM(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Tw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function YM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function zM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
|
|
1666
1666
|
<h2>Request-changes rate</h2>
|
|
1667
1667
|
<p>Total: ${S(n.request_changes)} of ${S(n.total)} steps (${S(n.rate_pct)})</p>
|
|
1668
1668
|
${fe(["state","total steps","request_changes","rate"],s)}
|
|
@@ -1671,42 +1671,42 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1671
1671
|
<h2>Retry counts (runs with >1 attempt per state)</h2>
|
|
1672
1672
|
${fe(["state","retried runs","avg attempts"],i)}
|
|
1673
1673
|
<h2>Tool efficacy</h2>
|
|
1674
|
-
${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var jM,
|
|
1674
|
+
${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var jM,Iw,xw=b(()=>{"use strict";vi();an();w_();v_();R_();Ot();mu();Sy();jy();My();qy();Ky();Zy();fw();Ao();gw();Bi();jM=["open","assigned","closed","reopened"],Iw=["low","medium","high","critical"]});function ZM(t){return Math.floor(t/6e4)*6e4}function QM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)eD(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function eD(t,e){let r=Date.now(),n=ZM(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Nw(t,e=250){let r=setInterval(()=>{try{QM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var $w=b(()=>{"use strict"});function rD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
|
|
1675
1675
|
FROM run r
|
|
1676
1676
|
JOIN job j ON j.id = r.job_id
|
|
1677
1677
|
WHERE j.project_id = ?
|
|
1678
1678
|
AND r.terminal_state IS NOT NULL
|
|
1679
1679
|
ORDER BY r.id DESC
|
|
1680
|
-
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,tD).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 Ay(t){for(let e of nD)try{e(t)}catch{}}var tD,jy,nD,Ry=b(()=>{"use strict";tD="request_changes",jy="reviewer_rejection_rate_high";nD=[rD]});function Ss(){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 Oy(t){let e=t.intervalMs??Ss(),r=t.runOnceFn??Rr,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??xy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ly(t.dal,t.monitorSessionActivityFn??cc,e,n).finally(()=>{a=null})),a.finally(()=>u(uc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sD(t.dal,r,t.collectSessionSizesFn??vp,t.scanIntakeFn??fn,t.monitorSessionActivityFn??cc,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 sD(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(sw({dal:t}),Ay({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 Ly(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 Ly(t,e,r,n){let s=uc(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 ed=b(()=>{"use strict";vi();Es();ju();Ao();$y();Ry();dc()});function Cy(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 My=b(()=>{"use strict"});import{mkdirSync as oD,readFileSync as iD,readdirSync as aD,statSync as lD,writeFileSync as cD}from"node:fs";import{dirname as uD,join as Py,sep as Dy}from"node:path";function da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Fy:return dD(t,s.input);case Uy:return fD(t,s.input);case Wy:return mD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:nd,GetObjectCommand:rd,PutObjectCommand:td}}}function dD(t,e){let r=By(t,e.Key);return oD(uD(r),{recursive:!0}),cD(r,e.Body),{}}function fD(t,e){let r=By(t,e.Key),n;try{n=iD(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 mD(t,e){let r=e.Prefix??"";qy(r);let s=pD(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 By(t,e){return qy(e),Py(t,e)}function qy(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pD(t){let e=[],r=(n,s)=>{let o;try{o=aD(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=Py(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Dy==="/"?a:a.split(Dy).join("/");e.push({key:c,lastModified:lD(l).mtime})}}};return r(t,""),e}var Fy,Uy,Wy,td,rd,nd,sd=b(()=>{"use strict";Fy="localfs-put",Uy="localfs-get",Wy="localfs-list",td=class{input;_localfsTag=Fy;constructor(e){this.input=e}},rd=class{input;_localfsTag=Uy;constructor(e){this.input=e}},nd=class{input;_localfsTag=Wy;constructor(e){this.input=e}}});function Hy(){return{put:0,get:0,list:0}}function od(t,e=hD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var hD,fa,ad=b(()=>{"use strict";hD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};fa=class{counts=Hy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Hy(),e}estimateCostUsd(e){return od(this.counts,e)}}});function Jy(t){let e=t.now??Date.now,r=t.timers??_D,n=null,s=null;async function o(){let l=e(),c=id(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=od(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===id(e())}}}var _D,Xy=b(()=>{"use strict";ad();_D={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ld=b(()=>{"use strict";Ki();zi();zi()});function gD(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 wD(t){return t.reply_to!==void 0&&t.response!==void 0}function yD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Gy(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 ma,Ts,Vy=b(()=>{"use strict";ld();ma=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ts=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 ma("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=Ft(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(Gy(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Gy(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 ma;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=gD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(wD(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??yD(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:Ft(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 cd(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 Ky=b(()=>{"use strict"});function ud(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 Yy=b(()=>{"use strict"});function fd(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 dd,zy=b(()=>{"use strict";dd="daemon:events"});function Qy(t){return{kind:"prompt",prompt_id:t.prompt_id??Ft(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function md(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 Zy,pd=b(()=>{"use strict";ld();Zy="prompt:root"});function ks(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ED(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function eE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ED(t);return r===null?!0:Date.now()/1e3>=r-e}function tE(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 hd=b(()=>{"use strict"});async function pa(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":bD},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 bD,_d=b(()=>{"use strict";bD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as rE,mkdirSync as nE,readFileSync as sE,writeFileSync as oE}from"node:fs";import{homedir as iE}from"node:os";import{dirname as aE,join as lE}from"node:path";function vs(){return process.env.LMCTL_DEVICE_AUTH_PATH??lE(iE(),".lmctl","device-auth.json")}function cE(){return process.env.LMCTL_TOKEN_PATH??lE(iE(),".lmctl","cli-tokens.json")}function gd(t=vs()){try{let e=JSON.parse(sE(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 uE(t,e=vs()){nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(t,null,2));try{rE(e,384)}catch{}}function wd(t,e=cE()){let r={};try{r=JSON.parse(sE(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};nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(s,null,2));try{rE(e,384)}catch{}}async function dE(t){let e=t.deviceAuthPath??vs(),r=gd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await pa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return wd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??cE()),{idToken:n.idToken,userId:r.userId}}var yd=b(()=>{"use strict";_d()});function fE(t){if(t.length===0||!t.startsWith("---"))throw new bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1681
|
-
`);if(e[0]!=="---")throw new bt("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 bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.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 ha,SD,bt,mE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as
|
|
1680
|
+
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,tD).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,jw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:jw,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 Aw(t){for(let e of nD)try{e(t)}catch{}}var tD,jw,nD,Rw=b(()=>{"use strict";tD="request_changes",jw="reviewer_rejection_rate_high";nD=[rD]});function Ss(){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 Ow(t){let e=t.intervalMs??Ss(),r=t.runOnceFn??Rr,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??Nw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Lw(t.dal,t.monitorSessionActivityFn??cc,e,n).finally(()=>{a=null})),a.finally(()=>u(uc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sD(t.dal,r,t.collectSessionSizesFn??vp,t.scanIntakeFn??fn,t.monitorSessionActivityFn??cc,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 sD(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(sy({dal:t}),Aw({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 Lw(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 Lw(t,e,r,n){let s=uc(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 ed=b(()=>{"use strict";vi();Es();ju();Ao();$w();Rw();dc()});function Cw(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 Mw=b(()=>{"use strict"});import{mkdirSync as oD,readFileSync as iD,readdirSync as aD,statSync as lD,writeFileSync as cD}from"node:fs";import{dirname as uD,join as Pw,sep as Dw}from"node:path";function da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Fw:return dD(t,s.input);case Uw:return fD(t,s.input);case Ww:return mD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:nd,GetObjectCommand:rd,PutObjectCommand:td}}}function dD(t,e){let r=Bw(t,e.Key);return oD(uD(r),{recursive:!0}),cD(r,e.Body),{}}function fD(t,e){let r=Bw(t,e.Key),n;try{n=iD(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 mD(t,e){let r=e.Prefix??"";qw(r);let s=pD(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 Bw(t,e){return qw(e),Pw(t,e)}function qw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pD(t){let e=[],r=(n,s)=>{let o;try{o=aD(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=Pw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Dw==="/"?a:a.split(Dw).join("/");e.push({key:c,lastModified:lD(l).mtime})}}};return r(t,""),e}var Fw,Uw,Ww,td,rd,nd,sd=b(()=>{"use strict";Fw="localfs-put",Uw="localfs-get",Ww="localfs-list",td=class{input;_localfsTag=Fw;constructor(e){this.input=e}},rd=class{input;_localfsTag=Uw;constructor(e){this.input=e}},nd=class{input;_localfsTag=Ww;constructor(e){this.input=e}}});function Hw(){return{put:0,get:0,list:0}}function od(t,e=hD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var hD,fa,ad=b(()=>{"use strict";hD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};fa=class{counts=Hw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Hw(),e}estimateCostUsd(e){return od(this.counts,e)}}});function Jw(t){let e=t.now??Date.now,r=t.timers??_D,n=null,s=null;async function o(){let l=e(),c=id(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=od(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===id(e())}}}var _D,Xw=b(()=>{"use strict";ad();_D={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ld=b(()=>{"use strict";Ki();zi();zi()});function gD(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function yD(t){return t.reply_to!==void 0&&t.response!==void 0}function wD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Gw(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 ma,Ts,Vw=b(()=>{"use strict";ld();ma=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ts=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 ma("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=Ft(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(Gw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Gw(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 ma;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=gD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yD(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??wD(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:Ft(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 cd(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 Kw=b(()=>{"use strict"});function ud(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 Yw=b(()=>{"use strict"});function fd(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 dd,zw=b(()=>{"use strict";dd="daemon:events"});function Qw(t){return{kind:"prompt",prompt_id:t.prompt_id??Ft(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function md(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 Zw,pd=b(()=>{"use strict";ld();Zw="prompt:root"});function ks(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ED(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function eE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ED(t);return r===null?!0:Date.now()/1e3>=r-e}function tE(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 hd=b(()=>{"use strict"});async function pa(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":bD},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 bD,_d=b(()=>{"use strict";bD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as rE,mkdirSync as nE,readFileSync as sE,writeFileSync as oE}from"node:fs";import{homedir as iE}from"node:os";import{dirname as aE,join as lE}from"node:path";function vs(){return process.env.LMCTL_DEVICE_AUTH_PATH??lE(iE(),".lmctl","device-auth.json")}function cE(){return process.env.LMCTL_TOKEN_PATH??lE(iE(),".lmctl","cli-tokens.json")}function gd(t=vs()){try{let e=JSON.parse(sE(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 uE(t,e=vs()){nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(t,null,2));try{rE(e,384)}catch{}}function yd(t,e=cE()){let r={};try{r=JSON.parse(sE(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};nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(s,null,2));try{rE(e,384)}catch{}}async function dE(t){let e=t.deviceAuthPath??vs(),r=gd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await pa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return yd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??cE()),{idToken:n.idToken,userId:r.userId}}var wd=b(()=>{"use strict";_d()});function fE(t){if(t.length===0||!t.startsWith("---"))throw new bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1681
|
+
`);if(e[0]!=="---")throw new bt("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 bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.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 ha,SD,bt,mE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as KK,renameSync as YK,existsSync as hE}from"node:fs";import{basename as kD,resolve as Tn,dirname as Ed}from"node:path";function ID(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 xD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function ND(t){return/^\s*_SESSION_\s+\S/.test(t)}function $D(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function jD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Sd(t){let e=kD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=TD(t,"utf-8"),r=Ed(Tn(t)),n=Td(e,Sd(t),{baseDir:r,sourcePath:Tn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Tn(r,s.sessiondir));return n}function Td(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
|
|
1682
1682
|
`);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=fE(a)}catch(u){if(u instanceof bt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
|
|
1683
|
-
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(
|
|
1684
|
-
allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,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?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(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 vD.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 St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(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=Tn(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),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(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||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(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 kn(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 kn(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=CD(e);if("error"in r)return await kn(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()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(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??Tr)({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 kn(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 kn(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 CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(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??OD(t)}}async function kn(t,e){let r=wE(e.message),n=e.response===null?null:wE(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 wE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,yE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as NE}from"node:fs";import{dirname as Nd,resolve as ga,join as xE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function Ns(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let N of $)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,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)??ba,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=ya(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ya(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ya(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ya(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 KD(t){try{let e=Ea(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 YD(t){let e=Nd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function ya(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(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 ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??xE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}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 kE({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=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=wn({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 U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);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 fa,$=new Or({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&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({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 Ts({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 N=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Jy({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:N,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=wn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??wa,readIntervalMs:t.readIntervalMs??wa,heartbeatIdleMs:t.heartbeatIdleMs??wa,backoffReadIntervalMs:t.backoffReadIntervalMs??wa});n=new Ts({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:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??xE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(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 tP(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,wa,ba,XD,GD,VD,Is,SE,xd=b(()=>{"use strict";Zi();sd();ad();Xy();Vy();Ky();Yy();zy();pd();Ki();hd();yd();yE();jE=3e3,wa=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=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=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({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+`
|
|
1683
|
+
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(ND(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if($D(d)){s.push(f);continue}if(jD(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!xD(d))continue;let m=ID(d);for(let g of Object.keys(m))if(!pE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
|
|
1684
|
+
allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,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?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(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 vD.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 St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(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=Tn(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),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(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||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(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 kn(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 kn(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=CD(e);if("error"in r)return await kn(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()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(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??Tr)({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 kn(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 kn(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 CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(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??OD(t)}}async function kn(t,e){let r=yE(e.message),n=e.response===null?null:yE(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 yE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,wE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as xE}from"node:fs";import{dirname as xd,resolve as ga,join as NE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function xs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let x of $)if(typeof x=="string"&&x!=="")return x},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,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)??ba,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=wa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=wa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=wa(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 KD(t){try{let e=Ea(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 YD(t){let e=xd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function wa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(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 ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??NE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}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 kE({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=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=yn({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 U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);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 fa,$=new Or({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&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({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 Ts({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 x=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Jw({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:x,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=yn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ya,readIntervalMs:t.readIntervalMs??ya,heartbeatIdleMs:t.heartbeatIdleMs??ya,backoffReadIntervalMs:t.backoffReadIntervalMs??ya});n=new Ts({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:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??NE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(xd(t),{recursive:!0,mode:448}),xE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(xd(t),{recursive:!0,mode:448}),xE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(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 tP(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,ya,ba,XD,GD,VD,Is,SE,Nd=b(()=>{"use strict";Zi();sd();ad();Xw();Vw();Kw();Yw();zw();pd();Ki();hd();wd();wE();jE=3e3,ya=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=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=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({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+`
|
|
1685
1685
|
`)}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+`
|
|
1686
1686
|
`)}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}}}},jd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Rd(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(`
|
|
1687
1687
|
`);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+`
|
|
1688
1688
|
`)}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}})}},Ad=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{uo(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Rd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=OE({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+`
|
|
1689
1689
|
`)}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+`
|
|
1690
1690
|
`)}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+`
|
|
1691
|
-
`)}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}})}}},LE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as
|
|
1691
|
+
`)}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}})}}},LE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as O8,mkdirSync as nP,readFileSync as sP,writeFileSync as oP}from"node:fs";import{homedir as iP}from"node:os";import{dirname as aP,join as lP}from"node:path";function Sa(){return process.env.LMCTL_DEVICE_FILE??lP(iP(),".lmctl","device.json")}function Lr(t=Sa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(sP(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 Od(t=Sa()){let e=Lr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:rP(),created_at:new Date().toISOString()};return nP(aP(t),{recursive:!0}),oP(t,`${JSON.stringify(r,null,2)}
|
|
1692
1692
|
`,{encoding:"utf8",mode:384}),r}var Ld=b(()=>{"use strict"});import*as ME from"node:child_process";function uP(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 Cd(t,e={}){let r=e.spawnSync===void 0&&process.env[dP]==="1",n=e.spawnSync??ME.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ta[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=uP(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 DE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ta).join(", ")})`;let e=cP[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 Ta,cP,dP,PE=b(()=>{"use strict";Ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},cP={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"};dP="LMCTL_SKIP_BINARY_CHECK"});var VE={};ce(VE,{ProviderBinaryPreflightError:()=>ka,__setProviderBinaryCheckForTest:()=>EP,bootstrapAgentRestMailbox:()=>WE,publishRegisteredWorkflowsOnStart:()=>UE,resolveLocalMailboxDir:()=>XE,resolveLocalWebuiDir:()=>JE,resolveServeConfig:()=>BE,runProviderBinaryPreflight:()=>HE,runServe:()=>_P,validateServeArgs:()=>GE});import{randomBytes as fP}from"node:crypto";import{existsSync as mP}from"node:fs";import{homedir as pP}from"node:os";import{isAbsolute as FE,resolve as Md}from"node:path";async function _P(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(hP),0;let r=GE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1693
1693
|
`),2;try{HE(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:bP(t)},o;try{o=BE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
1694
|
-
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),
|
|
1695
|
-
`)}let a=r.noDaemon?void 0:
|
|
1696
|
-
`);let c=await
|
|
1694
|
+
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Cw(n);let i;if(r.localWebui!==void 0){let E=JE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=XE(process.env),{s3:$,commands:x}=da(k);i={webuiDir:E,rootDir:k,s3:$,commands:x},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
|
|
1695
|
+
`)}let a=r.noDaemon?void 0:Ow({dal:n,intervalMs:Ss()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:xs({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)`)+`
|
|
1696
|
+
`);let c=await wP({log:E=>e.stderr.write(`${E}
|
|
1697
1697
|
`)}),u=new na({adapterFactory:LE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
|
|
1698
|
-
`)}),d=Lr()?.device_id,f=
|
|
1698
|
+
`)}),d=Lr()?.device_id,f=kw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:gP(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 WE({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 UE({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}
|
|
1699
1699
|
`),await new Promise(E=>{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(),E()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function gP(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 UE(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)}
|
|
1700
1700
|
`)}}async function WE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await RE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1701
1701
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await AE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1702
1702
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(f_({app:t.app,log:r=>t.io?.stderr.write(`${r}
|
|
1703
1703
|
`)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
|
|
1704
1704
|
`)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
|
|
1705
|
-
`)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function BE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=fP(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${
|
|
1706
|
-
`);return{port:a,apiUrl:d,apiToken:c}}function
|
|
1705
|
+
`)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function BE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=fP(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${yP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
|
|
1706
|
+
`);return{port:a,apiUrl:d,apiToken:c}}function yP(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function wP(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new ra({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function EP(t){qE=t??Cd}function HE(t){let e=Object.keys(Ta),r=qE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${DE(o)}
|
|
1707
1707
|
`);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
|
|
1708
1708
|
`),new ka(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
|
|
1709
|
-
`)}function JE(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=FE(r)?r:Md(process.cwd(),r);return mP(`${n}/index.html`)?n:null}function XE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?FE(e)?e:Md(process.cwd(),e):Md(pP(),".lmctl","local-mailbox")}function bP(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function GE(t,e=process.env){let r=SP(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function SP(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var hP,ka,qE,KE=b(()=>{"use strict";Pe();
|
|
1709
|
+
`)}function JE(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=FE(r)?r:Md(process.cwd(),r);return mP(`${n}/index.html`)?n:null}function XE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?FE(e)?e:Md(process.cwd(),e):Md(pP(),".lmctl","local-mailbox")}function bP(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function GE(t,e=process.env){let r=SP(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function SP(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var hP,ka,qE,KE=b(()=>{"use strict";Pe();xw();ed();Mw();ou();Nd();sd();Hu();Ju();CE();Ld();PE();Ve();hP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
|
|
1710
1710
|
|
|
1711
1711
|
Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
|
|
1712
1712
|
services. Help exits before any port binding or daemon startup.
|
|
@@ -1717,26 +1717,26 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1717
1717
|
local identity. Mailbox store defaults to
|
|
1718
1718
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
1719
1719
|
`;ka=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},qE=Cd});var YE={};ce(YE,{runIntake:()=>kP});async function kP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(TP),0):r==="scan"?vP(n,e):r==="config"?IP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
|
|
1720
|
-
`),1)}async function vP(t,e){let r=F(t,["--project"],["--json"]);if(r.error!==void 0)return
|
|
1720
|
+
`),1)}async function vP(t,e){let r=F(t,["--project"],["--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=N(r,"--project");return G(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return y(e,`project not found: ${n}`);let i=await nu({dal:s,project:o});return q(e,{project_id:o.id,project_name:o.name,...i}),0}return q(e,await fn(s)),0})}async function IP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return y(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=F(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=N(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=N(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return G(e,c=>{let u=c.findProjectByName(r);if(u===null)return y(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return q(e,d),0})}var TP,zE=b(()=>{"use strict";vi();$e();TP=`usage: lmctl intake <scan|config> ...
|
|
1721
1721
|
|
|
1722
1722
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1723
1723
|
intake settings such as enabled state, labels, and issue state filters.
|
|
1724
|
-
`});import{createHash as
|
|
1724
|
+
`});import{createHash as xP}from"node:crypto";import{existsSync as Ns,mkdirSync as NP,readFileSync as QE,realpathSync as $P,writeFileSync as jP}from"node:fs";import{dirname as eb,resolve as tb}from"node:path";function Cr(t){let e=tb(t);return Ns(e)?$P(e):e}function ZE(t,e){let r=eb(e),n=Td(t,Sd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=tb(r,s.sessiondir));return n}function $s(t,e){let r=Cr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Ns(r)&&"upsertRootTeam"in e&&(NP(eb(r),{recursive:!0}),jP(r,n.raw_text,"utf8")),ZE(n.raw_text,r);if(Ns(r)){let s=QE(r,"utf8"),o=ZE(s,r);return"upsertRootTeam"in e&&RP(o)&&OP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Ns(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function rb(t,e,r){let n=Cr(t),s=e.getRootTeam(n);s===null||!Ns(n)||QE(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function RP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=AP)}function OP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:xP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var AP,va=b(()=>{"use strict";Ut();AP=5});import{existsSync as LP}from"node:fs";import{dirname as nb}from"node:path";function DP(t){return CP.test(t)||MP.test(t)}function sb(t){return Ia.test(t)}function js(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ia.test(n)?null:{teamfile:r,alias:n}}function Wt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!sb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Ia.source}).`);let n=Cr(t);if(r===void 0&&!LP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=$s(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=_a(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
|
|
1725
1725
|
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=vd(o,nb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
|
|
1726
1726
|
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??nb(n),isLead:St(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function ur(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=js(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?sb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Ia.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
1727
1727
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(DP(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
|
|
1728
1728
|
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}".
|
|
1729
1729
|
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.
|
|
1730
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CP,MP,Ia,vn=b(()=>{"use strict";Ut();va();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,MP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function ab(t){let e=ob(t.registry,t.fromTeamfile);if(e===void 0)return In(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ib(e,t.fromAlias))return In(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=ob(t.registry,t.toTeamfile);return r===void 0?In(`target team is not registered in policy graph: ${t.toTeamfile}`):ib(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?In(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?In(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:In(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function ob(t,e){return t.teams.find(r=>r.teamfile===e)}function ib(t,e){return t.aliases.some(r=>r===e)}function In(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=b(()=>{"use strict"});import{basename as PP}from"node:path";function db(t,e){let r=new Date(e.now.getTime()-
|
|
1730
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CP,MP,Ia,vn=b(()=>{"use strict";Ut();va();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,MP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function ab(t){let e=ob(t.registry,t.fromTeamfile);if(e===void 0)return In(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ib(e,t.fromAlias))return In(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=ob(t.registry,t.toTeamfile);return r===void 0?In(`target team is not registered in policy graph: ${t.toTeamfile}`):ib(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?In(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?In(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:In(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function ob(t,e){return t.teams.find(r=>r.teamfile===e)}function ib(t,e){return t.aliases.some(r=>r===e)}function In(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=b(()=>{"use strict"});import{basename as PP}from"node:path";function db(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=pb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=WP(e.sender,n),o=BP(e.sender,n);o!==null&&o.teamfile===e.root&&!ub(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=>ub(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<FP;return{stop:l.length>=1&&u,chain:qP(a)}}function fb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=pb(t,r),s=hb(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 xa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cb;let r=Number(e);return!Number.isFinite(r)||r<=0?cb:r}function mb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function UP(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 pb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(UP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function WP(t,e,r={}){let n=new Map;for(let a of e)n.set(Mr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Mr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Mr(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=Mr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function hb(t,e){let r=Mr(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=Mr(l.sender),u=Mr(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 BP(t,e){let r=hb(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ub(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Mr(t){return`${t.teamfile}\0${t.alias}`}function qP(t){return t.map(e=>`${PP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var FP,cb,_b=b(()=>{"use strict";FP=6e4,cb=8*60*60*1e3});var bb={};ce(bb,{parseIdleTimeoutMs:()=>Eb,runChat:()=>JP});async function JP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${yb}
|
|
1731
1731
|
`),t.length===0?2:0;let r=GP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1732
|
-
${
|
|
1732
|
+
${yb}
|
|
1733
1733
|
`),2;if(r.runFlag!==void 0){let f=Number.parseInt(r.runFlag,10);return!Number.isFinite(f)||f<=0||String(f)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
|
|
1734
1734
|
`),2):await G(e,async m=>{let p=m.getRun(f);if(p===null)return e.stderr.write(`error: run ${f}: not found
|
|
1735
|
-
`),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return
|
|
1735
|
+
`),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return y(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=sa(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
|
|
1736
1736
|
`),1;if(h.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
|
|
1737
1737
|
`),2;let g=m.resumeEscalation(h.attention_id,r.prompt);return g.resumed===!0?(e.stdout.write(`run ${f}: escalation resumed (decision: ${r.prompt})
|
|
1738
1738
|
`),0):(e.stderr.write(`error: run ${f}: resumeEscalation failed (${g.reason})
|
|
1739
|
-
`),1)}if(h.kind==="interactive_waiting_operator"){let g=
|
|
1739
|
+
`),1)}if(h.kind==="interactive_waiting_operator"){let g=yt(m,h.attention_id);if(g===null||g.step_id===null)return e.stderr.write(`error: run ${f}: pending interactive_waiting_operator attention has no associated interactive step
|
|
1740
1740
|
`),1;let _=m.resumeInteractive(g.step_id,r.prompt,r.done===!0);return _.resumed===!0?(e.stdout.write(`run ${f}: interactive resumed (step ${g.step_id}${r.done===!0?", done":""})
|
|
1741
1741
|
`),0):(e.stderr.write(`error: run ${f}: resumeInteractive failed (${_.reason})
|
|
1742
1742
|
`),1)}return e.stderr.write(`error: run ${f}: pending attention kind "${h.kind}" is not operator-answerable
|
|
@@ -1754,12 +1754,12 @@ ${wb}
|
|
|
1754
1754
|
`):e.stdout.write(`${m.text}${m.text.endsWith(`
|
|
1755
1755
|
`)?"":`
|
|
1756
1756
|
`}`),m.status==="stalled"?1:0}catch(f){let m=f instanceof Error?f.message:String(f);return o!==null&&await $a(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${m}`:m}),e.stderr.write(`error: ${m}
|
|
1757
|
-
`),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=Eb(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return 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 d,f,m;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>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(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 KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>fb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-
|
|
1758
|
-
`)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=
|
|
1759
|
-
`)}}function
|
|
1757
|
+
`),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=Eb(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return 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 d,f,m;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>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(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 KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>fb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-xa()).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 G(t,o=>{let i=Se(),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;ot(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:Na(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&e1(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&&ot(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:Na(l.current)})),{acquired:!0,lease:c.current??s}):(i&&ot(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:Na(c.current)})),{acquired:!1,current:c.current})}return i&&ot(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:Na(l.current)})),{acquired:!1,current:l.current}})}function Na(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 e1(t,e){return t.holder_pid===null?t.started_at<e:!t1(t.holder_pid)}function t1(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 r1(t,e){try{await G(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)}
|
|
1758
|
+
`)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=wb(e.message),n=e.response===null?null:wb(e.response);try{await G(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){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
1759
|
+
`)}}function wb(t){return t.length<=gb?{text:t,truncated:!1}:{text:t.slice(0,gb),truncated:!0}}function Eb(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function s1(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
1760
1760
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
1761
1761
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
1762
|
-
`)}var HP,gb,
|
|
1762
|
+
`)}var HP,gb,yb,Sb=b(()=>{"use strict";Rt();$e();vn();Ut();ss();lb();va();_b();je();oa();Ot();HP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},gb=256*1024,yb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
1763
1763
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
1764
1764
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
1765
1765
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -1772,8 +1772,8 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
|
|
|
1772
1772
|
`}async function vb(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(Ud({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 h1(l,t);c.kind==="response"?t.io.write(Ud(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(`
|
|
1773
1773
|
`);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(`
|
|
1774
1774
|
`)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
|
|
1775
|
-
`),a.finally(()=>c(1))})})}var f1,m1,p1,Ib=b(()=>{"use strict";Dd();Fd();f1="2025-06-18",m1="lmctl",p1="0.0.1"});var
|
|
1776
|
-
`),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??
|
|
1775
|
+
`),a.finally(()=>c(1))})})}var f1,m1,p1,Ib=b(()=>{"use strict";Dd();Fd();f1="2025-06-18",m1="lmctl",p1="0.0.1"});var Nb={};ce(Nb,{runMcp:()=>g1});async function g1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
1776
|
+
`),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??y1(),o=1;try{let i=s===void 0?Pd({getConfig:()=>null},process.env):Pd(s,process.env);return o=await vb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function y1(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&xb(s))w1(50*r);else if(!xb(s))break}}function xb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function w1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var _1,$b=b(()=>{"use strict";Pe();Fd();Ib();je();Ve();_1=`usage: lmctl mcp
|
|
1777
1777
|
|
|
1778
1778
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
1779
1779
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
@@ -1821,15 +1821,15 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1821
1821
|
WHERE status IN ('open', 'reopened')
|
|
1822
1822
|
AND created_at <= ?
|
|
1823
1823
|
GROUP BY project_id
|
|
1824
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Rs(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${
|
|
1824
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Rs(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${x1(i.oldest_title,40)})`;o.push(ja(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function ja(t,e){let r=v1(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function v1(t,e,r,n){let s=I1(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
|
|
1825
1825
|
SELECT * FROM attention
|
|
1826
1826
|
WHERE acknowledged_at IS NULL
|
|
1827
1827
|
AND created_at >= ?
|
|
1828
1828
|
AND payload LIKE ?
|
|
1829
1829
|
ORDER BY id DESC
|
|
1830
1830
|
LIMIT 1
|
|
1831
|
-
`).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function
|
|
1832
|
-
`),0})}catch(o){return me(e,o)}}function Cb(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var
|
|
1831
|
+
`).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function x1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Lb=b(()=>{"use strict";jb();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Mb={};ce(Mb,{renderSummary:()=>Cb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(N1),0;let r=F(t,[],["--json","--quiet"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await G(e,o=>{let i=Ab(o);return n?q(e,i):s||e.stdout.write(`${Cb(i.findings)}
|
|
1832
|
+
`),0})}catch(o){return me(e,o)}}function Cb(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var N1,Db=b(()=>{"use strict";$e();Lb();N1=`usage: lmctl monitor [--json] [--quiet]
|
|
1833
1833
|
|
|
1834
1834
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
1835
1835
|
issues; emit findings as attentions for the operator/master to handle.
|
|
@@ -1838,17 +1838,17 @@ issues; emit findings as attentions for the operator/master to handle.
|
|
|
1838
1838
|
`),1):(e.stdout.write(`${n.device_id}
|
|
1839
1839
|
`),0)}return r==="login"?await B1(t.slice(1),e):r==="prompt"?await H1(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
1840
1840
|
`),1)}async function B1(t,e){let r=q1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1841
|
-
${Wd}`),2;let n=
|
|
1841
|
+
${Wd}`),2;let n=xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
1842
1842
|
`),1;uE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await pa({region:n.config.region,clientId:n.config.cognitoClientId??ba,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
|
|
1843
1843
|
`),1}let a=ks(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
|
|
1844
|
-
`),1;
|
|
1844
|
+
`),1;yd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Lr()??Od();return e.stdout.write(`logged in as ${r.userId}
|
|
1845
1845
|
device id: ${l.device_id}
|
|
1846
1846
|
mailbox prefix: ${r.userId}/${l.device_id}/
|
|
1847
1847
|
access key stored at ${vs()}
|
|
1848
1848
|
`),0}function q1(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function H1(t,e){let r=J1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1849
|
-
${Wd}`),2;let n=
|
|
1850
|
-
`),1;let s=G1();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await X1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=M1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Lr()?.device_id,u=ks(o)??void 0,d=new Or({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new U1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:P1,GetObjectCommand:D1,PutObjectCommand:F1},selfRole:"browser",onMessage:async()=>{}}),f=
|
|
1851
|
-
`),0}function J1(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function X1(t){let r=await new L1({region:t.region}).send(new C1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function G1(t=process.env.LMCTL_TOKEN_PATH??O1(R1(),".lmctl","cli-tokens.json")){try{return JSON.parse(A1(t,"utf8"))}catch{return null}}var Wd,Fb=b(()=>{"use strict";Ld();
|
|
1849
|
+
${Wd}`),2;let n=xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
1850
|
+
`),1;let s=G1();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await X1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=M1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Lr()?.device_id,u=ks(o)??void 0,d=new Or({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new U1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:P1,GetObjectCommand:D1,PutObjectCommand:F1},selfRole:"browser",onMessage:async()=>{}}),f=Qw({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Zw,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
1851
|
+
`),0}function J1(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function X1(t){let r=await new L1({region:t.region}).send(new C1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function G1(t=process.env.LMCTL_TOKEN_PATH??O1(R1(),".lmctl","cli-tokens.json")){try{return JSON.parse(A1(t,"utf8"))}catch{return null}}var Wd,Fb=b(()=>{"use strict";Ld();Nd();Zi();pd();hd();wd();_d();Wd=`usage: lmctl device <id|init>
|
|
1852
1852
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
1853
1853
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
1854
1854
|
|
|
@@ -1858,21 +1858,21 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
1858
1858
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
1859
1859
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
1860
1860
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
1861
|
-
`});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Ub(n,e,s,!1);case"refresh":return Ub(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return
|
|
1861
|
+
`});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Ub(n,e,s,!1);case"refresh":return Ub(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function z1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?q(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
1862
1862
|
`)+(s.length>0?`
|
|
1863
|
-
`:"")),0}function Z1(t,e,r){let[n]=t;if(n===void 0)return
|
|
1864
|
-
`),0}function Q1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return
|
|
1863
|
+
`:"")),0}function Z1(t,e,r){let[n]=t;if(n===void 0)return y(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
1864
|
+
`),0}function Q1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listTeams();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
1865
1865
|
`)}${s.length>0?`
|
|
1866
|
-
`:""}`),0}function eF(t,e,r){let n=F(t,[]);if(n.error!==void 0)return
|
|
1866
|
+
`:""}`),0}function eF(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))q(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
1867
1867
|
`);for(let a of i)e.stdout.write(`- ${a.alias} ${Ie(a)} ${a.sessionid??"(unseeded)"}
|
|
1868
|
-
`)}return 0}function tF(t,e,r){let n=F(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return
|
|
1869
|
-
`),0}async function Ub(t,e,r,n){let s=F(t,["--alias"]);if(s.error!==void 0)return
|
|
1868
|
+
`)}return 0}function tF(t,e,r){let n=F(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=N(n,"--alias"),a=N(n,"--provider");if(i===void 0||a===void 0)return y(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??V1(pr(),"sessions",o.name,i)});return M(n,"--json")?q(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
1869
|
+
`),0}async function Ub(t,e,r,n){let s=F(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=N(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=rF(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Qg(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Go(f,r),Ko(f);let u=[],d=!1;for(let f of l){let m=await Kr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
|
|
1870
1870
|
|
|
1871
1871
|
${Qr}`:Qr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=en(Ie(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
1872
1872
|
${_}
|
|
1873
1873
|
`);try{await ui({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
1874
1874
|
`)}}}return M(s,"--json")?q(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
1875
|
-
`),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=F(t,["--interpreter","--of"]);if(n.error!==void 0)return
|
|
1875
|
+
`),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=F(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=N(n,"--interpreter"),a=N(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
1876
1876
|
`),0}var K1,Bb=b(()=>{"use strict";Ve();$o();Qn();Ec();Pe();tn();Pc();Bi();$e();bc();K1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
|
|
1877
1877
|
|
|
1878
1878
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
@@ -1880,27 +1880,28 @@ refresh to create/update native provider sessions for team members.
|
|
|
1880
1880
|
|
|
1881
1881
|
Root team registry:
|
|
1882
1882
|
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
1883
|
-
`});var Kb={};ce(Kb,{applyMaxBytes:()=>Aa,renderMessage:()=>Gb,runTail:()=>
|
|
1884
|
-
`),0;let r=F(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return
|
|
1885
|
-
`)}},
|
|
1886
|
-
`),-1}if(
|
|
1887
|
-
`),-1;let
|
|
1888
|
-
`;return t.stdout.write(Aa(
|
|
1883
|
+
`});var Kb={};ce(Kb,{applyMaxBytes:()=>Aa,renderMessage:()=>Gb,runTail:()=>lF});async function lF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${aF}
|
|
1884
|
+
`),0;let r=F(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--lines"),s=N(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?oF:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=M(r,"--watch"),a=N(r,"--watch-interval"),l=a===void 0?iF:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=N(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(N(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await G(e,async p=>cF(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=ur(sF,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=Re(u.teamfile)}catch(h){return y(e,`tail: ${h instanceof Error?h.message:String(h)}`)}let p=St(m);if(p===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let h=Wt(u.teamfile,p.alias);d={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof ge?y(e,h.message):me(e,h)}}else try{let m=Wt(u.teamfile,u.alias);d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?y(e,m.message):me(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await zo(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await qb(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await qb(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
1885
|
+
`)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function qb(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
1886
|
+
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
1887
|
+
`),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${Gb(i[c])}
|
|
1888
|
+
`;return t.stdout.write(n.kind==="bytes"?Aa(l,n.maxBytes):l),i.length-1}function Gb(t){let e=Vb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
|
|
1889
1889
|
`).replace(/\r/g,`
|
|
1890
1890
|
`).split(`
|
|
1891
1891
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
|
|
1892
1892
|
${i.map(a=>` ${a}`).join(`
|
|
1893
|
-
`)}`}async function
|
|
1894
|
-
`).join(""),
|
|
1895
|
-
`,u=_.id;g.length>0&&t.stdout.write(Aa(g,
|
|
1896
|
-
`)}},
|
|
1893
|
+
`)}`}async function cF(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${Xb(d)}
|
|
1894
|
+
`).join("");t.stdout.write(n.kind==="bytes"?Aa(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${Xb(_)}
|
|
1895
|
+
`,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Aa(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
1896
|
+
`)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Aa(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Hb,"utf8");if(n>=e)return Jb(t,e);let s=e-n,o=Jb(t,s);return`${Hb}${o}`}function Jb(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Xb(t){let e=Vb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Vb(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var sF,oF,iF,aF,Hb,Yb=b(()=>{"use strict";tn();$e();vn();Ut();sF={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},oF=4096,iF=2,aF=`usage: lmctl tail [target] [alias]
|
|
1897
1897
|
lmctl tail --session <id> [--provider <name>]
|
|
1898
|
-
lmctl tail --run <id>
|
|
1899
|
-
[--lines N
|
|
1898
|
+
lmctl tail --run <id>
|
|
1899
|
+
[--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
|
|
1900
1900
|
|
|
1901
|
-
Print or watch provider session messages, or follow a managed run timeline
|
|
1902
|
-
|
|
1903
|
-
`
|
|
1901
|
+
Print or watch provider session messages, or follow a managed run timeline.
|
|
1902
|
+
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Hb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
1903
|
+
`});var zb={};ce(zb,{runInfo:()=>mF});function fF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function mF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dF}
|
|
1904
|
+
`),0;let r=F(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=N(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await G(e,async u=>hF(e,u,c,n))}catch(u){return me(e,u)}}let o=ur(uF,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:N(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return _F(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Wt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?y(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await zo(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return pF(e,i,a,l,n)}async function pF(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(a){return y(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(q(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
1904
1905
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
1905
1906
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
1906
1907
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
@@ -1909,7 +1910,7 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
|
|
|
1909
1910
|
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: unknown"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
|
|
1910
1911
|
`),t.stdout.write(` Created: ${i.createdAt}
|
|
1911
1912
|
`),t.stdout.write(` Modified: ${i.modifiedAt}
|
|
1912
|
-
`),0)}async function
|
|
1913
|
+
`),0)}async function hF(t,e,r,n){let s=vr(e,r);if(s===null)return y(t,`health: run ${r}: not found`);let o=zr(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?(q(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}
|
|
1913
1914
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
1914
1915
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
1915
1916
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -1919,59 +1920,59 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
|
|
|
1919
1920
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
1920
1921
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
1921
1922
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
1922
|
-
`),0)}async function
|
|
1923
|
+
`),0)}async function _F(t,e,r){let n;try{n=Re(e)}catch(u){return y(t,`health: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await Nr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
|
|
1923
1924
|
`)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return q(t,{team:n.name,members:s,total:{messageCount:o??null}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
|
|
1924
1925
|
`),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
|
|
1925
|
-
`);for(let u of s){let d=u.lastContext!==void 0?
|
|
1926
|
+
`);for(let u of s){let d=u.lastContext!==void 0?fF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Bd(u.messageCount).padStart(6)} ${d.padStart(12)}
|
|
1926
1927
|
`)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${Bd(o).padStart(6)}
|
|
1927
|
-
`),0}function Bd(t){return t==null?"unknown":String(t)}var dF,
|
|
1928
|
+
`),0}function Bd(t){return t==null?"unknown":String(t)}var uF,dF,Zb=b(()=>{"use strict";tn();$e();vn();Ut();Ot();uF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dF=`usage: lmctl health [target] [alias]
|
|
1928
1929
|
lmctl health <teamfile> # team rollup
|
|
1929
1930
|
lmctl health <sessionid> [--provider <name>]
|
|
1930
1931
|
[--json]
|
|
1931
1932
|
|
|
1932
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var eS={};ce(eS,{runLs:()=>
|
|
1933
|
-
`),0;let r=F(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return
|
|
1933
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var eS={};ce(eS,{runLs:()=>EF});import{resolve as qd}from"node:path";function wF(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 EF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${gF}
|
|
1934
|
+
`),0;let r=F(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=yF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Qb)return y(e,`--limit ${_} exceeds maximum (${Qb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await G(e,async _=>bF(e,_,h,g))}catch(_){return me(e,_)}}let i=SF(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=N(r,"--provider"),c=N(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ec(l?{provider:l}:{})}catch(p){return y(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=wF(f),a==="json")return q(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}.
|
|
1934
1935
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
1935
1936
|
`);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
|
|
1936
1937
|
`);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()}
|
|
1937
|
-
`)}return 0}async function
|
|
1938
|
+
`)}return 0}async function bF(t,e,r,n){let s=Yr(e,{limit:r});if(n==="json")return q(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.
|
|
1938
1939
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
1939
1940
|
`);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}
|
|
1940
|
-
`)}return 0}function
|
|
1941
|
+
`)}return 0}function SF(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 gF,yF,Qb,tS=b(()=>{"use strict";Rt();$e();Ot();gF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
1941
1942
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
1942
1943
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
1943
1944
|
|
|
1944
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,Qb=500});import{existsSync as nS,readFileSync as sS}from"node:fs";import{homedir as
|
|
1945
|
-
`),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,
|
|
1945
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,Qb=500});import{existsSync as nS,readFileSync as sS}from"node:fs";import{homedir as TF}from"node:os";import{dirname as kF,resolve as oS}from"node:path";import{fileURLToPath as vF}from"node:url";function Xd(t,e={}){let r=[],n=NF(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=RF(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: ${rS(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}": `+(Oa??"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: ${rS(i)}`)}return r}function NF(t){if(!t&&Cs)return Cs;let e=new Map,r,n=t??$F();if(!nS(n))return r=`${n} not found`,t||Hd(e),t||(Cs=e),t||(Oa=r),e;let s;try{s=sS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Hd(e),t||(Cs=e),t||(Oa=r),e}for(let[o,i]of Object.entries(IF)){let a=jF(s,i),l=AF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Hd(e),t||(Cs=e),t||(Oa=r),e}function $F(){let t=kF(vF(import.meta.url));return oS(t,"..","..","..","durable-memory","model_selection.md")}function Hd(t){for(let[e,r]of Object.entries(xF))t.set(e,r)}function jF(t,e){let n=new RegExp(`^## ${LF(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 AF(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 RF(t){let e=t??oS(TF(),".config","opencode","opencode.json"),r=Nm();if(!nS(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(sS(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([...OF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function OF(t){if(!Jd(t))return[];let e=Ra(t.provider)??Ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Jd(s))continue;let o=Ra(s.models)??Ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ra(t){return Jd(t)?t:null}function Jd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rS(t){return t.length>0?t.join(", "):"(none)"}function LF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var IF,xF,Cs,Oa,iS=b(()=>{"use strict";Sl();IF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xF={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"]},Cs=null});var Us={};ce(Us,{DEPRECATED_CONNECT_WARNING:()=>fS,GEMINI_PROVIDER_NOTICE:()=>dS,_setLintSessiondirFsOpsForTests:()=>KF,_setSkillFileOpsForTests:()=>VF,_setTeamfileSeedForTests:()=>GF,buildRootTeamRegistrationRow:()=>_S,registerRootTeam:()=>gS,runHire:()=>tU,runLint:()=>eU,runRefresh:()=>rU,runSeed:()=>pS,sha256Text:()=>hS,skillNameFromSource:()=>tf,skillNameFromUrl:()=>hU});import{createHash as CF,randomUUID as MF}from"node:crypto";import{accessSync as DF,constants as aS,existsSync as PF,mkdirSync as FF,readFileSync as Ma,realpathSync as Kd,renameSync as UF,statSync as WF,unlinkSync as BF,writeFileSync as Ps}from"node:fs";import{basename as qF,dirname as Nn,isAbsolute as lS,join as Yd,resolve as dr}from"node:path";function GF(t){mS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Rt(),rc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function VF(t){Ds=t===null?zd:{...zd,...t}}function KF(t){Dr=t===null?Zd:{...Zd,...t}}function YF(t,e){let r=Nn(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dr(i);if(n.has(a))continue;let l=zF(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 zF(t){try{if(Dr.existsSync(t)){if(!Dr.statSync(t).isDirectory())return"ENOTDIR";Dr.accessSync(t,aS.W_OK);return}let e=ZF(t);if(e===void 0)return;if(!Dr.statSync(e).isDirectory())return"ENOTDIR";Dr.accessSync(e,aS.W_OK);return}catch(e){return QF(e)??"permission check failed"}}function ZF(t){let e=t;for(;;){try{if(Dr.existsSync(e))return e}catch{return}let r=Nn(e);if(r===e)return;e=r}}function QF(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 eU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
1946
|
+
`),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,Nn(dr(r))),o=Xd(n.members);o.push(...Tl(n.members,Nn(dr(r)))),o.push(...YF(n.members,dr(r))),n.deprecatedConnectLines.length>0&&o.push(fS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
|
|
1946
1947
|
`);for(let i of n.members)ef([i],e),i.session!==void 0&&i.session.length>0&&i.sessiondir===void 0&&o.push(`${i.alias}: has a sessionid but no sessiondir \u2014 seed will fail; remove the sessionid to re-seed, or set the correct sessiondir.`),i.session!==void 0&&i.session.length<Ms&&o.push(`${i.alias}: sessionid is shorter than ${Ms} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
|
|
1947
1948
|
`);return await G(e,i=>{rb(r,i,a=>e.stderr.write(`${a}
|
|
1948
1949
|
`))}),s.length>0?1:(e.stdout.write(`ok
|
|
1949
|
-
`),0)}async function pS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(
|
|
1950
|
-
`),2;let r=t[0],n=dr(r),s;try{s=Kd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=
|
|
1950
|
+
`),0)}async function pS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
1951
|
+
`),2;let r=t[0],n=dr(r),s;try{s=Kd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=Nn(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=kd(i,o);if(a.length>0){ef(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
|
|
1951
1952
|
`);return 1}ef(i.members,e);for(let E of Xd(i.members))e.stderr.write(`warning: ${E}
|
|
1952
1953
|
`);for(let E of Tl(i.members,o))e.stderr.write(`warning: ${E}
|
|
1953
1954
|
`);let l=i.members.find(E=>E.teamfile===void 0&&E.session!==void 0&&E.session.length>0&&E.sessiondir===void 0);if(l!==void 0)return e.stderr.write(`error: ${l.alias}: has a sessionid but no sessiondir \u2014 the session's location is unknown. Remove the sessionid to re-seed fresh, or set the correct sessiondir.
|
|
1954
|
-
`),1;let c=await
|
|
1955
|
-
`),f=
|
|
1955
|
+
`),1;let c=await dU(i.skillUrls,o,e);if(c!==0)return c;let u=Ma(n,"utf8"),d=u.split(`
|
|
1956
|
+
`),f=sU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ms);for(let E of p)if(!wS(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
|
|
1956
1957
|
`),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Hr("lmctl","lmctl_chat",{warn:$=>e.stderr.write(`${$}
|
|
1957
1958
|
`)});let E=h.sessiondir??o,k=Rc(h.provider,E);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
|
|
1958
1959
|
`):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
|
|
1959
1960
|
`:`.mcp.json installed in ${E}
|
|
1960
1961
|
`)}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ms){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
|
|
1961
|
-
`);continue}let k=E.sessiondir??o,$=await mS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:
|
|
1962
|
-
`),1;let
|
|
1963
|
-
`),1;let A=cS(d[
|
|
1962
|
+
`);continue}let k=E.sessiondir??o,$=await mS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:nU(n,u,i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ms)return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:"; provider did not report a sessionid"}
|
|
1963
|
+
`),1;let x=f.get(E.alias.toLowerCase());if(x===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
|
|
1964
|
+
`),1;let A=cS(d[x],"sessionid",$.sessionId);E.sessiondir===void 0&&(A=cS(A,"sessiondir",o)),d[x]=A,m+=1,Ps(n,d.join(`
|
|
1964
1965
|
`),"utf8"),e.stdout.write(`${E.alias}: seeded ${$.sessionId}
|
|
1965
1966
|
`)}let g=d.join(`
|
|
1966
|
-
`),_=
|
|
1967
|
-
`);let T=new Date().toISOString();return await G(e,E=>{gS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function
|
|
1967
|
+
`),_=uU(g,Kd(n));_!==g&&Ps(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
|
|
1968
|
+
`);let T=new Date().toISOString();return await G(e,E=>{gS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ca),0;let r=F(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Vd(e,r.error,Ca);if(r.positionals.length!==2)return Vd(e,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!aU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=N(r,"--provider");if(o===void 0)return Vd(e,"missing value for --provider",Ca);if(!wS(o))return Be(e,`invalid provider "${o}"`);let i=dr(n),a;try{a=Ma(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(iU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=N(r,"--sessiondir"),c=[`_MEMBER_ alias=${Qd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Qd(l)}`]].join(" "),u=cU(a,c);return Ps(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
1968
1969
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
1969
|
-
`),0}async function
|
|
1970
|
-
`),a=
|
|
1971
|
-
`),"utf8"),pS([s],e))}function hS(t){return
|
|
1970
|
+
`),0}async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Gd),0;let r,n;if(t.length===1){let d=js(t[0]);if(d===null)return e.stderr.write(Gd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Gd),2;let s=dr(r),o;try{o=Ma(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
1971
|
+
`),a=oU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Fs(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[_l],u=Fs(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=lU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ps(s,i.join(`
|
|
1972
|
+
`),"utf8"),pS([s],e))}function hS(t){return CF("sha256").update(t).digest("hex")}function _S(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:hS(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function gS(t,e){let r=_S(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function nU(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
|
|
1972
1973
|
`):"- (no non-Lead members)";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.","","Use only the lmctl_chat MCP tool for member pings and delegation.","Delegation is an ACTION, not a plan: to hand a member a task, actually call lmctl_chat.","On some providers the tool appears only after tool search; if so, 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(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.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 are shell commands. Delegation still uses the lmctl_chat MCP tool.)","","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(`
|
|
1973
|
-
`)}function
|
|
1974
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===e)return!0;return!1}function
|
|
1974
|
+
`)}function sU(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=Fs(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function oU(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)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function iU(t,e){for(let r of t.split(`
|
|
1975
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===e)return!0;return!1}function aU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Fs(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function cS(t,e,r){let n=`${e}=${Qd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Qd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function cU(t,e){let r=t.split(`
|
|
1975
1976
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
|
|
1976
1977
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
1977
1978
|
`),i=r.slice(s).join(`
|
|
@@ -1979,24 +1980,24 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
1979
1980
|
|
|
1980
1981
|
`:""}${e}${i.length>0?`
|
|
1981
1982
|
${i}`:`
|
|
1982
|
-
`}`}function
|
|
1983
|
+
`}`}function uU(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
|
|
1983
1984
|
`),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}
|
|
1984
1985
|
${o}`:`${r}
|
|
1985
1986
|
`:t.length>0?`${r}
|
|
1986
1987
|
${t}`:`${r}
|
|
1987
|
-
`}async function
|
|
1988
|
+
`}async function dU(t,e,r){if(t.length===0)return 0;let n=Yd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await yS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
|
|
1988
1989
|
`);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
|
|
1989
1990
|
${i.body}${i.body.endsWith(`
|
|
1990
1991
|
`)?"":`
|
|
1991
|
-
`}`;try{Ds.mkdirSync(n,{recursive:!0}),
|
|
1992
|
-
`)}return 0}async function
|
|
1992
|
+
`}`;try{Ds.mkdirSync(n,{recursive:!0}),pU(n,i.name,a)}catch(l){return Be(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
|
|
1993
|
+
`)}return 0}async function yS(t,e,r,n,s){if(s>La)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${La}`);let o=await fU(t,e),i=mU(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:tf(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>=La)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${La}`);for(let a of i)await yS(a,o.base,r,n,s+1)}async function fU(t,e){if(e.kind==="https"){if(Ht(t)||!lS(t)){let o=uS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(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(Ht(t)){let o=uS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=lS(t)?t:dr(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Kd(r),s=Ma(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:Nn(n)},text:s}}function uS(t,e){if(Ht(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(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(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(r)}function mU(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(Ht(l)&&!ht(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 xn(t){return new URL(t).href}function pU(t,e,r){let n=Yd(t,`${e}.md`),s=Yd(t,`${e}.${process.pid}.${MF().slice(0,8)}.tmp`);try{Ds.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ds.renameSync(s,n)}catch(o){try{Ds.unlinkSync(s)}catch{}throw o}}function hU(t){return tf(t)}function tf(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(qF(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,HF).replace(/-+$/gu,"")||"skill"}function wS(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
|
|
1993
1994
|
`),1}function Vd(t,e,r){return t.stderr.write(`error: ${e}
|
|
1994
1995
|
${r}`),2}function ef(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_
|
|
1995
1996
|
`),r.provider==="gemini"&&e.stderr.write(`${dS.replace("%s",r.alias)}
|
|
1996
|
-
`)}var Ms,
|
|
1997
|
+
`)}var Ms,HF,La,JF,XF,Ca,Gd,dS,fS,zd,Zd,mS,Ds,Dr,Ws=b(()=>{"use strict";Ut();iS();fo();Xt();ao();$e();va();Ys();ss();vn();Ms=5,HF=80,La=16,JF=`usage: lmctl lint <teamfile.lmctl>
|
|
1997
1998
|
|
|
1998
1999
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
1999
|
-
`,
|
|
2000
|
+
`,XF=`usage: lmctl seed <teamfile.lmctl>
|
|
2000
2001
|
|
|
2001
2002
|
Seed missing or placeholder session ids in an lmctl teamfile by calling each
|
|
2002
2003
|
member's configured native provider.
|
|
@@ -2013,32 +2014,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2013
2014
|
re-seed.
|
|
2014
2015
|
A member cannot refresh its own running session; run the refresh from a
|
|
2015
2016
|
meta-Lead or operator shell outside that sessiondir.
|
|
2016
|
-
`,dS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",zd={mkdirSync:
|
|
2017
|
-
`),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=bS(r);if(!rf(c))throw new Error(`source not found: ${r}`);let d=SS(c).isDirectory()?
|
|
2018
|
-
`),1}let i=bS(n),a=
|
|
2019
|
-
`),1;let l=xU(
|
|
2017
|
+
`,dS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",zd={mkdirSync:FF,writeFileSync:Ps,renameSync:UF,unlinkSync:BF},Zd={existsSync:PF,statSync:WF,accessSync:DF},mS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Rt(),rc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ds=zd,Dr=Zd});var kS={};ce(kS,{runClone:()=>TU});import{existsSync as rf,mkdirSync as _U,readFileSync as gU,readdirSync as yU,statSync as SS,writeFileSync as wU}from"node:fs";import{basename as ES,dirname as EU,extname as bU,join as TS,resolve as bS}from"node:path";async function TU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(SU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2018
|
+
`),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=bS(r);if(!rf(c))throw new Error(`source not found: ${r}`);let d=SS(c).isDirectory()?kU(c):c;s=gU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2019
|
+
`),1}let i=bS(n),a=vU(i,o,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
|
|
2020
|
+
`),1;let l=xU(IU(s));return _U(EU(a),{recursive:!0}),wU(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
2020
2021
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2021
2022
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2022
2023
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
2023
|
-
`),0}function
|
|
2024
|
+
`),0}function kU(t){let e=yU(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 TS(t,e[0])}function vU(t,e,r){if(r.endsWith("/")||rf(t)&&SS(t).isDirectory()){let n=ES(e).endsWith(".lmctl")?ES(e):"team.lmctl";return TS(t,n)}return bU(t)?t:`${t}.lmctl`}function IU(t){return t.split(`
|
|
2024
2025
|
`).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(`
|
|
2025
2026
|
`)}function xU(t){return t.split(`
|
|
2026
2027
|
`).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(`
|
|
2027
|
-
`)}var
|
|
2028
|
+
`)}var SU,vS=b(()=>{"use strict";SU=`usage: lmctl clone <source> <dest>
|
|
2028
2029
|
|
|
2029
2030
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2030
2031
|
|
|
2031
2032
|
Examples:
|
|
2032
2033
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2033
|
-
`});var
|
|
2034
|
+
`});var NS={};ce(NS,{runPlan:()=>LU});import{existsSync as NU,mkdirSync as $U,writeFileSync as jU}from"node:fs";import{basename as IS,extname as xS,join as AU,resolve as RU}from"node:path";async function LU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(OU),0;let r=F(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2034
2035
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2035
2036
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2036
|
-
`),2;let n=
|
|
2037
|
-
`),1):(
|
|
2037
|
+
`),2;let n=RU(r.positionals[0]);$U(n,{recursive:!0});let s=N(r,"--team")??IS(n),o=N(r,"--provider")??"claude",i=AU(n,CU(s));return NU(i)?(e.stderr.write(`error: ${i} already exists.
|
|
2038
|
+
`),1):(jU(i,DU({teamName:MU(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
|
|
2038
2039
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2039
2040
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2040
2041
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2041
|
-
`),0)}function
|
|
2042
|
+
`),0)}function CU(t){return xS(t)?t:`${t}.lmctl`}function MU(t){let e=xS(t);return e?IS(t,e):t}function DU(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
|
|
2042
2043
|
|
|
2043
2044
|
# Lead, you take tasks from the operator. Clarify only when needed,
|
|
2044
2045
|
# then first use lmctl_chat to ping each of your members with a one-line
|
|
@@ -2078,7 +2079,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
|
|
|
2078
2079
|
refreshed or swapped-in agent loses its chat history but NOT what's written
|
|
2079
2080
|
here. When a task is done, record durable project knowledge in durable-memory/
|
|
2080
2081
|
and keep durable-memory/index.md current so any agent can get up to speed fast.
|
|
2081
|
-
`}var
|
|
2082
|
+
`}var OU,$S=b(()=>{"use strict";$e();OU=`usage: lmctl plan [options] <directory>
|
|
2082
2083
|
|
|
2083
2084
|
Generate a starter lmctl team document template for a directory.
|
|
2084
2085
|
|
|
@@ -2093,7 +2094,7 @@ Examples:
|
|
|
2093
2094
|
|
|
2094
2095
|
# Same shape, codex for the Lead and Reviewer2
|
|
2095
2096
|
lmctl plan ./backend --provider codex
|
|
2096
|
-
`});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>
|
|
2097
|
+
`});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>WU});import{spawn as PU}from"node:child_process";import{statSync as FU}from"node:fs";async function WU(t,e){if(t.includes("--help")||t.includes("-h"))return XU(e);let r=F(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(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):N(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=N(r,"--alias"),l=Qy(i,s,a);return"err"in l?y(e,l.err):nf(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):N(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=ur(UU,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await G(e,l=>BU(e,a.teamfile,a.alias,l))}try{return await G(e,async s=>{let o=qU(e,s,r);if(typeof o=="number")return o;let i=N(r,"--alias");return M(r,"--size")?JU(e,s,o,i,M(r,"--json")):HU(e,s,o,i)})}catch(s){return me(e,s)}}async function BU(t,e,r,n){let s;try{s=Wt(e,r,n)}catch(o){return o instanceof ge?y(t,o.message):me(t,o)}oi(t,s.isLead,s.alias,s.provider,s.sessiondir);try{ii(t,Re(e),e)}catch{}return nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function nf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Yo(r))return y(t,`no resume incantation for provider "${r}"`);if(!fh.test(n))return y(t,"refusing to resume: malformed sessionid");let o=kc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=PU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function qU(t,e,r){let n=N(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=di(t,e,N(r,"--project"));return typeof s=="number"?s:fi(t,e,s,void 0)}async function HU(t,e,r,n){let s=mi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):nf(t,{provider:Ie(s),sessionid:o,sessiondir:s.sessiondir})}function AS(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=FU(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 JU(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 y(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=Ie(a),u=null;Yo(c)&&(u=await Nr(l,c));let d=AS(u),f=d.est>Bs;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?en(c,l):null})}if(s)return q(t,{estimate:!0,legend:jS,guide_tokens:Bs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2097
2098
|
`),t.stdout.write(`${jS}
|
|
2098
2099
|
`);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)
|
|
2099
2100
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2101,7 +2102,7 @@ Examples:
|
|
|
2101
2102
|
session yourself:
|
|
2102
2103
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2103
2104
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2104
|
-
`)}return 0}function
|
|
2105
|
+
`)}return 0}function XU(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2105
2106
|
lmctl terminal <teamfile> <alias>
|
|
2106
2107
|
lmctl terminal --run <id> [--alias A]
|
|
2107
2108
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2131,85 +2132,85 @@ Examples:
|
|
|
2131
2132
|
tokens it surfaces the resume incantation so YOU can
|
|
2132
2133
|
open & self-compact. Nothing is ever changed
|
|
2133
2134
|
automatically; ${Bs} is a guide, not a gate.
|
|
2134
|
-
`),0}var
|
|
2135
|
+
`),0}var UU,Bs,jS,OS=b(()=>{"use strict";Pe();tn();$e();Wc();vn();Ut();Xt();ss();oa();UU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,jS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as sf,dirname as DS}from"node:path";function of(t,e){let r=sf(t);for(;;){let n=GU(e,r);if(n!==null)return n;let s=DS(r);if(s===r)return null;r=s}}function GU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Da(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Pa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function af(t){if(t.io.dal!==void 0){let o=LS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(CS(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(Da()||Pa()){let o=ue(),i=pe({path:o}),a=LS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(CS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?FS(t.cwd):VU(t.projectName),r=US(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 rt(`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 PS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Da()||Pa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e;try{e=FS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=US(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 LS(t,e,r){return r!==void 0?t.findProjectByName(r):of(e,t)}function CS(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 VU(t){let e=[];for(let r of Xa())for(let n of WS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function FS(t){let e=KU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Xa())for(let o of WS(s)){let i=sf(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 rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function US(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 rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2135
2136
|
${MS(n)}`):new rt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2136
2137
|
${MS(n)}`)}function MS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2137
|
-
`)}function
|
|
2138
|
-
`),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=
|
|
2138
|
+
`)}function KU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=DS(r);if(n===r)return e;r=n}}function WS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)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 rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>VS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>cW});import{createHash as df,randomUUID as YU}from"node:crypto";import{existsSync as zU,readFileSync as Wa,readdirSync as ZU,writeFileSync as QU}from"node:fs";import{basename as eW,join as tW,resolve as rW}from"node:path";import{pathToFileURL as nW}from"node:url";function ff(t,e){return{source_uri:nW(rW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function HS(t){return df("sha256").update(t).digest("hex")}async function aW(t){let e=await yr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:HS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:HS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return aW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function JS(t){return Ce(t.definition)}function XS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function lW(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 cW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iW),0;try{return r==="run"?await uW(n,e):await G(e,s=>{switch(r){case"load":return pW(n,e,s);case"author":return hW(n,e,s);case"list":return _W(n,e,s);case"sync":return gW(n,e,s);case"export":return yW(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?y(e,s.message):me(e,s)}}async function uW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Fa}
|
|
2139
|
+
`),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=N(r,"--workflow"),o=N(r,"--project"),i=N(r,"--job"),a=N(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 fr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ht(c))return fr(e,Fa);if(tr(c))return BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Mn(c,"remote workflow URLs");return m!==null?y(e,m):BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return fr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return fr(e,Fa);if(i!==void 0&&(o!==void 0||a!==void 0))return fr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=dW(i);if(m===null)return fr(e,`invalid --job: ${i}`);let p=PS({cwd:process.cwd(),io:e});try{let h=await ws({dal:p.dal,job_id:m,worker_id:cf()});return uf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=GS(a,e);if(d===Ba)return 2;let f=af({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(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 ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(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 BS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=GS(o,r);if(l===Ba)return 2;let c,u;try{c=await Ua(t),u=JS(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=XS(u);if(d!==null)return y(r,d);if(c.remote&&!await fW(r,c,u,a))return 1;let f=af({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 ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(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 fr(t,e){return t.stderr.write(`error: ${e}
|
|
2139
2140
|
`),2}function GS(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)}
|
|
2140
2141
|
`),Ba}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2141
|
-
`),Ba):r}function
|
|
2142
|
+
`),Ba):r}function dW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function cf(){return`cli-${process.pid}-${YU().slice(0,8)}`}function uf(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?q(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2142
2143
|
`),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?q(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2143
2144
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2144
2145
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2145
2146
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
2146
|
-
`)),e.status==="failed"?1:0}async function
|
|
2147
|
+
`)),e.status==="failed"?1:0}async function fW(t,e,r,n){let s=lW(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(`
|
|
2147
2148
|
`)+`
|
|
2148
|
-
`),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
|
|
2149
|
-
`),a}function
|
|
2149
|
+
`),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 mW(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
|
|
2150
|
+
`),a}function mW(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 pW(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(tr(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Mn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await Ua(s)}let i;try{i=JS(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?XS(i):null;if(a!==null)return y(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}
|
|
2150
2151
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2151
2152
|
sha256: ${o.source_sha256}
|
|
2152
|
-
`),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qS(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 VS(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
|
|
2153
|
-
`),0}function
|
|
2153
|
+
`),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qS(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 VS(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 hW(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(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 y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Wa(s,"utf8"),a;try{a=Ce(i)}catch(m){return y(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=mf(l);if(c!==null)return y(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{VS(u,qS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qS(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...ff(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:df("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)
|
|
2154
|
+
`),0}function _W(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2154
2155
|
`)}${s.length>0?`
|
|
2155
|
-
`:""}`),0}function
|
|
2156
|
-
`),0}function yW(t,e,r){let n=F(t,["--out"]);if(n.error!==void 0)return
|
|
2157
|
-
`,c=
|
|
2158
|
-
`)):e.stdout.write(l),0}var oW,iW,
|
|
2156
|
+
`:""}`),0}function gW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);ti({swallow:!0});let s=gh(),o=[];try{o=zU(s)?ZU(s).filter(c=>sW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=tW(s,c),d=Wa(u,"utf8"),f;try{f=Ce(d)}catch($){return y(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:eW(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=ff(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),k?i+=1:a+=1}return M(n,"--json")?q(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2157
|
+
`),0}function yW(t,e,r){let n=F(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:oW,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)}
|
|
2158
|
+
`,c=N(n,"--out");return c!==void 0?(QU(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2159
|
+
`)):e.stdout.write(l),0}var sW,oW,iW,Fa,Ba,hf=b(()=>{"use strict";Iu();dn();ni();$c();$e();lf();Ys();Es();sW=[".compound.json",".lmctl"],oW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",iW=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2159
2160
|
|
|
2160
2161
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2161
2162
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2162
2163
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2163
2164
|
remote https:// workflow after a trust prompt.
|
|
2164
|
-
`,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=
|
|
2165
|
-
`)}return 0}function
|
|
2166
|
-
`),0}function
|
|
2165
|
+
`,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=wW[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 wW,KS=b(()=>{"use strict";wW={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 rT={};ce(rT,{initWorkspace:()=>eT,runWorkspace:()=>IW,setWorkspaceProvider:()=>tT});import{copyFileSync as EW,cpSync as bW,existsSync as De,mkdirSync as mr,readdirSync as yf,renameSync as SW,rmSync as qa,statSync as Ha,writeFileSync as TW}from"node:fs";import{spawnSync as kW}from"node:child_process";import{homedir as YS}from"node:os";import{dirname as wf,join as qs}from"node:path";async function IW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(vW),0;switch(r){case"list":return xW(n,e);case"create":return NW(n,e);case"use":return $W(n,e);case"show":return jW(n,e);case"delete":return AW(n,e);case"migrate":return RW(n,e);case"init":return eT(n,e);case"set-provider":return tT(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ZS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=yf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=F(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=ZS();if(M(r,"--json"))return q(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}
|
|
2166
|
+
`)}return 0}function NW(t,e){let r=F(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=vt(n);if(De(s))return y(e,`workspace already exists: ${n} (${s})`);let o=N(r,"--docroot")??Ga(n);mr(s,{recursive:!0}),mr(o,{recursive:!0});let i=Bt(n);mr(wf(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")?q(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2167
|
+
`),0}function $W(t,e){let r=F(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!qe(n))return y(e,`invalid workspace name: ${n}`);if(n!==_r.default&&!De(vt(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Hs();return mr(wf(s),{recursive:!0}),TW(s,`${n}
|
|
2167
2168
|
`),M(r,"--json")?q(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2168
|
-
`),0}function
|
|
2169
|
-
`),0}function
|
|
2170
|
-
`),0):
|
|
2171
|
-
`),Ha(t).isDirectory()?
|
|
2169
|
+
`),0}function jW(t,e){let r=F(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!qe(n))return y(e,`invalid workspace name: ${n}`);let s=ZS().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ha(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(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")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2170
|
+
`),0}function AW(t,e){let r=F(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!qe(n))return y(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===_r.default&&!M(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(Js()===n&&!M(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=vt(n);return De(o)?(qa(o,{recursive:!0,force:!0}),M(r,"--json")?q(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2171
|
+
`),0):y(e,`workspace not found: ${n}`)}function gf(t,e,r){try{SW(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
|
|
2172
|
+
`),Ha(t).isDirectory()?bW(t,e,{recursive:!0}):EW(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function RW(t,e){let r=F(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=M(r,"--json"),s=Va(),o=hr(),i=[],a=(f,m)=>{if(n)q(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2172
2173
|
`);e.stdout.write(f?`migration complete
|
|
2173
2174
|
`:`${m??"nothing to migrate"}
|
|
2174
|
-
`)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=
|
|
2175
|
+
`)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=yf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))gf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(qs(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);mr(o,{recursive:!0});for(let m of c)gf(qs(s,m),qs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{yf(s).length===0&&(qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Of(),d=Hs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(gf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function QS(t,e){return kW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function CW(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 zS(t){return t==="~"?YS():t.startsWith("~/")?qs(YS(),t.slice(2)):t}async function eT(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: ${$n.join(", ")}.`].join(`
|
|
2175
2176
|
`)+`
|
|
2176
|
-
`),0;let s=F(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return
|
|
2177
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2178
|
-
`),2),f,m=
|
|
2179
|
-
`),2;f=m}else{if(!u)return d("--name");for(;;){let
|
|
2177
|
+
`),0;let s=F(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??QS,a=$n.map(x=>_f(x,o)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
|
|
2178
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??CW,u=r.promptLine!==void 0||l,d=x=>(e.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2179
|
+
`),2),f,m=N(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2180
|
+
`),2;f=m}else{if(!u)return d("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),A=x.length===0?"default":x;if(qe(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
|
|
2180
2181
|
`)}}let p=vt(f);if(De(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2181
|
-
`),2;let h,g=
|
|
2182
|
-
`),2;T[
|
|
2183
|
-
`)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(
|
|
2182
|
+
`),2;let h,g=N(s,"--basedir"),_=Ga(f);if(g!==void 0)h=zS(g);else{if(!u)return d("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:zS(x)}let T={};for(let x of["provider1","provider2","provider3"]){let A=N(s,`--${x}`),D=OW[x],C=a.includes(D)?D:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${x} ${A} is not an available provider (available: ${a.join(", ")})
|
|
2183
|
+
`),2;T[x]=A;continue}if(!u)return d(`--${x}`);for(;;){let H=(await c(`${x} (${LW[x]}) [${C}]: `)).trim(),R=H.length===0?C:H;if(a.includes(R)){T[x]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
|
|
2184
|
+
`)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(wf(E),{recursive:!0});let k=pe({path:E});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:E,basedir:h,providers:{...T}};return M(s,"--json")?q(e,$):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2184
2185
|
`),e.stdout.write(` basedir: ${h}
|
|
2185
2186
|
`),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
|
|
2186
2187
|
`),e.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
2187
2188
|
`)),0}async function tT(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${$n.join(", ")}.`].join(`
|
|
2188
2189
|
`)+`
|
|
2189
|
-
`),0;let s=F(t,[]);if(s.error!==void 0)return
|
|
2190
|
+
`),0;let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return y(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
|
|
2190
2191
|
`),2;let c=r.spawn??QS,u=$n.map(p=>_f(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 ${$n.join("|")} first
|
|
2191
2192
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2192
2193
|
`),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=Rn()??_r.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2193
|
-
`),0}var
|
|
2194
|
+
`),0}var vW,$n,OW,LW,nT=b(()=>{"use strict";Pe();KS();$e();Ve();vW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
|
|
2194
2195
|
|
|
2195
2196
|
Manage isolated workspace state directories, active workspace selection,
|
|
2196
2197
|
legacy profile migration, and configured provider slots.
|
|
2197
|
-
`;$n=["claude","codex","gemini","qwen"],
|
|
2198
|
-
`),0}function
|
|
2198
|
+
`;$n=["claude","codex","gemini","qwen"],OW={provider1:"claude",provider2:"codex",provider3:"gemini"},LW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var iT={};ce(iT,{runProject:()=>FW});import{existsSync as MW,statSync as DW}from"node:fs";import{join as oT}from"node:path";async function FW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(PW),0;try{return await G(e,s=>{switch(r){case"create":return VW(n,e,s);case"list":return KW(n,e,s);case"show":return XW(n,e,s);case"status":return GW(n,e,s);case"workflow":return UW(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function UW(t,e,r){let[n,...s]=t;switch(n){case"add":return WW(s,e,r);case"list":return BW(s,e,r);case"show":return qW(s,e,r);case"remove":return HW(s,e,r);case"enable":return sT(s,e,r,!0);case"disable":return sT(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function WW(t,e,r){let n=F(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=N(n,"--condition")??null;if(l!==null)try{sr(l)}catch{return y(e,"invalid --condition JEXL")}let c=JW(N(n,"--params"));if(typeof c=="string")return y(e,c);let u=N(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(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")?q(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2199
|
+
`),0}function BW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?q(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2199
2200
|
`)}${i.length>0?`
|
|
2200
|
-
`:""}`),0}function
|
|
2201
|
-
`),0)}function
|
|
2202
|
-
`),0):
|
|
2203
|
-
`),0)}function
|
|
2204
|
-
`),0}function
|
|
2205
|
-
`),0}function
|
|
2206
|
-
`),0}function
|
|
2201
|
+
`:""}`),0}function qW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=Ef(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(M(n,"--json")?q(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2202
|
+
`),0)}function HW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=Ef(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
|
|
2203
|
+
`),0):y(e,`project workflow not found: ${s}`)}function sT(t,e,r,n){let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let o=Ef(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(M(s,"--json")?q(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2204
|
+
`),0)}function JW(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 Ef(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function XW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(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")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2205
|
+
`),0}function GW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?q(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2206
|
+
`),0}function VW(t,e,r){let n=F(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=N(n,"--owner"),i=N(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(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=N(n,"--local-path")??(l!==null?oT(l,u):void 0),f=N(n,"--workflow"),m=N(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=N(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 y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return y(e,"--test-argv must be valid JSON")}let _=N(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:YW(d)||Zn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:N(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?q(e,E):e.stdout.write(`created project ${E.name}
|
|
2207
|
+
`),0}function KW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2207
2208
|
`)}${s.length>0?`
|
|
2208
|
-
`:""}`),0}function
|
|
2209
|
+
`:""}`),0}function YW(t){try{let e=oT(t,"durable-memory");return MW(e)&&DW(e).isDirectory()}catch{return!1}}var PW,aT=b(()=>{"use strict";$e();an();Qn();PW=`usage: lmctl project <create|list|show|status|workflow>
|
|
2209
2210
|
|
|
2210
2211
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2211
2212
|
per-project workflow bindings and routing conditions.
|
|
2212
|
-
`});import{createHash as
|
|
2213
|
+
`});import{createHash as zW,randomBytes as ZW}from"node:crypto";import{readFile as QW}from"node:fs/promises";function lT(t=new Date,e=ZW(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 eB(t){return zW("sha256").update(t).digest("hex")}async function cT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await QW(n);return{path:r,sha256:eB(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function uT(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 bf=b(()=>{"use strict"});import{spawnSync as dT}from"node:child_process";import{mkdir as Sf,writeFile as fT,readFile as tB,rm as mT}from"node:fs/promises";import{tmpdir as rB}from"node:os";import{dirname as pT,join as Tf}from"node:path";async function hT(t){let e=t.stagingDir??Tf(rB(),`lmctl-diag-${t.ticketId}`),r=Tf(e,`diagnostic-${t.ticketId}`);await Sf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Tf(r,d);if(await Sf(pT(m),{recursive:!0}),typeof f=="string")await fT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await fT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2213
2214
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2214
2215
|
`:`${d.pid}
|
|
2215
2216
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2227,29 +2228,29 @@ per-project workflow bindings and routing conditions.
|
|
|
2227
2228
|
`:`# source=${f}
|
|
2228
2229
|
# tail_lines=${d.tail_lines}
|
|
2229
2230
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2230
|
-
`:""}`)}if(await s("README.md",
|
|
2231
|
-
`)}var _T=b(()=>{"use strict";bf();Xs()});import{spawnSync as
|
|
2232
|
-
`),0;let r=
|
|
2231
|
+
`:""}`)}if(await s("README.md",nB(t)),t.sanitized)for(let d of n){let f=await tB(d.absPath);try{Pf(d.bundlePath,f.toString("utf8"))}catch(m){throw await mT(e,{recursive:!0,force:!0}),m instanceof gr,m}}let i=await cT(n),a=uT({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 Sf(pT(t.outputPath),{recursive:!0});let l=dT("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=dT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await mT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function nB(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(`
|
|
2232
|
+
`)}var _T=b(()=>{"use strict";bf();Xs()});import{spawnSync as sB}from"node:child_process";import{stat as oB}from"node:fs/promises";async function gT(t){try{if(!(await oB(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 iB(t);case"hq":return aB(t)}}function iB(t){let r=sB("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 aB(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 yT=b(()=>{"use strict"});var ET={};ce(ET,{parseDiagnoseArgs:()=>wT,runDiagnose:()=>uB});import{tmpdir as lB}from"node:os";import{join as cB}from"node:path";async function uB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mB()}
|
|
2233
|
+
`),0;let r=wT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2233
2234
|
`),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)
|
|
2234
2235
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2235
|
-
`),2;let n=lT(),s=r.outputPath??
|
|
2236
|
+
`),2;let n=lT(),s=r.outputPath??fB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await G(e,async i=>{let a=await Uf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await hT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof gr)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2236
2237
|
`),2;throw d}let c=await gT({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)}
|
|
2237
2238
|
`):(e.stdout.write(`ticket: ${n}
|
|
2238
2239
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2239
2240
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2240
2241
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2241
|
-
`),1}}function
|
|
2242
|
-
`)}var bT=b(()=>{"use strict";Cn();_T();bf();Xs();
|
|
2242
|
+
`),1}}function wT(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(!dB(o))return`unknown section: ${o} (expected one of ${Gs.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 dB(t){return Gs.includes(t)}function fB(t){return cB(lB(),`lmctl-diag-${t}.tar.gz`)}function mB(){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(`
|
|
2243
|
+
`)}var bT=b(()=>{"use strict";Cn();_T();bf();Xs();yT();Ve();$e()});var NT={};ce(NT,{ATTENTION_STATES:()=>vf,DAEMON_INTERVAL_FAST_MS:()=>kf,REQUIRED_TEAM_ALIASES:()=>TT,chooseDiagnoses:()=>IT,collectEvidence:()=>vT,diagnose:()=>kT,renderReport:()=>xT,runDiagnosePrompt:()=>_B});function kT(t,e){let r=vT(t,e),n=IT(r);return xT(r,n)}function vT(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:Ss(),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=hB(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=TT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function IT(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>kf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${kf}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=>vf.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 xT(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: ${pB(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=>vf.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(`
|
|
2243
2244
|
`)+`
|
|
2244
|
-
`}function
|
|
2245
|
+
`}function pB(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 hB(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function _B(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ST()}
|
|
2245
2246
|
`),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2246
2247
|
`),e.stderr.write(`${ST()}
|
|
2247
2248
|
`),2;let n=r[0];try{return await G(e,s=>(e.stdout.write(kT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2248
2249
|
`),1}}function ST(){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(`
|
|
2249
|
-
`)}var TT,kf,vf,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],kf=3e4,vf=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>
|
|
2250
|
-
`)}catch{}}async function
|
|
2250
|
+
`)}var TT,kf,vf,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],kf=3e4,vf=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>vB});import{appendFileSync as gB,mkdirSync as yB}from"node:fs";import{homedir as wB}from"node:os";import{dirname as EB,join as bB}from"node:path";function AT(){return process.env.LMCTL_INTENT_LOG??bB(wB(),".lmctl","recent-intents.log")}function RT(t){try{let e=AT();yB(EB(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});gB(e,`${r}
|
|
2251
|
+
`)}catch{}}async function vB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(kB),0;let r=F(t,["--project"],["--web","--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=N(r,"--project"),o=M(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):G(e,i=>{let a=IB(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.
|
|
2251
2252
|
`),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.
|
|
2252
|
-
`),1;if(a.kind==="project-not-found")return
|
|
2253
|
+
`),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=xB(i,l,a.source);return o?q(e,c):e.stdout.write(RB(c)),RT({verb:"status",args:t}),0})}function IB(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=of(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function xB(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=NB(t,e.id,TB),a=$B(t,e.id),l=jB(t,e.id,SB);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:AB(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 NB(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 $B(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 jB(t,e,r){return t.db.prepare(`
|
|
2253
2254
|
SELECT r.*, w.name AS workflow_name
|
|
2254
2255
|
FROM run r
|
|
2255
2256
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2257,16 +2258,16 @@ per-project workflow bindings and routing conditions.
|
|
|
2257
2258
|
WHERE j.project_id = ?
|
|
2258
2259
|
ORDER BY r.id DESC
|
|
2259
2260
|
LIMIT ?
|
|
2260
|
-
`).all(e,r)}function
|
|
2261
|
-
`)}var TB,kB,
|
|
2261
|
+
`).all(e,r)}function AB(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 jT(o,100)}}}catch{}return jT(t,100)}function jT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function RB(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(`
|
|
2262
|
+
`)}var SB,TB,kB,LT=b(()=>{"use strict";$e();lf();SB=5,TB=10,kB=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2262
2263
|
|
|
2263
2264
|
Show the current project context, active run, unacked attentions, and recent
|
|
2264
2265
|
runs. Defaults to resolving the project from the current working directory;
|
|
2265
2266
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2266
|
-
`});Ve();Cn();je();import{pathToFileURL as
|
|
2267
|
-
`,"utf8"),$k(r,t)}async function Bk(){let t=await
|
|
2268
|
-
`)}catch{}}var
|
|
2269
|
-
`,If=`${
|
|
2267
|
+
`});Ve();Cn();je();import{pathToFileURL as OB}from"node:url";Ys();Cn();import{mkdirSync as xk,readFileSync as Nk,renameSync as $k,writeFileSync as jk}from"node:fs";import{homedir as Ak}from"node:os";import{dirname as Rk,join as Ok}from"node:path";var Lk="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Ck=60*60*1e3,Mk=1500;function Dk(){let t=process.env.HOME??Ak();return Ok(t,".lmctl",".update-check.json")}function Pk(t){return t.isTTY===!0}function Fk(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 el(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Pk(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Uk(t,e){try{let r=JSON.parse(Nk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Ck)return r.latest}catch{}return null}function Wk(t,e){xk(Rk(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;jk(r,`${JSON.stringify(e)}
|
|
2268
|
+
`,"utf8"),$k(r,t)}async function Bk(){let t=await yr(Lk,{description:"lmctl npm metadata",timeoutMs:Mk}),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 Vf(t,e=[],r={}){try{if(el(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Dk();if(Uk(s,n)!==null)return;let i=await(r.fetchLatest??Bk)();try{Wk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Fk(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2269
|
+
`)}catch{}}var Nf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2270
|
+
`,If=`${Nf}
|
|
2270
2271
|
Setup & status:
|
|
2271
2272
|
status Show current project context, active run, attentions, and recent runs.
|
|
2272
2273
|
diagnose Collect a sanitized troubleshooting bundle, with optional upload.
|
|
@@ -2311,14 +2312,14 @@ Global flags:
|
|
|
2311
2312
|
chain and context.
|
|
2312
2313
|
|
|
2313
2314
|
Run 'lmctl help <command>' for command-specific help.
|
|
2314
|
-
`,CT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function
|
|
2315
|
-
${
|
|
2315
|
+
`,CT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function xf(t,e){return t.stderr.write(`error: ${e}
|
|
2316
|
+
${Nf}Run 'lmctl help' for usage.
|
|
2316
2317
|
`),2}function DT(t,e){return t.stderr.write(`error: unknown command: ${e}
|
|
2317
|
-
${
|
|
2318
|
-
`),1}async function
|
|
2318
|
+
${Nf}Run 'lmctl help' for usage.
|
|
2319
|
+
`),1}async function LB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Jf();try{return await CB(t,e)}finally{Xf(r)}}async function CB(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 xf(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 xf(e,"missing value for --workspace");if(!qe(l))return xf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Hf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
|
|
2319
2320
|
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(If),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(If),0):CT.has(i)?MT(i,[...a,"--help"],e):DT(e,i)}Rf(ue(),e.stderr),Lf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(If),0;Qa()&&e.stderr.write(`[debug] lmctl ${st()} | node ${process.version} | cmd ${s} ${o.join(" ")}
|
|
2320
2321
|
[debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
|
|
2321
|
-
`);try{let i=await MT(s,o,e);return CT.has(s)&&!el(r,e)&&await Vf(e,r),i}catch(i){return
|
|
2322
|
+
`);try{let i=await MT(s,o,e);return CT.has(s)&&!el(r,e)&&await Vf(e,r),i}catch(i){return MB(i,s,o,e)}}function MB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Qa())return n.stderr.write(`error: ${s.message}
|
|
2322
2323
|
`),n.stderr.write(`(re-run with --debug for the full stack trace and context)
|
|
2323
2324
|
`),1;n.stderr.write(`error: ${s.message}
|
|
2324
2325
|
`),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
|
|
@@ -2326,10 +2327,10 @@ ${xf}Run 'lmctl help' for usage.
|
|
|
2326
2327
|
`),s.stack&&n.stderr.write(`${s.stack}
|
|
2327
2328
|
`);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}
|
|
2328
2329
|
`),a.stack&&n.stderr.write(`${a.stack}
|
|
2329
|
-
`),o=a.cause,i+=1}return 1}async function MT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(
|
|
2330
|
+
`),o=a.cause,i+=1}return 1}async function MT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(yc(),ih));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Wc(),Wh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Sb(),bb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>($b(),Nb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Fb(),Pb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Yb(),Kb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Zb(),zb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(tS(),eS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(vS(),kS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>($S(),NS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(OS(),RS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(aT(),iT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(bT(),ET));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>($T(),NT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(LT(),OT));return n(e,r)}case"db":return DB(e,r);default:return DT(r,t)}}function DB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2330
2331
|
|
|
2331
2332
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2332
2333
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2333
2334
|
`),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2334
2335
|
`),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2335
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2336
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===OB(process.argv[1]).href){let t=await LB(process.argv.slice(2));process.exitCode=t}export{LB as runCli};
|