@lmctl-ai/lmctl 0.1.34 → 0.1.36
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 +252 -251
- package/examples/opencode.json +6 -0
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var bT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)bT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Cr,readdirSync as ST,readFileSync as TT}from"node:fs";import{homedir as kT,platform as
|
|
2
|
-
`)}function Pa(){return St(ur(),$T)}function
|
|
3
|
-
`)}var vT,
|
|
1
|
+
var bT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)bT(t,r,{get:e[r],enumerable:!0})};import{existsSync as Cr,readdirSync as ST,readFileSync as TT}from"node:fs";import{homedir as kT,platform as hf}from"node:os";import{join as St}from"node:path";function ur(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:St(kT(),vT)}function vn(){return St(ur(),_f)}function dr(){return St(ur(),IT)}function Tt(t){return St(dr(),t)}function Ft(t){return St(Tt(t),_f)}function Ma(){let t=[],e=new Set,r=o=>{Cr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:vn(),kind:"legacy"});let n=dr();if(!Cr(n))return t;let s;try{s=ST(n)}catch{return t}for(let o of s.sort())qe(o)&&r({workspace_name:o,db_path:Ft(o),kind:"workspace"});return t}function Da(t){return St(Tt(t),"projects")}function Ds(){return St(ur(),xT)}function qe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function Ps(){let t=Ds();if(!Cr(t))return null;try{let e=TT(t,"utf8").trim();return e.length===0||!qe(e)?null:e}catch{return null}}function In(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&qe(t)?t:Ps()}function ce(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=In();if(e!==null)return Ft(e);let r=vn();return Cr(r)||!Cr(dr())?r:Ft(gf)}function NT(t,e=hf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function wf(t,e=process.stderr,r=hf()){NT(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
|
+
`)}function Pa(){return St(ur(),$T)}function yf(){return St(ur(),jT)}function AT(){try{return Cr(Pa())}catch{return!1}}function Ef(t=process.stderr){AT()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
|
|
3
|
+
`)}var vT,_f,IT,xT,gf,$T,jT,fr,Ve=E(()=>{"use strict";vT=".lmctl",_f="state.db",IT="workspaces",xT="active-workspace",gf="default",$T="profiles",jT="active-profile";fr={default:gf}});function CT(t){for(let e of LT)if(t.startsWith(e))return!0;if(t.startsWith("172.")){let e=Number(t.split(".")[1]);if(Number.isFinite(e)&&e>=16&&e<=31)return!0}return!!t.startsWith("169.254.")}function MT(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function FT(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function xn(t){let e=t;for(let{re:r,replacement:n}of OT)e=e.replace(r,n);return e=e.replace(DT,r=>!FT(r)||CT(r)?r:bf),e=e.replace(PT,r=>MT(r)?r:bf),e}function $n(t){return t.split(`
|
|
4
4
|
`).map(e=>xn(e)).join(`
|
|
5
|
-
`)}function
|
|
5
|
+
`)}function Tf(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:rt}:{key:t,value:xn(e)}}function Ut(t){if(typeof t=="string")return xn(t);if(Array.isArray(t))return t.map(e=>Ut(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?rt:Ut(n):e[r]=Ut(n)}return e}return t}function kf(t,e){for(let{name:r,re:n}of UT){let s=e.match(n);if(s!==null&&!s[0].includes(rt))throw new mr(t,r)}}var rt,RT,bf,Sf,OT,LT,DT,PT,UT,mr,Fs=E(()=>{"use strict";rt="[REDACTED]",RT="[REDACTED_EMAIL]",bf="[REDACTED_IP]",Sf="[USER]",OT=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${rt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${rt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${rt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:rt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:rt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:rt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:rt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${rt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Sf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Sf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:RT}],LT=["127.","10.","192.168.","0.0.0.0"];DT=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,PT=/\b(?:[0-9a-fA-F]{1,4}:){2,7}(?::[0-9a-fA-F]{1,4})+\b|\b(?:[0-9a-fA-F]{1,4}:){3,7}[0-9a-fA-F]{1,4}\b|::1\b|::\b(?=[\s,;"')]|$)/g;UT=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],mr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Fa}from"node:child_process";import{readFileSync as WT}from"node:fs";import{readFile as Wa,stat as vf}from"node:fs/promises";import{homedir as BT}from"node:os";import{join as qT}from"node:path";import{fileURLToPath as HT}from"node:url";function nt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(WT(HT(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function If(t){let e=new Set(t.include??Us),r={};return e.has("serve")&&(r.serve=await XT(t)),e.has("db")&&(r.db=GT(t)),e.has("runs")&&(r.runs=VT(t)),e.has("jobs")&&(r.jobs=KT(t)),e.has("attentions")&&(r.attentions=zT(t)),e.has("env")&&(r.env=await YT(t)),e.has("intents")&&(r.intents=await QT(t)),r}async function XT(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await Wa(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await Wa(r,"utf8")).split(`
|
|
6
6
|
`),f=d.slice(Math.max(0,d.length-n));c=f.length,a=$n(f.join(`
|
|
7
7
|
`))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:o,pid_alive:i,log_tail_lines:c,log_tail:a,log_note:l}}function GT(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
|
|
8
8
|
`)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function VT(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${Ua} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${Ua} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Ua} FROM run
|
|
9
9
|
WHERE terminal_state IS NULL
|
|
10
10
|
AND started_at < ?
|
|
11
11
|
ORDER BY started_at ASC LIMIT 50`,s);return{last_50:Ut(o),stale:Ut(a),paused:Ut(i)}}function KT(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:i,c:a}of r)i==="queued"?n.pending+=a:i==="running"?n.running+=a:i==="done"||i==="succeeded"?n.done+=a:i==="failed"?n.failed+=a:i==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),o=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(i=>i.id),running_ids:o.map(i=>i.id)}}function zT(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
|
|
12
|
-
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Ut(r)}}async function YT(t){let e=nt(),r=process.version,n=Fa("uname",["-a"],{encoding:"utf8"}),s=$n((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await
|
|
13
|
-
`)),c=[];for(let u of JT){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(
|
|
12
|
+
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Ut(r)}}async function YT(t){let e=nt(),r=process.version,n=Fa("uname",["-a"],{encoding:"utf8"}),s=$n((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await vf(i);let u=Fa("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await vf(a);let u=Fa("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":$n(o.join(`
|
|
13
|
+
`)),c=[];for(let u of JT){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Tf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function ZT(){return process.env.LMCTL_INTENT_LOG??qT(BT(),".lmctl","recent-intents.log")}async function QT(t){let e=t.intentLog??ZT(),r=t.intentLogTailLines??500;try{let s=(await Wa(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:$n(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 Us,JT,Ua,jn=E(()=>{"use strict";Fs();Us=["serve","db","runs","jobs","attentions","env","intents"];JT=["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"];Ua=["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 ek,appendFileSync as tk,mkdirSync as rk,existsSync as AB,readdirSync as RB,unlinkSync as OB}from"node:fs";import{join as
|
|
16
|
-
`)}catch{}}function ak(){if(!Ws){let e=ik().slice(0,13).replace("T","-");Ws
|
|
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}var Ba,
|
|
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 Us,JT,Ua,jn=E(()=>{"use strict";Fs();Us=["serve","db","runs","jobs","attentions","env","intents"];JT=["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"];Ua=["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 ek,appendFileSync as tk,mkdirSync as rk,existsSync as AB,readdirSync as RB,unlinkSync as OB}from"node:fs";import{join as jf,dirname as nk}from"node:path";import{homedir as Nf}from"node:os";function Af(){Ba=!0,process.env.LMCTL_DEBUG="1"}function Re(){if(Ba)return!0;let t=Date.now();return t-$f>=sk&&(xf=lk(),$f=t),xf}function ik(){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 Wt(t,e){if(e?.verbose){if(!Ba)return}else if(!e?.always&&!Re())return;try{ak();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};tk(Ws,JSON.stringify(r)+`
|
|
16
|
+
`)}catch{}}function ak(){if(!Ws){let e=ik().slice(0,13).replace("T","-");Ws=jf(Nf(),".lmctl",`debug-${e}.log`)}rk(nk(Ws),{recursive:!0})}function ft(...t){Wt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){Wt(t,{always:!0})}function lk(){try{let t=ek(ok,"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}var Ba,xf,$f,sk,ok,Ws,Oe=E(()=>{"use strict";Ba=!1,xf=!1,$f=0,sk=5e3,ok=jf(Nf(),".lmctl","config.toml");Ws=null});function mt(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Bt(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Nn(t,e){return!Bt(t)||mt(t)?null:`${e} must use https://: ${t}`}async function pr(t,e){let r=Nn(t,e.description);if(r!==null||!mt(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 Rf(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 Rf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Rf(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 Bs=E(()=>{"use strict"});import{existsSync as vk}from"node:fs";import{createRequire as Ik}from"node:module";function xk(){return Ha===null&&(Ha=Ik(import.meta.url)("node:sqlite").DatabaseSync),Ha}function Ja(t){return t.length===1&&$k(t[0])?[t[0]]:t}function $k(t){if(!Va(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Va(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ha,Xa,qs,Ga,Ka=E(()=>{"use strict";Ha=null;Xa=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!vk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(xk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Ga(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)}}},qs=Xa,Ga=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Ja(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Ja(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Ja(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Va(e)?Object.values(e):Va(e)?{...e}:e}}});import{existsSync as jk,mkdirSync as Nk,readFileSync as Ak}from"node:fs";import{homedir as Rk}from"node:os";import{dirname as Lf,join as Ok,resolve as Cf}from"node:path";import{fileURLToPath as Lk,pathToFileURL as Ck}from"node:url";function Ya(t){t.dbPath!==":memory:"&&Nk(Lf(t.dbPath),{recursive:!0});let e=new qs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Df(e);return r===0&&(e.exec(Ak(Mk,"utf8")),e.pragma(`user_version = ${za}`)),Pk(e,r),e}function Pk(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,
|
|
@@ -454,9 +454,9 @@ var bT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
454
454
|
ORDER BY id ASC;
|
|
455
455
|
DROP TABLE team_connection;
|
|
456
456
|
ALTER TABLE team_connection_v37 RENAME TO team_connection;
|
|
457
|
-
`),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&($e(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),jk(Dk)}function $e(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Fk(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function
|
|
458
|
-
`)}finally{t.close()}}});function Mr(t){return typeof t=="string"&&Wk.has(t)}function
|
|
459
|
-
`)}var
|
|
457
|
+
`),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&($e(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),jk(Dk)}function $e(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Fk(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Df(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function Uk(){return process.env.LMCTL_DB??Ok(Rk(),".lmctl","state.db")}var Mf,Mk,Dk,za,Za=E(()=>{"use strict";Ka();Mf=Lf(Lk(import.meta.url)),Mk=Cf(Mf,"schema.sql"),Dk=Cf(Mf,"migrations"),za=38;if(process.argv[1]&&import.meta.url===Ck(process.argv[1]).href){let t=Ya({dbPath:process.argv[2]??Uk()});try{process.stdout.write(`migrated user_version=${Df(t)}
|
|
458
|
+
`)}finally{t.close()}}});function Mr(t){return typeof t=="string"&&Wk.has(t)}function Uf(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${Hs[0]}`,` STANCE: ${Hs[1]}`,` STANCE: ${Hs[2]}`,` STANCE: ${Pf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
459
|
+
`)}var Pf,Hs,Wk,An,Ff,Qa,Js,Rn=E(()=>{"use strict";Pf="other",Hs=["not_enough_information","dont_know","other_work"],Wk=new Set([Pf,...Hs]),An="@abort",Ff="invalid_decision",Qa="escalation_aborted",Js="workflow_escalation"});import{randomUUID as Bk}from"node:crypto";function ke(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function pe(t){return new el(Ya({dbPath:t.path}))}function Wf(t,e,r){let n=Bf(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Bf(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function Bf(t){let e=qk(t),r=e===null?null:Hk(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))tl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function qk(t){try{let e=JSON.parse(t);return tl(e)?e:null}catch{return null}}function Hk(t,e){let r=t[e];return tl(r)?r:null}function tl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jk(t){return{insertWorkflow:t.prepare(`
|
|
460
460
|
INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
|
|
461
461
|
VALUES (?, ?, ?, ?, ?)
|
|
462
462
|
`),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
|
|
@@ -909,10 +909,10 @@ var bT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
909
909
|
AND sender_teamfile = ?
|
|
910
910
|
AND sender_alias = ?
|
|
911
911
|
AND active_count > 1
|
|
912
|
-
`),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function Xk(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var el,Pe=E(()=>{"use strict";Za();Rn();el=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Jk(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)=>Xk("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!==Js)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!==An&&!a.includes(n))return{resumed:!1,reason:Pf};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=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{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"),o}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){Uf(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,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());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){Uf(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,D());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,D())}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,D());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,D()),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,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),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,D());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,D());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,D(),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,D());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",D());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,D());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=D(),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,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),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,D(),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,D(),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=D();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,D(),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,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Bk(),s=D();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=D(),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,D())}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??D(),e.dedupe_key??null,e.concurrency_key??null,D());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=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),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:D();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,D()),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,D()),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??D(),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,D());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=D(),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,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),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,D(),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,D())}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,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),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??D(),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,D());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,D()).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,D()),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,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();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??D());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,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as Gk}from"node:fs";import{resolve as Vk}from"node:path";function rl(t){let e=Vk(t);try{return Gk(e)}catch{return e}}var Bf=E(()=>{"use strict"});import{platform as qf}from"node:os";function pt(t){let e=new On;for(let r of t)e.registerAdapter(r);return e}var On,nl=E(()=>{"use strict";Bf();On=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=rl(e.workspace);o=o.filter(a=>rl(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=qf()==="darwin"||qf()==="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 Hf}from"node:fs";import{createInterface as Jf}from"node:readline";import{stat as Kk}from"node:fs/promises";import{homedir as zk}from"node:os";async function*Fe(t){let e=Hf(t,{encoding:"utf-8"}),r=Jf({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=Hf(t,{encoding:"utf-8"}),s=Jf({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 ve(t){let e=await Kk(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ue(t){return t.replace(/\\n/g,`
|
|
913
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Se,qt=E(()=>{"use strict";Se=zk()});import{readdir as Xs,stat as Xf,unlink as Yk}from"node:fs/promises";import{join as Dr,basename as Gf}from"node:path";function Zk(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Qk(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ue(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 Vf(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 Gs,Kf=E(()=>{"use strict";qt();Gs=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Dr(Se,".claude"),this.projectsDir=Dr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Xs(this.projectsDir)}catch{return e}for(let n of r){let s=Dr(this.projectsDir,n);if(!(await Xf(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Xs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Gf(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Dr(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 ve(e),o="",i,a,l,c,u,d;for(let m of n)if(!Zk(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=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await Vf(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 ve(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:Qk(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=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ue(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let S=typeof T.content=="string"?ue(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:S,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:ue(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 Vf(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 Yk(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Xs(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Dr(this.projectsDir,i);if(!(await Xf(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Xs(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Gf(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Dr(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 Vs(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function tv(t,e,r){if(!r)return"";let n=t.tools[e]??sl[e],s=n?.profiles?.[r]?.flags??sl[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 zf(t,e){return!!t.tools[e]}function Yf(t,e,r,n,s){let o=t.tools[e]??sl[e],i;if(o?.agent){let l=Vs(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=ev[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(Vs).join(" ");i=`printf '%s\\n' ${Vs(n)} | ${u}`}else i=c.map(Vs).join(" ")}let a=tv(t,e,s);return a&&(i+=" "+a),i}var sl,ev,Zf=E(()=>{"use strict";sl={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:""}}}},ev={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 Qf(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 em=E(()=>{"use strict"});var rv,Ie,Ks,kt=E(()=>{"use strict";rv="ACK: waiting for explicit lmctl task.",Ie=`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: ${rv}`,Ks=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as tm}from"node:child_process";import{mkdirSync as nv}from"node:fs";var ol,Ae,Ht=E(()=>{"use strict";Zf();em();kt();ol=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ae=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===Ie?r:n)}seed(e,r){return nv(e,{recursive:!0}),new Promise(n=>{let s;try{s=tm(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}
|
|
914
|
-
`: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:Ks,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&
|
|
915
|
-
`)}function Fr(t,e){let r=av[t];if(r)return r[e]??r.yolo}function cv(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 Jt(t,e,r="yolo"){if(lv.has(t)){
|
|
912
|
+
`),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function Xk(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var el,Pe=E(()=>{"use strict";Za();Rn();el=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Jk(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)=>Xk("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!==Js)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!==An&&!a.includes(n))return{resumed:!1,reason:Ff};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=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{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"),o}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){Wf(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,D()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,D());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){Wf(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,D());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,D())}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,D());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,D()),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,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(D(),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,D());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,D());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,D(),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,D());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",D());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,D());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=D(),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,D(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,D(),e)??null}closeIssue(e,r,n){let s=D(),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,D(),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,D(),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=D();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,D(),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,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Bk(),s=D();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=D(),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,D())}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??D(),e.dedupe_key??null,e.concurrency_key??null,D());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=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=D(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=D(),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:D();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,D()),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,D()),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??D(),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,D());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=D(),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,D(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(D(),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,D(),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,D())}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,D());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,D(),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??D(),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,D());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,D()).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,D()),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,D());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=D();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??D());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,D())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,D())}}});import{realpathSync as Gk}from"node:fs";import{resolve as Vk}from"node:path";function rl(t){let e=Vk(t);try{return Gk(e)}catch{return e}}var qf=E(()=>{"use strict"});import{platform as Hf}from"node:os";function pt(t){let e=new On;for(let r of t)e.registerAdapter(r);return e}var On,nl=E(()=>{"use strict";qf();On=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=rl(e.workspace);o=o.filter(a=>rl(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=Hf()==="darwin"||Hf()==="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 Jf}from"node:fs";import{createInterface as Xf}from"node:readline";import{stat as Kk}from"node:fs/promises";import{homedir as zk}from"node:os";async function*Fe(t){let e=Jf(t,{encoding:"utf-8"}),r=Xf({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=Jf(t,{encoding:"utf-8"}),s=Xf({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 ve(t){let e=await Kk(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ue(t){return t.replace(/\\n/g,`
|
|
913
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Se,qt=E(()=>{"use strict";Se=zk()});import{readdir as Xs,stat as Gf,unlink as Yk}from"node:fs/promises";import{join as Dr,basename as Vf}from"node:path";function Zk(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Qk(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ue(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 Kf(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 Gs,zf=E(()=>{"use strict";qt();Gs=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Dr(Se,".claude"),this.projectsDir=Dr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Xs(this.projectsDir)}catch{return e}for(let n of r){let s=Dr(this.projectsDir,n);if(!(await Gf(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Xs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Vf(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Dr(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 ve(e),o="",i,a,l,c,u,d;for(let m of n)if(!Zk(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=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await Kf(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 ve(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:Qk(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=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:ue(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let S=typeof T.content=="string"?ue(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:S,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:ue(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 Kf(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 Yk(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Xs(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Dr(this.projectsDir,i);if(!(await Gf(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Xs(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Vf(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Dr(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 Vs(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function tv(t,e,r){if(!r)return"";let n=t.tools[e]??sl[e],s=n?.profiles?.[r]?.flags??sl[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 Yf(t,e){return!!t.tools[e]}function Zf(t,e,r,n,s){let o=t.tools[e]??sl[e],i;if(o?.agent){let l=Vs(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=ev[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(Vs).join(" ");i=`printf '%s\\n' ${Vs(n)} | ${u}`}else i=c.map(Vs).join(" ")}let a=tv(t,e,s);return a&&(i+=" "+a),i}var sl,ev,Qf=E(()=>{"use strict";sl={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:""}}}},ev={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 em(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 tm=E(()=>{"use strict"});var rv,Ie,Ks,kt=E(()=>{"use strict";rv="ACK: waiting for explicit lmctl task.",Ie=`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: ${rv}`,Ks=`send this exact lmctl seed instruction: "${Ie}"`});import{spawn as rm}from"node:child_process";import{mkdirSync as nv}from"node:fs";var ol,Ae,Ht=E(()=>{"use strict";Qf();tm();kt();ol=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ae=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===Ie?r:n)}seed(e,r){return nv(e,{recursive:!0}),new Promise(n=>{let s;try{s=rm(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}
|
|
914
|
+
`: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:Ks,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Yf(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 ol("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=Zf(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=em(r.env),c=rm(s,{shell:!0,cwd:r.cwd,env:r.env,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 Ys(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new It(t,r,e)}var Ke,ye,vt,zs,It,Pr=E(()=>{"use strict";Ke=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Ke{},vt=class extends Ke{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},zs=class extends Ke{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},It=class extends Ke{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as al from"node:child_process";function ov(t){if(typeof al.spawnSync=="function")try{al.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function nm(t){return t.exitCode!==null||t.signalCode!==null}function il(t,e){return nm(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 st(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??ov;if(nm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await il(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await il(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await il(t,sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var sv,Zs=E(()=>{"use strict";sv=1e3});function sm(t){Re()&&process.stderr.write(`[debug] ${t}
|
|
915
|
+
`)}function Fr(t,e){let r=av[t];if(r)return r[e]??r.yolo}function cv(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 Jt(t,e,r="yolo"){if(lv.has(t)){sm(`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"?Fr(t,"plan"):iv[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 ye(s)}if(!cv(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 ye(o)}sm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var iv,av,lv,Ln=E(()=>{"use strict";Pr();Oe();iv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},av={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"]}};lv=new Set(["codex","opencode"])});import{spawn as uv}from"node:child_process";import{existsSync as dv}from"node:fs";function mv(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(`
|
|
916
916
|
|
|
917
917
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
918
918
|
|
|
@@ -920,22 +920,22 @@ var bT=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{f
|
|
|
920
920
|
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:
|
|
921
921
|
${e}
|
|
922
922
|
|
|
923
|
-
${r}`:r}function
|
|
923
|
+
${r}`:r}function om(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||fv[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=Fr(s,a)??gv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Jt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!dv(e.cwd))return z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=uv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,z({event:"transport_abort",provider:s,phase:"pre_spawn"}),st(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,z({event:"transport_abort",provider:s}),st(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=pv({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(`
|
|
924
924
|
`);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 ye(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(ft(`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(_v({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
|
|
925
|
-
`),ft(`stream-json: prompt sent (${t.length} chars)`)})}var fv,gv,
|
|
925
|
+
`),ft(`stream-json: prompt sent (${t.length} chars)`)})}var fv,gv,im=E(()=>{"use strict";Pr();Zs();Ln();Oe();fv={claude:"claude",qwen:"qwen"};gv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as wv,constants as yv}from"node:fs";import{delimiter as Ev,join as bv}from"node:path";function Sv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Ev))if(n)try{return wv(bv(n,t),yv.X_OK),!0}catch{}return!1}function Tv(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 Ur(t,e,r={}){if(Sv(t,r.env))return;(r.warn??console.warn)(Tv(t,e))}var Qs=E(()=>{"use strict"});function am(t={}){return Ur("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${vv}`]}var kv,vv,lm=E(()=>{"use strict";Qs();kv=864e5,vv=kv/1e3});import{spawn as Iv}from"node:child_process";import{createInterface as xv}from"node:readline";import{existsSync as $v,readFileSync as jv}from"node:fs";import{fileURLToPath as Nv}from"node:url";function Av(t){return t==="plan"?"read-only":"danger-full-access"}function Ov(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Rv},capabilities:{experimentalApi:!1}}}function Xt(t,e){ft(`[codex:${t}] ${JSON.stringify(e)}`)}function Lv(){return{agentItems:new Map,resultText:""}}function cm(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),!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 Cv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Mv(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 Dv(){return{pendingCodexError:null}}function Pv(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
926
926
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
927
927
|
${e}
|
|
928
928
|
|
|
929
|
-
${r}`:r}function Fv(t,e){let r=Mv(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Uv(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
|
|
929
|
+
${r}`:r}function Fv(t,e){let r=Mv(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Uv(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 um(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)}`),e.alias?.toLowerCase()==="lead"&&o.push(...am());let i=e.permissionMode??"yolo",a=Av(i);try{Jt("codex",o,i)}catch(R){return n(R)}if(e.cwd&&!$v(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let l=Iv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),st(l).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,z({event:"transport_abort",provider:"codex"}),st(l).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=xv({input:l.stdout}),d=new Map,f=1,m=e.threadId||"",p="",h=!1,g=!1,_=Date.now(),T=Lv(),S=Dv();function v(R,C={}){return new Promise((q,te)=>{let j=f++;d.set(j,{resolve:q,reject:te});let H=JSON.stringify({jsonrpc:"2.0",id:j,method:R,params:C});l.stdin?.write(H+`
|
|
930
930
|
`)})}function x(R,C={}){let q=JSON.stringify({jsonrpc:"2.0",method:R,params:C});l.stdin?.write(q+`
|
|
931
|
-
`)}u.on("line",R=>{let C;try{C=JSON.parse(R)}catch{return}if(typeof C.id=="number"&&d.has(C.id)){let j=d.get(C.id);if(d.delete(C.id),C.error){let H=C.error,me=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(C.error);j.reject(Ys(`codex app-server error: ${me}`,H))}else j.resolve(C);e.onEvent?.(C);return}let q=C.method;if(!q){e.onEvent?.(C);return}if(q==="thread/started"){let H=C.params?.thread;H?.id&&(m=H.id)}let te=Re()?j=>{Xt("item.text/buffer-mismatch",{itemId:j.itemId,threadId:j.threadId??null,turnId:j.turnId??null,expectedFromItemText:j.expectedFromItemText,gotFromBuffer:j.gotFromBuffer,expectedLen:j.expectedFromItemText.length,gotLen:j.gotFromBuffer.length})}:void 0;if(q==="turn/started"){let j=C.params,H=j?.turn;H?.id&&(p=H.id),
|
|
932
|
-
`);let C=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(m=C.id)}else{let C=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(m=C.id)}await v("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){st(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Rv,
|
|
933
|
-
`,"utf-8"),!0}let s;try{s=JSON.parse(qv(n,"utf-8"))}catch{return console.log(
|
|
934
|
-
`,"utf-8"),o}function Gv(t){let e=ll(),r=xt(t.provider)?t.provider:{},n=!xt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=eo(o),n=!0;continue}if(!xt(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=xt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=eo(d),n=!0);a.options=l;let c=xt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=eo(d),n=!0;continue}let f=c[u];if(xt(f)&&xt(d)){let m={...f};
|
|
931
|
+
`)}u.on("line",R=>{let C;try{C=JSON.parse(R)}catch{return}if(typeof C.id=="number"&&d.has(C.id)){let j=d.get(C.id);if(d.delete(C.id),C.error){let H=C.error,me=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(C.error);j.reject(Ys(`codex app-server error: ${me}`,H))}else j.resolve(C);e.onEvent?.(C);return}let q=C.method;if(!q){e.onEvent?.(C);return}if(q==="thread/started"){let H=C.params?.thread;H?.id&&(m=H.id)}let te=Re()?j=>{Xt("item.text/buffer-mismatch",{itemId:j.itemId,threadId:j.threadId??null,turnId:j.turnId??null,expectedFromItemText:j.expectedFromItemText,gotFromBuffer:j.gotFromBuffer,expectedLen:j.expectedFromItemText.length,gotLen:j.gotFromBuffer.length})}:void 0;if(q==="turn/started"){let j=C.params,H=j?.turn;H?.id&&(p=H.id),cm(C,T,e.onDelta,te),Re()&&Xt("turn/started",{params:j??null})}if(Re()&&(q==="item/started"||q==="item/completed")){let j=C.params;j?.item?.type==="agentMessage"&&Xt(q,{params:j??null})}if(q==="item/started"||q==="item/agentMessage/delta"||q==="item/completed"){if(q==="item/agentMessage/delta"){let j=C.params;Re()&&Xt("agentMessage/delta",{params:j??null})}cm(C,T,e.onDelta,te)}if(q==="turn/completed"){let j=C.params;if(Re())for(let[me,I]of T.agentItems.entries())I.buffer&&Xt("turn/completed/unflushed-item",{itemId:me,phase:I.phase,bufferLen:I.buffer.length});Cv(T),Re()&&Xt("turn/completed",{params:j??null});let H=Uv(C,S);H.shouldReject?(Re()&&Xt("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(q==="error"){let j=Fv(C,S);if(Re()){let H=C.params,me=H?.error,I=typeof me?.message=="string"?me.message:"(no message)";Xt(j.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:j.willRetry,params:H??null})}}e.onEvent?.(C)});let k="";l.stderr?.on("data",R=>{k+=R.toString()}),l.on("error",R=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:R.message}),n(new ye(`Failed to spawn codex app-server: ${R.message}`,{cause:R}))}),l.on("exit",R=>{if(!c&&!g){if(h){r({result:T.resultText,threadId:m,turnId:p,durationMs:Date.now()-_,exitCode:R});return}if(S.pendingCodexError){n(S.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_tail:k.slice(0,500)}),n(new Error(Pv({exitCode:R,stderr:k})))}}),(async()=>{try{if(await v("initialize",Ov()),x("initialized",{}),e.threadId)try{let R=v("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((q,te)=>setTimeout(()=>te(new Error("resume timeout")),5e3));await Promise.race([R,C]),m=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
932
|
+
`);let C=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(m=C.id)}else{let C=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(m=C.id)}await v("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(R){st(l).catch(()=>{}),n(R instanceof Error?R:new Error(String(R)))}})()})}var Rv,dm=E(()=>{"use strict";Oe();Oe();Pr();Zs();Ln();lm();Oe();Rv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(jv(Nv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Gt(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 ll(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:fm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(mm.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(pm.map(t=>[t,{name:t}]))}})}function hm(){return[...Object.keys(fm).map(t=>`github-copilot/${t}`),...mm.map(t=>`deepseek/${t}`),...pm.map(t=>`openrouter/${t}`)].sort()}var fm,mm,pm,cl=E(()=>{"use strict";fm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Gt("GPT-5 mini",["high"]),"gpt-5.2":Gt("GPT-5.2"),"gpt-5.2-codex":Gt("GPT-5.2 Codex"),"gpt-5.3-codex":Gt("GPT-5.3 Codex"),"gpt-5.4":Gt("GPT-5.4"),"gpt-5.4-mini":Gt("GPT-5.4 mini"),"gpt-5.4-nano":Gt("GPT-5.4 nano"),"gpt-5.5":Gt("GPT-5.5")},mm=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],pm=["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 Wv,mkdirSync as Bv,readFileSync as qv,writeFileSync as _m}from"node:fs";import{join as gm}from"node:path";function ym(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:Hv}}function Jv(t,e){return JSON.stringify(t)===JSON.stringify(e)}function eo(t){return structuredClone(t)}function Xv(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 to(t,e={}){let r=gm(t,".opencode"),n=gm(r,"opencode.json");if(Ur("lmctl","lmctl_chat",e),!Wv(n)){Bv(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:ll(),mcp:{lmctl:ym()}},null,2);return _m(n,l+`
|
|
933
|
+
`,"utf-8"),!0}let s;try{s=JSON.parse(qv(n,"utf-8"))}catch{return console.log(wm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(wm.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),Xv(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.`}),Gv(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=ym();return Jv(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&_m(n,JSON.stringify(s,null,2)+`
|
|
934
|
+
`,"utf-8"),o}function Gv(t){let e=ll(),r=xt(t.provider)?t.provider:{},n=!xt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=eo(o),n=!0;continue}if(!xt(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=xt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=eo(d),n=!0);a.options=l;let c=xt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=eo(d),n=!0;continue}let f=c[u];if(xt(f)&&xt(d)){let m={...f};Em(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function xt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Em(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=eo(s),r=!0;continue}xt(t[n])&&xt(s)&&Em(t[n],s)&&(r=!0)}return r}var wm,Hv,ul=E(()=>{"use strict";Oe();cl();Qs();wm={yellow:t=>t},Hv=864e5});import{spawn as Vv}from"node:child_process";import{existsSync as Kv}from"node:fs";import{createInterface as zv}from"node:readline";function Yv(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
935
935
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
936
936
|
${e}
|
|
937
937
|
|
|
938
|
-
${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return
|
|
938
|
+
${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return bm(t.slice(n).trimStart())}return bm(i0(t.replace(t0,"")))}function i0(t){let e=r0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(n0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function bm(t){let e=[...t.matchAll(s0)];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 Tm(t,e){let r=Zv[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{to(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=Fr("gemini","plan"),k=Fr("gemini","yolo");a=a.filter(R=>!(k??[]).includes(R)),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.
|
|
939
939
|
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Jt(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.
|
|
940
940
|
`),e.cwd&&!Kv(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Vv(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),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"}),st(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),st(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=zv({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function T(x,k={}){return new Promise((R,C)=>{let q=Qv++;m.set(q,{resolve:R,reject:C});let te=JSON.stringify({jsonrpc:"2.0",id:q,method:x,params:k});Wt({event:"acp_send",direction:"SEND",provider:e.tool,method:x,id:q,params:k}),c.stdin?.write(te+`
|
|
941
941
|
`)})}f.on("line",x=>{let k;try{k=JSON.parse(x)}catch{return}if(Wt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof k.id=="number"?k.id:void 0,method:typeof k.method=="string"?k.method:void 0,preview:JSON.stringify(k).slice(0,300)}),e.onEvent?.(k),typeof k.id=="number"&&m.has(k.id)){let C=m.get(k.id);if(m.delete(k.id),k.error){let q=k.error,te=typeof q?.message=="string"&&q.message.length>0?q.message:JSON.stringify(k.error);C.reject(Ys(`ACP RPC error: ${te}`,q))}else C.resolve(k);return}let R=k.method;if(R){if(typeof k.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:R,id:k.id,params:k.params});let C=JSON.stringify({jsonrpc:"2.0",id:k.id,error:{code:-32601,message:`Method not found: ${R} (lmctl does not implement server-side ACP methods)`}});Wt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:k.id,error:"method not found"}),c.stdin?.write(C+`
|
|
@@ -943,35 +943,35 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
943
943
|
`)}(async()=>{try{if(await T("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),v("notifications/initialized"),e.sessionId)try{p=(await T("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(k){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${k instanceof Error?k.message:String(k)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
944
944
|
`),p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await T("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),ft(`acp: set_config_option(model=${e.model}) ok`)}catch(k){let R=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${R}
|
|
945
945
|
`)}if(e.effort&&e.tool==="opencode")try{await T("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),ft(`acp: set_config_option(effort=${e.effort}) ok`)}catch(k){let R=k instanceof Error?k.message:String(k);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${R}
|
|
946
|
-
`)}ft(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,ft(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){st(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Zv,Qv,
|
|
946
|
+
`)}ft(`acp: prompt sent (${t.length} chars)`),g=(await T("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,ft(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){st(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Zv,Qv,Sm,e0,t0,r0,n0,s0,km=E(()=>{"use strict";Oe();Pr();Zs();Ln();ul();Oe();Zv={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},Qv=1,Sm="(?:png|jpe?g|webp|heic|pdf)",e0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Sm}\\s*`,"gi"),t0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Sm}\\s*`,"i"),r0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,n0=/^STANCE:\s+\S+\s*$/gim,s0=/\[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 vm(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=a0){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 l0(){let t=new Map;return(e,r)=>{c0(e,vm(t,r))}}function c0(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(`
|
|
947
947
|
`).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(`
|
|
948
|
-
`).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 ro(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?l0():void 0,s=await
|
|
948
|
+
`).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 ro(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?l0():void 0,s=await om(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 u0(){let t=new Map;return(e,r)=>{d0(e,vm(t,r))}}function d0(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 Wr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Wt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?u0():void 0,s=await Tm(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 f0(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(`
|
|
949
949
|
`).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(`
|
|
950
|
-
`).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
|
|
951
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}async function
|
|
952
|
-
`);T.trim()&&Mn(s,m,{role:"thinking",timestamp:g,content:ue(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Mn(s,m,{role:"thinking",timestamp:g,content:ue(_)})}}if(!o)return null;let p=await
|
|
953
|
-
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:
|
|
954
|
-
`).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?w0(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 w0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&
|
|
950
|
+
`).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 Im(t,e){let r=await um(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>f0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var a0,hr=E(()=>{"use strict";im();dm();km();Oe();a0=256});function fl(t){return new dl(t)}var dl,ml=E(()=>{"use strict";zf();Ht();hr();kt();dl=class extends Ae{constructor(e){super({provider:new Gs(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ie,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:ro})}}});import{readdir as m0,stat as xm,unlink as p0}from"node:fs/promises";import{join as Cn,basename as h0}from"node:path";function _0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Mn(t,e,r){let n=_0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function $m(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function g0(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 no(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 no(r)}).filter(r=>r.length>0).join(`
|
|
951
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}async function jm(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=g0(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 so,Nm=E(()=>{"use strict";qt();so=class{name="codex";codexDirs;constructor(e={}){let r=[Cn(Se,".codex"),Cn(Se,".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:Cn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Cn(r,"sessions");try{await xm(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 m0(e)}catch{return r}for(let s of n){let o=Cn(e,s),i=await xm(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=h0(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 ve(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=G(h.trim(),80)),u=G(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=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await jm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:$m(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 ve(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=$m(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 S=T.text.trim();c||(c=G(S,80)),u=G(S,80),Mn(s,m,{role:"user",timestamp:g,content:ue(S)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&Mn(s,m,{role:"assistant",timestamp:g,content:ue(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&&Mn(s,m,{role:"system",timestamp:g,content:ue(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?ue(no(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ue(no(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(S=>no(S.text)).join(`
|
|
952
|
+
`);T.trim()&&Mn(s,m,{role:"thinking",timestamp:g,content:ue(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Mn(s,m,{role:"thinking",timestamp:g,content:ue(_)})}}if(!o)return null;let p=await jm(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 p0(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 hl(t){return new pl(t)}var pl,_l=E(()=>{"use strict";Nm();Ht();hr();kt();pl=class extends Ae{constructor(e){super({provider:new so(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:`${Ie}
|
|
953
|
+
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Im})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Dn(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 oo(t){let e=Dn(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(`
|
|
954
|
+
`).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?w0(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 w0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Am(t.tokens)&&Am(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Am(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Rm(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(`
|
|
955
955
|
`)+`
|
|
956
|
-
`}var gl=E(()=>{"use strict"});import{createHash as y0}from"node:crypto";import{readdir as Pn,readFile as
|
|
957
|
-
`).trim();k&&o.push({role:"thinking",timestamp:_r(x.timestamp,_),content:ue(k)})}o.push({role:"assistant",timestamp:_,content:S,model:g.model});continue}let v=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${v}${S}`.trim()})}let m=_r(n.startTime,s.createdAt),p=_r(n.lastUpdated,s.modifiedAt),h=
|
|
958
|
-
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Ks,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=Dn(s),i=oo(s),a=R0();i.sessionId=a,i.kind="main";let l=A0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=N0(l,d);return j0(l,{recursive:!0}),$0(f,
|
|
959
|
-
`)){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 gr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function D0(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 co,
|
|
956
|
+
`}var gl=E(()=>{"use strict"});import{createHash as y0}from"node:crypto";import{readdir as Pn,readFile as Om,stat as io,unlink as E0}from"node:fs/promises";import{join as He,basename as b0,dirname as S0}from"node:path";import{cwd as T0}from"node:process";function Lm(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Cm(t){return t==="user"}function wl(t){return t==="gemini"||t==="assistant"}function _r(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function k0(t){return`${t.sessionId}\0${t.cwd}`}function v0(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 ao(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Mm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!wl(a.type)||!a.tokens)continue;let l=ao(a.tokens.input),c=ao(a.tokens.cached),u=Math.max(l-c,0),d=ao(a.tokens.output),f=ao(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 I0(t){return y0("sha256").update(t).digest("hex")}function Fn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=S0(r);if(n===r)break;r=n}}var lo,Dm=E(()=>{"use strict";qt();gl();Oe();lo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Se,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Se,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Se,".codex"),He(Se,".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=k0(s),i=r.get(o);r.set(o,i?v0(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 ve(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 _=_r(g.timestamp),T=g.type,S=ue(Lm(g.content));if(Cm(T)){let x=S.trim();x&&(u||(u=G(x,80)),d=G(x,80)),o.push({role:"user",timestamp:_,content:x||S});continue}if(wl(T)){g.model&&(f=g.model);for(let x of g.thoughts||[]){let k=[x.subject,x.description].filter(Boolean).join(`
|
|
957
|
+
`).trim();k&&o.push({role:"thinking",timestamp:_r(x.timestamp,_),content:ue(k)})}o.push({role:"assistant",timestamp:_,content:S,model:g.model});continue}let v=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${v}${S}`.trim()})}let m=_r(n.startTime,s.createdAt),p=_r(n.lastUpdated,s.modifiedAt),h=Mm(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 ve(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(Cm(m.type)){d++;let p=Lm(m.content).trim();p&&(l||(l=G(ue(p),80)),c=G(ue(p),80))}else wl(m.type)&&(d++,m.model&&(u=m.model));let f=Mm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:_r(r.startTime,n.createdAt),modifiedAt:_r(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 Om(e,"utf-8");if(Dn(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 oo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=b0(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 Pn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await io(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Pn(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 E0(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 ve(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:_r(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;Fn(e,T0());for(let n of this.extraWorkspacePaths)Fn(e,n);for(let n of await this.collectGeminiProjectPaths())Fn(e,n);for(let n of await this.collectCodexCwds())Fn(e,n);for(let n of await this.collectClaudeCwds())Fn(e,n);let r=new Map;for(let n of e)r.set(I0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Om(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 Pn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await io(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Pn(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 io(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Pn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await io(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 $0,mkdirSync as j0}from"node:fs";import{join as N0,dirname as A0}from"node:path";import{randomUUID as R0}from"node:crypto";function El(t){return new yl(t)}var yl,bl=E(()=>{"use strict";Dm();Ht();hr();kt();gl();yl=class extends Ae{constructor(e){super({provider:new lo(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",Ie,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Wr(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(`
|
|
958
|
+
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Ks,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=Dn(s),i=oo(s),a=R0();i.sessionId=a,i.kind="main";let l=A0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=N0(l,d);return j0(l,{recursive:!0}),$0(f,Rm(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 Pm,readFile as O0,rm as L0,stat as Br}from"node:fs/promises";import{basename as C0,join as ot}from"node:path";function M0(t){let e={};for(let r of t.split(`
|
|
959
|
+
`)){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 gr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function D0(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 co,Fm=E(()=>{"use strict";qt();co=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ot(Se,".copilot");this.sessionStateDir=ot(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Pm(this.sessionStateDir)}catch{return e}for(let n of r){let s=ot(this.sessionStateDir,n);if((await Br(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=ot(r,"events.jsonl"),o=await Br(s).catch(()=>null),i=o?s:ot(r,"workspace.yaml"),a=await ve(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||C0(r)||e;if(o)for await(let _ of Fe(s)){let T=gr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=gr(_.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 S=_.data.content||"",v=S.trim();v&&(m||(m=G(v,80)),p=G(v,80)),l.push({role:"user",timestamp:T,content:ue(v||S)});continue}if(_.type==="assistant.message"&&_.data){let S=(_.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:T,content:ue(S),model:u}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let S=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:ue(S),toolDetailedContent:v?ue(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:ue(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let S=_.data?.message||"";S.trim()&&l.push({role:"system",timestamp:T,content:ue(S)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??gr(n?.created_at)??a.createdAt,modifiedAt:gr(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=ot(e,"events.jsonl"),o=await Br(s).catch(()=>null),i=o?s:ot(e,"workspace.yaml"),a=await ve(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=gr(_.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=G(T,80)),h=G(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await D0(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??gr(n?.created_at)??a.createdAt,modifiedAt:gr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=ot(e,"workspace.yaml");try{let n=await O0(r,"utf-8");return M0(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await L0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Pm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ot(this.sessionStateDir,e);if((await Br(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=ot(this.sessionStateDir,s);(await Br(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=ot(this.sessionStateDir,s);if(!(await Br(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 Sl(t){return new Ae({provider:new co(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ie,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Wr(e,{...r,acpTool:"copilot"})})}var Tl=E(()=>{"use strict";Fm();Ht();hr();kt()});import{existsSync as Um}from"node:fs";import{join as uo}from"node:path";import{createRequire as P0}from"node:module";function Wm(){return kl===null&&(kl=P0(import.meta.url)("node:sqlite").DatabaseSync),kl}function F0(){let t=process.env.XDG_DATA_HOME||uo(Se,".local","share"),e=process.env.XDG_CONFIG_HOME||uo(Se,".config");return[uo(t,"opencode","opencode.db"),uo(e,"opencode","opencode.db")]}var kl,fo,Bm=E(()=>{"use strict";qt();kl=null;fo=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=F0().find(r=>Um(r))??null}openDb(){return!this.dbPath||!Um(this.dbPath)?null:new(Wm())(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,
|
|
960
960
|
s.time_created, s.time_updated
|
|
961
961
|
FROM session s
|
|
962
962
|
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
|
|
963
963
|
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(i.id),u=0,d,f,m,p=[];for(let g of c){let _;try{_=JSON.parse(g.data)}catch{continue}m||(m=_.model?.modelID||_.modelID),(_.role==="user"||_.role==="assistant")&&u++,_.role==="user"&&p.push(g.id)}let h=[...p.length>0?[p[0]]:[],...p.length>1?[p[p.length-1]]:[]];for(let g of h){let _=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),T=this.extractText(_);T&&(d||(d=G(T,80)),f=G(T,80))}o.push({provider:"opencode",sessionId:i.id,slug:i.slug,cwd:l,createdAt:new Date(i.time_created),modifiedAt:new Date(i.time_updated),model:m,startCommand:"opencode",firstUserMessage:d,lastUserMessage:f,messageCount:u,filePath:this.dbPath})}return o}finally{e.close()}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.findSessionRow(r,e);return n?this.buildSessionDetail(r,n):null}finally{r.close()}}buildSessionDetail(e,r){let n=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),s=r.directory||n?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
|
|
964
964
|
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),i=[],a=0,l,c,u;for(let d of o){let f;try{f=JSON.parse(d.data)}catch{continue}l||(l=f.model?.modelID||f.modelID);let m=f.model?.modelID||f.modelID,p=new Date(f.time?.created||d.time_created),h=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(d.id);if(f.role==="user"){let g=this.extractText(h);g&&(c||(c=G(g,80)),u=G(g,80)),i.push({role:"user",timestamp:p,content:g||"(empty)"}),a++}else if(f.role==="assistant"){for(let g of h){let _;try{_=JSON.parse(g.data)}catch{continue}_.type==="text"&&_.text?i.push({role:"assistant",timestamp:p,content:_.text,model:m}):_.type==="reasoning"&&_.text?i.push({role:"thinking",timestamp:p,content:_.text}):_.type==="tool"&&_.tool&&(i.push({role:"tool_use",timestamp:p,content:`${_.tool}`,toolName:_.tool,toolCallId:_.callID,toolInput:_.state?.input?JSON.stringify(_.state.input):void 0}),(_.state?.output||_.state?.error)&&i.push({role:"tool_result",timestamp:p,content:_.state.error||_.state.output||"",toolCallId:_.callID}))}a++}}return{provider:"opencode",sessionId:r.id,slug:r.slug,cwd:s,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:l,startCommand:"opencode",firstUserMessage:c,lastUserMessage:u,messageCount:a,filePath:this.dbPath,messages:i}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
|
|
965
|
-
`).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(
|
|
965
|
+
`).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(Wm())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
966
966
|
s.time_created, s.time_updated
|
|
967
967
|
FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
968
968
|
s.time_created, s.time_updated
|
|
969
969
|
FROM session s
|
|
970
970
|
WHERE s.id LIKE ?
|
|
971
971
|
ORDER BY s.time_updated DESC
|
|
972
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Il(){return new vl}var vl,xl=E(()=>{"use strict";
|
|
972
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Il(){return new vl}var vl,xl=E(()=>{"use strict";Bm();Ht();hr();kt();vl=class extends Ae{constructor(){super({provider:new fo,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",Ie],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Wr(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??Ie),r}}});import{readdir as mo,readFile as U0,rm as W0}from"node:fs/promises";import{basename as qm,join as Vt}from"node:path";function Hm(t){return t.type==="user"||t.message?.role==="user"}function Jm(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Xm(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(`
|
|
973
973
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
974
|
-
`):"":""}function Xm(t){return t.model||t.message?.model}var po,Gm=E(()=>{"use strict";qt();po=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Vt(Se,".qwen")}async discoverSessions(){let e=Vt(this.baseDir,"projects"),r;try{r=await mo(e)}catch{return[]}let n=[];for(let s of r){let o=Vt(e,s,"chats"),i;try{i=await mo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Vt(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 ve(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)),qm(d)){let f=Jm(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(Hm(d)){let f=Xm(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=Bm(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await ve(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(qm(f)){let h=Jm(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(Hm(f)){let h=Xm(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=Vt(this.baseDir,"projects");try{let n=await mo(r),s=[];for(let o of n){let i=Vt(r,o,"chats",`${e}.jsonl`);try{return await U0(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Vt(r,o,"chats"),a;try{a=await mo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Bm(l,".jsonl").startsWith(e)&&s.push(Vt(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 W0(r),!0}catch{return!1}}}});function jl(){return new $l}var $l,Nl=E(()=>{"use strict";Gm();Ht();hr();kt();$l=class extends Ae{constructor(){super({provider:new po,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ie,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ro})}}});import{readdir as Vm,readFile as B0,rm as Km,stat as zm}from"node:fs/promises";import{basename as Al,join as $t}from"node:path";async function q0(t){let e=await Promise.all(t.map(r=>ve(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 H0(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Ym(t){return t.type==="USER_INPUT"}function Zm(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function J0(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Qm(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function ep(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 X0(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function G0(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=V0(s);if(o)return o}let n=K0(e.content);if(n)return n}return null}function V0(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 K0(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function tp(t){if(t.endsWith(".db"))return Al(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ho,rp=E(()=>{"use strict";qt();ho=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||$t(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:$t(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=$t(this.baseDir,"conversations"),r;try{r=await Vm(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Al(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return $t(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return $t(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await zm(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await q0([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=ep(f.content);if(m&&(a=m),Ym(f)){let p=Qm(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else Zm(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=tp(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=H0(u.created_at,s.modifiedAt),f=ep(u.content);if(f&&(a=f),Ym(u)){let m=Qm(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(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:X0(m.args),toolName:m.name||"tool"});Zm(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):J0(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 zm(r),r}catch{}let n=$t(this.baseDir,"conversations");try{let s=[];for(let o of await Vm(n)){if(!o.endsWith(".db"))continue;Al(o,".db").startsWith(e)&&s.push($t(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=tp(r);return n?(await Km(this.conversationPath(n),{force:!0}),await Km($t(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 G0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=$t(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await B0(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as z0}from"node:child_process";function Ol(t){return new Rl(t)}async function Y0(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",Q0(e.timeoutMs)];e.model&&n.push("--model",e.model),Jt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await Z0(e.binary,n,{cwd:e.cwd,env:e.env,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 Z0(t,e,r){return new Promise((n,s)=>{let o;try{o=z0(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 Q0(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Rl,Ll=E(()=>{"use strict";rp();Ht();kt();Ln();Rl=class extends Ae{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",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Ie,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:Y0})}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 eI}from"node:crypto";import{join as tI}from"node:path";function rI(t){return eI("sha256").update(t).digest("hex").slice(0,8)}function nI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function sI(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 oI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function _o(t){return Math.max(1,Math.ceil(t.length/4))}function np(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 Dl(){return new Ml}var wr,Cl,Ml,Pl=E(()=>{"use strict";wr=new Map;Cl=class{name="ClaudeMock";async discoverSessions(){return[...wr.values()].map(np)}async loadSession(e){let r=wr.get(e);return r===void 0?null:{...np(r),messages:r.messages.slice()}}async resolveSessionPath(e){return wr.get(e)?.filePath??null}async deleteSession(e){return wr.delete(e)}},Ml=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Cl;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=nI(sI(e,r)),s=`mock-${n}-${rI(`${e}:${n}`)}`,o=new Date,i=wr.get(s),a=r?.prompt??"ClaudeMock seed",l=_o(a),c={sessionId:s,cwd:e,filePath:tI(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+=_o("ACK: ClaudeMock seeded"),wr.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=wr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${oI(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+=_o(e),s.totalOutputTokens+=_o(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 ht(t){let e=[fl({claudeDir:t?.claudeDir}),hl({codexDir:t?.codexDir,codeDir:t?.codeDir}),El({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Sl({copilotDir:t?.copilotDir}),Il(),jl(),Ol({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Dl()),e}var Fl=E(()=>{"use strict";ml();_l();bl();Tl();xl();Nl();Ll();Pl();ml();_l();bl();Tl();xl();Nl();Ll();Pl()});var ql={};le(ql,{ProviderRegistry:()=>On,TransportConnectionError:()=>ye,TransportError:()=>Ke,TransportJsonError:()=>zs,TransportProcessError:()=>vt,TransportRpcError:()=>It,_resetDefaultRegistryForTests:()=>iI,chat:()=>yr,countTokens:()=>Bl,createAdapterRegistry:()=>pt,createAllAdapters:()=>ht,listSessions:()=>Wl,seed:()=>Ul});function wo(){return go===null&&(go=pt(ht())),go}function iI(){go=null}function op(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function yr(t){let e=t.registry??wo(),r=op(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,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 Ul(t){let e=t.registry??wo(),r=op(e,t.provider),n=await sp(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 sp(e,t.provider,t.cwd),i=aI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function sp(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 aI(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 Wl(t={}){return(t.registry??wo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Bl(t){let r=await(t.registry??wo()).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 go,jt=E(()=>{"use strict";nl();Fl();nl();Fl();Pr();go=null});function lI(){return Hl===null&&(Hl=pt(ht())),Hl}async function Hr(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 uI(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)qr.delete(r),e.setMemberState(r,"idle");else{let i=cI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function cI(t,e){if(!(t instanceof Ee))return qr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(qr.get(e)??0)+1;return r>=3?(qr.delete(e),"consecutive_timeouts"):(qr.set(e,r),null)}return qr.delete(e),null}async function uI(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=lI(),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`,Jl(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${ip(u)}`,Jl(t.sessionid,t.sessiondir,"unresolved")))}let o=Jl(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 yr({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):dI(u,o)}finally{a!==null&&clearTimeout(a)}}function Jl(t,e,r){return["<library>","chat",t,e,"--provider",r]}function ip(t){return t instanceof Error?t.message:String(t)}function dI(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 vt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof It?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ke?new Ee("other",null,t.message,e):new Ee("other",null,ip(t),e)}var Ee,Hl,qr,Un=E(()=>{"use strict";jt();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"}},Hl=null;qr=new Map});function ap(){return Xl===null&&(Xl=pt(ht())),Xl}function mI(t,e){if(!fI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Te("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 Jr(t){let e=mI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await pI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function pI(t){let e=t.member.provider,r=t.member.sessiondir,n=Gl("seed",r,e);try{let s=await Ul({provider:e,cwd:r,registry:ap()});if(!s.success)throw _I(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:Vl(s,n)}}async function lp(t){return hI(t)}async function hI(t){let e=ap(),r=Gl("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Te("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Te?o:Vl(o,r)}let s=Gl("tokens",t.sessionid,n);try{let o=await Bl({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 Te?o:Vl(o,s)}}function Gl(t,e,r){return["<library>",t,e,"--provider",r]}function _I(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Te("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Te("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 Te("nonzero_exit",Number(n[1]),r,e)}return new Te("other",null,r,e)}function Vl(t,e){return t instanceof Te?t:t instanceof ye?t.cause?.code==="ENOENT"?new Te("enoent",null,t.message,e):new Te("other",null,t.message,e):t instanceof vt?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof It?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ke?new Te("other",null,t.message,e):new Te("other",null,t instanceof Error?t.message:String(t),e)}var Te,Xl,fI,yo=E(()=>{"use strict";jt();Te=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"}},Xl=null;fI=/^provider[123]$/});function Eo(t){return Buffer.from(t,"utf8").toString("base64url")}function Bn(t){return Buffer.from(t,"base64url").toString("utf8")}async function cp(t,e=r=>lp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of gI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function up(t,e,r){let n=dp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Wn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Hr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:fp(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 Kl(t,e,r){let n=dp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Jr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:fp(t,e,r)}}function gI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function dp(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 fp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Wn,bo=E(()=>{"use strict";Un();yo();Wn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function zl(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??yI(e),s=r-n,o=e.query(`
|
|
974
|
+
`):"":""}function Gm(t){return t.model||t.message?.model}var po,Vm=E(()=>{"use strict";qt();po=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Vt(Se,".qwen")}async discoverSessions(){let e=Vt(this.baseDir,"projects"),r;try{r=await mo(e)}catch{return[]}let n=[];for(let s of r){let o=Vt(e,s,"chats"),i;try{i=await mo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Vt(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 ve(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)),Hm(d)){let f=Xm(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(Jm(d)){let f=Gm(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=qm(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await ve(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(Hm(f)){let h=Xm(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(Jm(f)){let h=Gm(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=Vt(this.baseDir,"projects");try{let n=await mo(r),s=[];for(let o of n){let i=Vt(r,o,"chats",`${e}.jsonl`);try{return await U0(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Vt(r,o,"chats"),a;try{a=await mo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;qm(l,".jsonl").startsWith(e)&&s.push(Vt(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 W0(r),!0}catch{return!1}}}});function jl(){return new $l}var $l,Nl=E(()=>{"use strict";Vm();Ht();hr();kt();$l=class extends Ae{constructor(){super({provider:new po,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ie,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ro})}}});import{readdir as Km,readFile as B0,rm as zm,stat as Ym}from"node:fs/promises";import{basename as Al,join as $t}from"node:path";async function q0(t){let e=await Promise.all(t.map(r=>ve(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 H0(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Zm(t){return t.type==="USER_INPUT"}function Qm(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function J0(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function ep(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function tp(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 X0(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function G0(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=V0(s);if(o)return o}let n=K0(e.content);if(n)return n}return null}function V0(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 K0(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function rp(t){if(t.endsWith(".db"))return Al(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var ho,np=E(()=>{"use strict";qt();ho=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||$t(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:$t(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=$t(this.baseDir,"conversations"),r;try{r=await Km(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Al(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return $t(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return $t(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Ym(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await q0([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=tp(f.content);if(m&&(a=m),Zm(f)){let p=ep(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else Qm(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=rp(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=H0(u.created_at,s.modifiedAt),f=tp(u.content);if(f&&(a=f),Zm(u)){let m=ep(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(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:X0(m.args),toolName:m.name||"tool"});Qm(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):J0(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 Ym(r),r}catch{}let n=$t(this.baseDir,"conversations");try{let s=[];for(let o of await Km(n)){if(!o.endsWith(".db"))continue;Al(o,".db").startsWith(e)&&s.push($t(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=rp(r);return n?(await zm(this.conversationPath(n),{force:!0}),await zm($t(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 G0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=$t(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await B0(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as z0}from"node:child_process";function Ol(t){return new Rl(t)}async function Y0(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",Q0(e.timeoutMs)];e.model&&n.push("--model",e.model),Jt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await Z0(e.binary,n,{cwd:e.cwd,env:e.env,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 Z0(t,e,r){return new Promise((n,s)=>{let o;try{o=z0(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 Q0(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Rl,Ll=E(()=>{"use strict";np();Ht();kt();Ln();Rl=class extends Ae{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",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Ie,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:Y0})}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 eI}from"node:crypto";import{join as tI}from"node:path";function rI(t){return eI("sha256").update(t).digest("hex").slice(0,8)}function nI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function sI(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 oI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function _o(t){return Math.max(1,Math.ceil(t.length/4))}function sp(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 Dl(){return new Ml}var wr,Cl,Ml,Pl=E(()=>{"use strict";wr=new Map;Cl=class{name="ClaudeMock";async discoverSessions(){return[...wr.values()].map(sp)}async loadSession(e){let r=wr.get(e);return r===void 0?null:{...sp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return wr.get(e)?.filePath??null}async deleteSession(e){return wr.delete(e)}},Ml=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Cl;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=nI(sI(e,r)),s=`mock-${n}-${rI(`${e}:${n}`)}`,o=new Date,i=wr.get(s),a=r?.prompt??"ClaudeMock seed",l=_o(a),c={sessionId:s,cwd:e,filePath:tI(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+=_o("ACK: ClaudeMock seeded"),wr.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=wr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${oI(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+=_o(e),s.totalOutputTokens+=_o(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 ht(t){let e=[fl({claudeDir:t?.claudeDir}),hl({codexDir:t?.codexDir,codeDir:t?.codeDir}),El({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Sl({copilotDir:t?.copilotDir}),Il(),jl(),Ol({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Dl()),e}var Fl=E(()=>{"use strict";ml();_l();bl();Tl();xl();Nl();Ll();Pl();ml();_l();bl();Tl();xl();Nl();Ll();Pl()});var ql={};le(ql,{ProviderRegistry:()=>On,TransportConnectionError:()=>ye,TransportError:()=>Ke,TransportJsonError:()=>zs,TransportProcessError:()=>vt,TransportRpcError:()=>It,_resetDefaultRegistryForTests:()=>iI,chat:()=>yr,countTokens:()=>Bl,createAdapterRegistry:()=>pt,createAllAdapters:()=>ht,listSessions:()=>Wl,seed:()=>Ul});function wo(){return go===null&&(go=pt(ht())),go}function iI(){go=null}function ip(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function yr(t){let e=t.registry??wo(),r=ip(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,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 Ul(t){let e=t.registry??wo(),r=ip(e,t.provider),n=await op(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 op(e,t.provider,t.cwd),i=aI(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function op(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 aI(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 Wl(t={}){return(t.registry??wo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Bl(t){let r=await(t.registry??wo()).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 go,jt=E(()=>{"use strict";nl();Fl();nl();Fl();Pr();go=null});function lI(){return Hl===null&&(Hl=pt(ht())),Hl}async function Hr(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 uI(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)qr.delete(r),e.setMemberState(r,"idle");else{let i=cI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function cI(t,e){if(!(t instanceof Ee))return qr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(qr.get(e)??0)+1;return r>=3?(qr.delete(e),"consecutive_timeouts"):(qr.set(e,r),null)}return qr.delete(e),null}async function uI(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=lI(),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`,Jl(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${ap(u)}`,Jl(t.sessionid,t.sessiondir,"unresolved")))}let o=Jl(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 yr({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):dI(u,o)}finally{a!==null&&clearTimeout(a)}}function Jl(t,e,r){return["<library>","chat",t,e,"--provider",r]}function ap(t){return t instanceof Error?t.message:String(t)}function dI(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 vt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof It?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ke?new Ee("other",null,t.message,e):new Ee("other",null,ap(t),e)}var Ee,Hl,qr,Un=E(()=>{"use strict";jt();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"}},Hl=null;qr=new Map});function lp(){return Xl===null&&(Xl=pt(ht())),Xl}function mI(t,e){if(!fI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Te("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 Jr(t){let e=mI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await pI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function pI(t){let e=t.member.provider,r=t.member.sessiondir,n=Gl("seed",r,e);try{let s=await Ul({provider:e,cwd:r,registry:lp()});if(!s.success)throw _I(s.error,n);if(!s.sessionId)throw new Te("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Te?s:Vl(s,n)}}async function cp(t){return hI(t)}async function hI(t){let e=lp(),r=Gl("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Te("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Te?o:Vl(o,r)}let s=Gl("tokens",t.sessionid,n);try{let o=await Bl({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 Te?o:Vl(o,s)}}function Gl(t,e,r){return["<library>",t,e,"--provider",r]}function _I(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Te("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Te("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 Te("nonzero_exit",Number(n[1]),r,e)}return new Te("other",null,r,e)}function Vl(t,e){return t instanceof Te?t:t instanceof ye?t.cause?.code==="ENOENT"?new Te("enoent",null,t.message,e):new Te("other",null,t.message,e):t instanceof vt?new Te("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof It?new Te("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ke?new Te("other",null,t.message,e):new Te("other",null,t instanceof Error?t.message:String(t),e)}var Te,Xl,fI,yo=E(()=>{"use strict";jt();Te=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"}},Xl=null;fI=/^provider[123]$/});function Eo(t){return Buffer.from(t,"utf8").toString("base64url")}function Bn(t){return Buffer.from(t,"base64url").toString("utf8")}async function up(t,e=r=>cp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of gI(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 dp(t,e,r){let n=fp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Wn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Hr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:mp(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 Kl(t,e,r){let n=fp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Jr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:mp(t,e,r)}}function gI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function fp(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 mp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Wn,bo=E(()=>{"use strict";Un();yo();Wn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function zl(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??yI(e),s=r-n,o=e.query(`
|
|
975
975
|
SELECT
|
|
976
976
|
isess.id AS interactive_session_id,
|
|
977
977
|
isess.run_id,
|
|
@@ -997,16 +997,16 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
997
997
|
JOIN step s ON s.id = isess.step_id
|
|
998
998
|
WHERE isess.status = 'waiting_agent'
|
|
999
999
|
AND r.terminal_state IS NULL
|
|
1000
|
-
`),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=SI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=EI(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:ke(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,bI(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function yI(t){return
|
|
1000
|
+
`),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=SI(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=EI(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:ke(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,bI(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function yI(t){return pp(t.getConfig(So),wI)*1e3}function Yl(t,e){return pp(t.getConfig(To),e)}function pp(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function EI(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function bI(t,e,r,n){return t.query(`SELECT * FROM attention
|
|
1001
1001
|
WHERE kind = 'session_hung'
|
|
1002
1002
|
AND run_id = ?
|
|
1003
|
-
AND acknowledged_at IS NULL`,e).some(o=>{let i=
|
|
1003
|
+
AND acknowledged_at IS NULL`,e).some(o=>{let i=hp(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function SI(t,e,r){let n=hp(t);return n===null?null:TI(n,e,r)??kI(n,e,r)}function TI(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(vI),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=Er(s.members)?s.members:null,i=o!==null&&Er(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function kI(t,e,r){if(!Er(t.states))return null;let n=t.states[e]??t.states[r];if(!Er(n))return null;let s=n;if(!Er(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function vI(t){return Er(t)}function hp(t){if(t===null)return null;try{let e=JSON.parse(t);return Er(e)?e:null}catch{return null}}function Er(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var So,To,wI,Zl=E(()=>{"use strict";Pe();So="monitor.session_hung.elapsed_threshold_seconds",To="monitor.session_hung.check_interval_ms",wI=600});function vo(t){let e=t.query(`
|
|
1004
1004
|
SELECT status, COUNT(*) AS count FROM job GROUP BY status
|
|
1005
1005
|
`),r={queued:ko(e,"queued"),running:ko(e,"running"),done:ko(e,"done"),failed:ko(e,"failed"),total:ec(e)},n=t.query(`
|
|
1006
1006
|
SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
|
|
1007
1007
|
`),s=t.query(`
|
|
1008
1008
|
SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
|
|
1009
|
-
`);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:ec(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:ec(s)},projects:Ql(t,"project"),teams:Ql(t,"team"),workflows:Ql(t,"workflow")}}function Io(t){return t.listProjects()}function
|
|
1009
|
+
`);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:ec(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:ec(s)},projects:Ql(t,"project"),teams:Ql(t,"team"),workflows:Ql(t,"workflow")}}function Io(t){return t.listProjects()}function wp(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function xo(t){return t.query(`
|
|
1010
1010
|
SELECT w.*
|
|
1011
1011
|
FROM workflow w
|
|
1012
1012
|
JOIN (
|
|
@@ -1015,10 +1015,10 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1015
1015
|
GROUP BY name
|
|
1016
1016
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1017
1017
|
ORDER BY w.name ASC
|
|
1018
|
-
`)}function
|
|
1018
|
+
`)}function yp(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 Ep(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 bp(t,e){return t.getSubmittedPr(e)}function $o(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Xr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function br(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:$o(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:II(t,r.id)}}function II(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Sp(t,r.id)}))}function tc(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:Sp(t,n.id)}}function Sp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Sr(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 Tp(t,e,r){let n=tc(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 kp(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 vp(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 zt(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 jo(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(`${Ip}
|
|
1019
1019
|
WHERE ${n}
|
|
1020
|
-
ORDER BY a.created_at DESC`,...r).map(
|
|
1021
|
-
WHERE a.id = ?`,e)[0];return n===void 0?null:
|
|
1020
|
+
ORDER BY a.created_at DESC`,...r).map(xp)}function _t(t,e){let n=t.query(`${Ip}
|
|
1021
|
+
WHERE a.id = ?`,e)[0];return n===void 0?null:xp(n)}function xp(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 $p(t){return t.query(`
|
|
1022
1022
|
SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
|
|
1023
1023
|
FROM run r
|
|
1024
1024
|
JOIN workflow w ON w.id = r.workflow_id
|
|
@@ -1088,12 +1088,12 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1088
1088
|
AND json_extract(payload, '$.elapsedMs') > 0
|
|
1089
1089
|
AND payload_truncated = 0
|
|
1090
1090
|
ORDER BY json_extract(payload, '$.tool') ASC,
|
|
1091
|
-
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
|
|
1091
|
+
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 jp(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 Gr(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?jp(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
|
|
1092
1092
|
FROM interactive_session
|
|
1093
1093
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1094
1094
|
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),S="pending",v=null;if(g.startsWith("@terminal:"))S=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?S=_&&u===g?"paused":"running":T.outcome===null?S="failed":S="done",T.ended_at!==null)){let x=Date.parse(T.started_at),k=Date.parse(T.ended_at);!Number.isNaN(x)&&!Number.isNaN(k)&&(v=k-x)}_&&u===g&&(S="paused"),h.push({id:g,status:S,is_current:_,elapsed_ms:v,prompt:_&&S==="paused"?f:null,expected:_&&S==="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 No(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(`
|
|
1095
1095
|
`)}
|
|
1096
|
-
`}function xI(t){let e=[],r=$I(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 $I(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Ao(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
|
|
1096
|
+
`}function xI(t){let e=[],r=$I(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 $I(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Ao(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?jp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=x=>c.schema==="v3"&&c.nameToId.has(x)?c.nameToId.get(x):x,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let x of d)f.set(u(x.state_name),x);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let x of m)p.set(u(x.state_name),x);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 x of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
|
|
1097
1097
|
FROM session_event
|
|
1098
1098
|
WHERE run_id = ? AND step_id IS NOT NULL
|
|
1099
1099
|
GROUP BY step_id`,e))x.step_id!==null&&h.set(x.step_id,x.timestamp_ms);let _=jI(c,d,u),T=NI(s.current_state),S=t.query(`SELECT kind, severity, payload
|
|
@@ -1101,9 +1101,9 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1101
1101
|
WHERE run_id = ?
|
|
1102
1102
|
AND kind = 'session_hung'
|
|
1103
1103
|
AND acknowledged_at IS NULL
|
|
1104
|
-
ORDER BY id ASC`,e).map(x=>({kind:x.kind,severity:x.severity,payload:DI(x.payload)})),v=_.map(x=>{let k=f.get(x),R=p.get(x),C=AI(s,x,T,k,R),q=k===void 0?null:Date.parse(k.started_at),te=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),j=k===void 0||Number.isNaN(q??NaN)?null:te!==null&&!Number.isNaN(te)?te-q:C==="running"||C==="paused"?n-q:null,H=k===void 0?null:h.get(k.id)??null,me=PI(R?.last_activity_at??null,H,g),I=o===null||R===void 0?void 0:LI(t,s.team_id,o.definition,R.state_name,k?.state_name??x);return{step_id:k?.id??null,state_id:x,status:C,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:me,elapsed_ms:j,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.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:OI(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:RI(v,s.terminal_state!==null),related_attentions:S}}function Ro(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} (${
|
|
1104
|
+
ORDER BY id ASC`,e).map(x=>({kind:x.kind,severity:x.severity,payload:DI(x.payload)})),v=_.map(x=>{let k=f.get(x),R=p.get(x),C=AI(s,x,T,k,R),q=k===void 0?null:Date.parse(k.started_at),te=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),j=k===void 0||Number.isNaN(q??NaN)?null:te!==null&&!Number.isNaN(te)?te-q:C==="running"||C==="paused"?n-q:null,H=k===void 0?null:h.get(k.id)??null,me=PI(R?.last_activity_at??null,H,g),I=o===null||R===void 0?void 0:LI(t,s.team_id,o.definition,R.state_name,k?.state_name??x);return{step_id:k?.id??null,state_id:x,status:C,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:me,elapsed_ms:j,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.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:OI(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:RI(v,s.terminal_state!==null),related_attentions:S}}function Ro(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${gp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${_p(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":_p(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Oo(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${gp(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${FI(a.payload)}`)}return`${n.join(`
|
|
1105
1105
|
`)}
|
|
1106
|
-
`}function jI(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 NI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function AI(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 RI(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 OI(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 LI(t,e,r,n,s){let o=CI(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:ke(i)}}function CI(t,e,r){let n=MI(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Kt(a)?a.id===e||a.name===e||a.name===r:!1),o=Kt(s?.members)?s.members:null,i=o!==null&&Kt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Kt(n.states)){let s=n.states[e]??n.states[r];if(!Kt(s))return null;let o=Kt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function MI(t){try{let e=JSON.parse(t);return Kt(e)?e:null}catch{return null}}function DI(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Kt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PI(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function
|
|
1106
|
+
`}function jI(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 NI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function AI(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 RI(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 OI(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 LI(t,e,r,n,s){let o=CI(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:ke(i)}}function CI(t,e,r){let n=MI(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Kt(a)?a.id===e||a.name===e||a.name===r:!1),o=Kt(s?.members)?s.members:null,i=o!==null&&Kt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Kt(n.states)){let s=n.states[e]??n.states[r];if(!Kt(s))return null;let o=Kt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function MI(t){try{let e=JSON.parse(t);return Kt(e)?e:null}catch{return null}}function DI(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Kt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PI(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function _p(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Oo(Math.max(0,n-r)).padEnd(6)}]`}function gp(t,e){return Number.isNaN(t)?"?":Oo(Math.max(0,e-t))}function Oo(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 FI(t){if(!Kt(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"?`, ${Oo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Ip,Nt=E(()=>{"use strict";Pe();Ip=`SELECT a.id AS attention_id,
|
|
1107
1107
|
a.kind AS kind,
|
|
1108
1108
|
a.severity AS severity,
|
|
1109
1109
|
a.created_at AS created_at,
|
|
@@ -1125,11 +1125,11 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1125
1125
|
ON isess.run_id = a.run_id
|
|
1126
1126
|
AND isess.id = (
|
|
1127
1127
|
SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
|
|
1128
|
-
)`});var
|
|
1128
|
+
)`});var Jp={};le(Jp,{parseApiArgs:()=>Lp,readApiClientConfig:()=>Hn,runApi:()=>JI});import{readFileSync as UI}from"node:fs";import{basename as WI,extname as BI}from"node:path";async function JI(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(HI),0;if(t[0]==="config")return GI(t.slice(1),e);let r=qp(t,"--direct");if(r.rest[0]==="escalations")return VI(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Mo(r.rest.slice(2)))return e.stdout.write(`${ZI}
|
|
1129
1129
|
`),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
|
|
1130
1130
|
`),2):Xx(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Mo(r.rest.slice(2)))return e.stdout.write(`${zI}
|
|
1131
1131
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Mo(r.rest.slice(2)))return e.stdout.write(`${YI}
|
|
1132
|
-
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?Bx(r.rest.slice(2),e):qx(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?Hx(r.rest.slice(2),e):Jx(r.rest.slice(2),e);if(r.present)return xx(r.rest,e);let n=
|
|
1132
|
+
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?Bx(r.rest.slice(2),e):qx(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?Hx(r.rest.slice(2),e):Jx(r.rest.slice(2),e);if(r.present)return xx(r.rest,e);let n=Lp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1133
1133
|
`),2;let s=Tr(e),o=s.baseUrl,i=Yt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=ix(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1134
1134
|
`),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)}
|
|
1135
1135
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
@@ -1140,7 +1140,7 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1140
1140
|
`):e.stdout.write(`${JSON.stringify(f)}
|
|
1141
1141
|
`)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1142
1142
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1143
|
-
`));return 0}function
|
|
1143
|
+
`));return 0}function Lp(t){let e=Dp(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"?Co(o,"/api/status",n):s==="projects"?Co(o,"/api/projects",n):s==="teams"?Co(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?_x(o.slice(1),e.format):Co(o,"/api/workflows",n):s==="workflow"?hx(o,n):s==="upload"?mx(o,n):s==="submit-job"?px(o,n):s==="issues"?fx(o,n):s==="jobs"?qn(o,"--status","/api/jobs","status",n):s==="job"?dx(o,n):s==="project"?gx(o,n):s==="artifact"?Ex(o,n):s==="runs"?qn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?qn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Ap(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?bx(o,n):Ap(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Sx(o,n):s==="daemon"?Tx(o,n):s==="intake"?kx(o,n):s==="session"?vx(o,n):s==="run"?Ix(o,e.format):s==="prs"?qn(o,"--status","/api/submitted-prs","status",n):s==="pr"?cx(o,n):`unknown subcommand: ${s}`}function Yt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Tr(t){if(t.dal!==void 0)return Hn(t.dal,process.env,t);let e=pe({path:ce()});try{return Hn(e,process.env,t)}finally{e.close()}}function Hn(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=qI;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: ${XI(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1144
1144
|
`);return{baseUrl:o,token:a}}function XI(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 GI(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1145
1145
|
`),2;let s=e.dal===void 0,o=e.dal??pe({path:ce()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
1146
1146
|
`),2;let i=n[0];if(!Lo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Lo].join(", ")})
|
|
@@ -1149,18 +1149,18 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1149
1149
|
`),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
|
|
1150
1150
|
`),2;let[i,a]=n;if(!Lo.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Lo].join(", ")})
|
|
1151
1151
|
`),2;let l=ox(i,a);return l!==null?(e.stderr.write(`error: ${l}
|
|
1152
|
-
`),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${
|
|
1152
|
+
`),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Np(i,a,!1)}
|
|
1153
1153
|
`),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}
|
|
1154
1154
|
`),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
|
|
1155
|
-
`),0;for(let c of l)e.stdout.write(`${c} = ${
|
|
1155
|
+
`),0;for(let c of l)e.stdout.write(`${c} = ${Np(c,a[c],i)}
|
|
1156
1156
|
`);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
|
|
1157
1157
|
`),2}finally{s&&o.close()}}async function VI(t,e,r){if(Mo(t))return e.stdout.write(`${KI}
|
|
1158
|
-
`),0;let n=
|
|
1158
|
+
`),0;let n=qp(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>
|
|
1159
1159
|
`),2):s?QI(i,a,e):i==="list"?tx(a,e):i==="show"?nx(a,e):i==="respond"?sx(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
|
|
1160
|
-
`),2)}function Mo(t){return t.some(e=>e==="--help"||e==="-h")}function QI(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ce()});try{return
|
|
1160
|
+
`),2)}function Mo(t){return t.some(e=>e==="--help"||e==="-h")}function QI(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ce()});try{return Hp(s,[t,...e],r)}finally{n&&s.close()}}function Cp(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=ex(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function ex(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 tx(t,e){let r=Cp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1161
1161
|
`),2;let n=Tr(e),s=Yt("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)}
|
|
1162
1162
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1163
|
-
`),a.status===400?2:1;let l=await a.json();return
|
|
1163
|
+
`),a.status===400?2:1;let l=await a.json();return Mp(l,r.json,e)}function Mp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
|
|
1164
1164
|
`),0;if(t.length===0)return r.stdout.write(`No pending escalations.
|
|
1165
1165
|
`),0;r.stdout.write(`${t.length} pending escalation${t.length===1?"":"s"}:
|
|
1166
1166
|
|
|
@@ -1183,32 +1183,32 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1183
1183
|
`),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
|
|
1184
1184
|
`),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
|
|
1185
1185
|
`):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
|
|
1186
|
-
`),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 ox(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===So||t===To){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function ix(t,e){let r=UI(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:ax(t)}),WI(t)),e!==void 0&&s.append("project",e),s}function ax(t){switch(BI(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 lx(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 cx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return qn(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 Mp(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 Co(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function qn(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 re(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 Np(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function ux(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function dx(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return ux([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 re(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=sc(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=ne(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 fx(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 re(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=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Dp(n,e):r==="claim"?Pp(n,e):r==="claim-next"?Fp(n,e):r==="close"?Up(n,e):r==="reopen"?Wp(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Dp(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=sc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(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 Pp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(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=ne(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return re(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 Fp(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=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(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 Up(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=ne(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=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Wp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(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=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function mx(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 re(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 px(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 re(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 sc(t){try{return JSON.parse(t)}catch{return t}}function hx(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 _x(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function gx(t,e){let[r,n,...s]=t;return r==="workflow"?wx([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 wx(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=ne(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=ne(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=yx(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 yx(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=sc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function Ex(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=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(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 bx(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Sx(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 Tx(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 kx(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 vx(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=Eo(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 Ix(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(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=ne(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 re(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=ne(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=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(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=ne(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 re(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=ne(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=ne(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 ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function Bp(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=Mp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1186
|
+
`),0}function Np(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function ox(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===So||t===To){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function ix(t,e){let r=UI(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:ax(t)}),WI(t)),e!==void 0&&s.append("project",e),s}function ax(t){switch(BI(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 lx(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 cx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return qn(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 Dp(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 Co(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function qn(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 re(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 Ap(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function ux(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function dx(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return ux([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 re(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=sc(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=ne(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 fx(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 re(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=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Pp(n,e):r==="claim"?Fp(n,e):r==="claim-next"?Up(n,e):r==="close"?Wp(n,e):r==="reopen"?Bp(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Pp(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=sc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(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 Fp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(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=ne(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return re(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 Up(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=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(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 Wp(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=ne(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=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Bp(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(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=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function mx(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 re(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 px(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 re(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 sc(t){try{return JSON.parse(t)}catch{return t}}function hx(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 _x(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function gx(t,e){let[r,n,...s]=t;return r==="workflow"?wx([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 wx(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=ne(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=ne(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=yx(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 yx(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=sc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function Ex(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=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(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 bx(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Sx(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 Tx(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 kx(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 vx(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=Eo(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 Ix(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(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=ne(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 re(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=ne(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=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(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=ne(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 re(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=ne(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=ne(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 ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function qp(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=Dp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1187
1187
|
`),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)
|
|
1188
1188
|
`),2;let a=e.dal===void 0,l=e.dal??pe({path:ce()});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)
|
|
1189
1189
|
`),2):c==="create"?$x(l,u,e,s):c==="claim"?jx(l,u,e,s):c==="claim-next"?Nx(l,u,e,s):c==="close"?Ax(l,u,e,s):c==="reopen"?Rx(l,u,e,s):c==="list"?Mx(l,u,e,s):c==="show"?Dx(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
1190
|
-
`),2)}return o==="status"?Px(l,i,e,s):o==="projects"?Fx(l,i,e,s):o==="workflows"?Ux(l,i,e,s):o==="runs"?Wx(l,i,e,s):o==="attentions"||o==="attention"?Gx(l,i,e,s):o==="escalations"?
|
|
1190
|
+
`),2)}return o==="status"?Px(l,i,e,s):o==="projects"?Fx(l,i,e,s):o==="workflows"?Ux(l,i,e,s):o==="runs"?Wx(l,i,e,s):o==="attentions"||o==="attention"?Gx(l,i,e,s):o==="escalations"?Hp(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)
|
|
1191
1191
|
`),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
1192
1192
|
`),1}finally{a&&l.close()}}function Je(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
|
|
1193
|
-
`)}function $x(t,e,r,n){let s=
|
|
1193
|
+
`)}function $x(t,e,r,n){let s=Pp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1194
1194
|
`),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}
|
|
1195
1195
|
`),1;let a=JSON.parse(s.body),l=Ox(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
|
|
1196
1196
|
`),2;let c=Lx(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
|
|
1197
|
-
`),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 jx(t,e,r,n){let s=
|
|
1197
|
+
`),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 jx(t,e,r,n){let s=Fp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1198
1198
|
`),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}
|
|
1199
1199
|
`),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})
|
|
1200
|
-
`),1):(Je(r,l,n),0)}function Nx(t,e,r,n){let s=
|
|
1200
|
+
`),1):(Je(r,l,n),0)}function Nx(t,e,r,n){let s=Up(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1201
1201
|
`),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}
|
|
1202
|
-
`),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 Ax(t,e,r,n){let s=
|
|
1202
|
+
`),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 Ax(t,e,r,n){let s=Wp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1203
1203
|
`),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}
|
|
1204
1204
|
`),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
|
|
1205
|
-
`),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function Rx(t,e,r,n){let s=
|
|
1205
|
+
`),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function Rx(t,e,r,n){let s=Bp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
|
|
1206
1206
|
`),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}
|
|
1207
1207
|
`),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
|
|
1208
|
-
`),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function Ox(t){if(t!=null)return typeof t=="string"&&
|
|
1208
|
+
`),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function Ox(t){if(t!=null)return typeof t=="string"&&Op.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Lx(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 Mx(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]
|
|
1209
1209
|
`),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}
|
|
1210
|
-
`),2;if(f==="--status"){let p=
|
|
1211
|
-
`),2;i=p}else if(f==="--severity"){let p=
|
|
1210
|
+
`),2;if(f==="--status"){let p=Rp(m,Cx);if(typeof p=="string")return r.stderr.write(`error: ${p}
|
|
1211
|
+
`),2;i=p}else if(f==="--severity"){let p=Rp(m,Op);if(typeof p=="string")return r.stderr.write(`error: ${p}
|
|
1212
1212
|
`),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${re(f)}
|
|
1213
1213
|
`),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
|
|
1214
1214
|
`),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 Dx(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
|
|
@@ -1250,9 +1250,9 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1250
1250
|
`):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1251
1251
|
`)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
|
|
1252
1252
|
`),i.status===400?2:1)}function Gx(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(o)}
|
|
1253
|
-
`),2}return Je(r,zt(t,{unacked:s}),n),0}function
|
|
1254
|
-
`),2;if(n==="list"){let o=
|
|
1255
|
-
`),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=jo(t,i);return
|
|
1253
|
+
`),2}return Je(r,zt(t,{unacked:s}),n),0}function Hp(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1254
|
+
`),2;if(n==="list"){let o=Cp(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1255
|
+
`),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=jo(t,i);return Mp(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]
|
|
1256
1256
|
`),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1257
1257
|
`),2;let a=_t(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
|
|
1258
1258
|
`),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
|
|
@@ -1270,12 +1270,12 @@ ${r}`:r}function o0(t){let e=[...t.matchAll(e0)];if(e.length>0){let r=e[e.length
|
|
|
1270
1270
|
`),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})
|
|
1271
1271
|
`),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)}
|
|
1272
1272
|
`):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
|
|
1273
|
-
`),0}function
|
|
1273
|
+
`),0}function Rp(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 qI,HI,Op,Lo,KI,zI,YI,ZI,Cx,oc=E(()=>{"use strict";Pe();Ve();bo();Zl();Nt();qI="http://127.0.0.1:8787",HI=`usage: lmctl api [--direct] <subcommand> ...
|
|
1274
1274
|
|
|
1275
1275
|
Call the lmctl HTTP API using the configured daemon URL/token. Some
|
|
1276
1276
|
workflow shellstep-safe commands also support --direct to use the local DAL
|
|
1277
1277
|
without an HTTP round trip.
|
|
1278
|
-
`,
|
|
1278
|
+
`,Op=["low","medium","high","critical"];Lo=new Set(["api.url","api.port","api.token","project.docroot",So,To]);KI=`usage: lmctl api escalations <list|show|respond>
|
|
1279
1279
|
|
|
1280
1280
|
list [--project P] [--all] [--since DURATION] [--json]
|
|
1281
1281
|
Print pending operator escalations (interactive_waiting_operator
|
|
@@ -1300,7 +1300,7 @@ without an HTTP round trip.
|
|
|
1300
1300
|
|
|
1301
1301
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
1302
1302
|
and report the first step that would be started. Default output is the TTY
|
|
1303
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;Cx=["open","assigned","closed","reopened"]});import{existsSync as
|
|
1303
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;Cx=["open","assigned","closed","reopened"]});import{existsSync as Xp,mkdirSync as Kx,readdirSync as zx,readFileSync as Gp,writeFileSync as Yx}from"node:fs";import{join as Vr}from"node:path";import{fileURLToPath as Zx}from"node:url";function Jn(t){try{return Qx.some(e=>Xp(Vr(t,e)))}catch{return!1}}function e$(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 Do(t,e){t.durable_memory_mode!=="db"?t$(t):r$(t,e)}function Vp(t){let e=Jn(t),r;try{r=zx(ic).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 t$(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Vr(e,"durable-memory");try{Kx(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Vp(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Vr(r,i);if(!Xp(a))try{let l=Gp(Vr(ic,o),"utf8");Yx(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 r$(t,e){let r=t.local_path??"",n=Vp(r),s=[];for(let o of n){let i=Vr(ic,o),a;try{a=Gp(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=e$(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 ic,Qx,Xn=E(()=>{"use strict";ic=Vr(Zx(import.meta.url),"../../config/durable_memory_templates"),Qx=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as n$,mkdirSync as s$,readdirSync as o$,readFileSync as i$,writeFileSync as a$}from"node:fs";import{join as Po}from"node:path";import{fileURLToPath as l$}from"node:url";function Fo(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Jn(e))return;let r=Po(e,"ai-test");try{s$(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of c$()){let o=s.replace(/\.template$/,""),i=Po(r,o);if(!n$(i))try{a$(i,u$(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 c$(){try{return o$(Kp).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function u$(t){try{return i$(Po(Kp,t),"utf8")}catch{return d$(t)}}function d$(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
|
|
1304
1304
|
|
|
1305
1305
|
Add test chapters in this directory.
|
|
1306
1306
|
`:`---
|
|
@@ -1322,7 +1322,7 @@ last_run_id: 0
|
|
|
1322
1322
|
## Expected
|
|
1323
1323
|
|
|
1324
1324
|
## Cleanup
|
|
1325
|
-
`}var
|
|
1325
|
+
`}var Kp,ac=E(()=>{"use strict";Xn();Kp=Po(l$(import.meta.url),"../../config/ai_test_templates")});var Kr,lc=E(()=>{"use strict";Kr=`---
|
|
1326
1326
|
|
|
1327
1327
|
# Durable memory \u2014 how to use it
|
|
1328
1328
|
|
|
@@ -1333,21 +1333,21 @@ ON EVERY NEW TASK:
|
|
|
1333
1333
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
1334
1334
|
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.
|
|
1335
1335
|
|
|
1336
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Uo(t){return f$.has(t)}function uc(){return cc===null&&(cc=pt(ht())),cc}function dc(t,e){if(!Uo(t))return null;try{let r=uc().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...
|
|
1337
|
-
`,"utf8"),h$(n,r)}function T$(t,e){if(
|
|
1336
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Uo(t){return f$.has(t)}function uc(){return cc===null&&(cc=pt(ht())),cc}function dc(t,e){if(!Uo(t))return null;try{let r=uc().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...zp[t]??[]]}catch{return null}}function zr(t,e){let r=dc(t,e);return r===null?null:r.join(" ")}function kr(t,e){return uc().getSession(t,e)}async function Wo(t){return(await uc().resolveSessions(t)).map(r=>r.provider.name)}var zp,f$,Yp,cc,Yr=E(()=>{"use strict";jt();zp={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},f$=new Set(Object.keys(zp)),Yp=/^[\w.:-]+$/;cc=null});import{createHash as m$}from"node:crypto";import{existsSync as Gn,mkdirSync as Qp,readFileSync as qo,readdirSync as p$,renameSync as h$,statSync as _$,unlinkSync as g$,writeFileSync as Bo}from"node:fs";import{homedir as w$}from"node:os";import{dirname as mc,isAbsolute as Zp,join as ze,relative as y$,resolve as Zr}from"node:path";import{fileURLToPath as E$}from"node:url";function th(t){let e=Zr(t);for(;;){let r=ze(e,pc);try{if(_$(r).isDirectory())return r}catch{}let n=mc(e);if(n===e)return null;e=n}}function Ho(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return Zr(e);let r=th(t);return r!==null?r:ze(eh(),pc)}function rh(t){return ze(Ho(t),"templates","workflows")}function nh(){return Zr(mc(E$(import.meta.url)),"..","..","workflows")}function b$(t){let e=ze(t,sh);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 S$(t,e){Qp(t,{recursive:!0});let r=ze(t,sh),n=`${r}.tmp-${process.pid}`;Bo(n,`${JSON.stringify(e,null,2)}
|
|
1337
|
+
`,"utf8"),h$(n,r)}function T$(t,e){if(Zp(e)||mc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=Zr(t,"templates","workflows"),s=Zr(t,"templates",e),o=y$(n,s);return o.length===0||o.startsWith("..")||Zp(o)||o.includes("/")||o.includes("\\")?null:s}function k$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=T$(t,n);if(o===null){delete e.files[n];continue}if(!Gn(o)){delete e.files[n];continue}try{if(fc(qo(o))!==s)continue;g$(o),delete e.files[n]}catch{}}}function Jo(t={}){let e=Ho(t.cwd),r=ze(e,"templates","workflows"),n=nh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=Gn(n)?p$(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;Qp(r,{recursive:!0});let i=b$(e),a=nt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=qo(ze(n,c)),f=fc(d),m=ze(r,c);if(!Gn(m)){try{Bo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=fc(qo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Bo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Bo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}k$(e,i,l),S$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function hc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(Zr(r));let n=th(t??process.cwd());return n!==null&&e.push(n),e.push(ze(eh(),pc)),e}function Xo(t,e){let r=hc(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(Gn(i))return i}for(let s of n){let o=ze(nh(),s);if(Gn(o))return o}return null}var pc,eh,fc,sh,Go=E(()=>{"use strict";jn();pc=".lmctl",eh=()=>process.env.HOME??w$(),fc=t=>m$("sha256").update(t).digest("hex");sh=".dist-manifest.json"});import{createHash as v$}from"node:crypto";import{existsSync as I$,mkdirSync as x$,writeFileSync as $$}from"node:fs";import{dirname as j$,join as Qr}from"node:path";function Zt(t){return typeof t=="string"&&t.startsWith(oh)}function C$(t){if(!Zt(t))throw new it(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(oh.length),r=e.indexOf("/");if(r<=0)throw new it(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!O$.has(n))throw new it(`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 it(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new it(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function M$(t,e,r){if(t==="workflow")return Xo(e,r);let n=t==="mcp"?Qr("templates","mcp",`${e}.json`):Qr("templates","skills",e,"SKILL.md");for(let s of hc(r)){let o=Qr(s,n);if(I$(o))return o}return null}function D$(t,e,r){let n=Qr(Ho(r),A$,t);return t==="skill"?Qr(n,e,"SKILL.md"):Qr(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function P$(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 Vn(t,e){let{kind:r,name:n,ref:s}=C$(t),o=M$(r,n,e);if(o!==null)return o;let i=`${N$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(R$)})}catch(u){throw new it(`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 it(`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=L$.exec(s);if(u!==null){let d=v$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new it(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!P$(r,l))throw new it(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=D$(r,n,e);return x$(j$(c),{recursive:!0}),$$(c,l,"utf8"),c}var oh,N$,A$,R$,O$,it,L$,_c=E(()=>{"use strict";Go();oh="lmctl://",N$="https://lmctl.com/templates/",A$=".cache",R$=8e3,O$=new Set(["workflow","mcp","skill"]),it=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},L$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as F$,mkdirSync as U$,readFileSync as W$,renameSync as B$,unlinkSync as q$,writeFileSync as H$}from"node:fs";import{homedir as lh}from"node:os";import{dirname as Kn,join as Ue,resolve as J$}from"node:path";function wc(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function G$(t){let e=Ue(t,".mcp.json"),r=wc();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
|
|
1338
1338
|
`,"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=at(n.mcpServers)?{...n.mcpServers}:{},o=at(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)+`
|
|
1339
|
-
`,"utf8"),!0)}function yc(t,e){if(t==="copilot"){let n=V$();return n.present&&z$(e,zn),n}let r=Ue(e,".mcp.json");try{let n=G$(e);return{scope:"workspace",path:r,changed:n,present:
|
|
1339
|
+
`,"utf8"),!0)}function yc(t,e){if(t==="copilot"){let n=V$();return n.present&&z$(e,zn),n}let r=Ue(e,".mcp.json");try{let n=G$(e);return{scope:"workspace",path:r,changed:n,present:ih(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:ih(e),error:n instanceof Error?n.message:String(n)}}}function Ko(t,e,r,n,s){if(!e)return;let o=yc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
|
|
1340
1340
|
`),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||t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
|
|
1341
|
-
`)}function zo(t,e,r){let n=Kn(J$(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([Qt]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(zn),er(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)Y$(i)}function V$(){let t=Yo();try{let{changed:e}=Ec(t,{[zn]:wc()});return{scope:"copilot-user",path:t,changed:e,present:gc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:gc(t),error:e instanceof Error?e.message:String(e)}}}function Yo(t=lh
|
|
1342
|
-
`,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function K$(t,e){be.mkdirSync(Kn(t),{recursive:!0});let r=Ue(Kn(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
|
|
1343
|
-
`)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function
|
|
1344
|
-
`,"utf8")}function hj(t,e){let r={};for(let n of t)r[n.name]=Qo(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{Ec(Yo(en()),r)}catch(n){throw new Ze(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function _j(t){if(typeof t!="string")return t.name;let e=
|
|
1345
|
-
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await cj(c,r.alias));if(o==="opencode")pj(l);else if(o==="copilot")hj(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(uj(o,dj(o,c.name),i),o==="claude"){let{name:u,...d}=c;Zo("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Zo("codex",mj(c),i,r.alias):Zo(o,fj(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(ij.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=tj(Ye(sj(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!kc.test(c)?c:(await
|
|
1341
|
+
`)}function zo(t,e,r){let n=Kn(J$(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([Qt]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(zn),er(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)Y$(i)}function V$(){let t=Yo();try{let{changed:e}=Ec(t,{[zn]:wc()});return{scope:"copilot-user",path:t,changed:e,present:gc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:gc(t),error:e instanceof Error?e.message:String(e)}}}function Yo(t=ch??lh()){return Ue(t,".copilot","mcp-config.json")}function Ec(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!at(o))throw new Error(`${t} is not a JSON object`);r=o}let n=at(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=at(n[o])?n[o]:void 0;fh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,uh(t,r),{changed:!0}):{changed:!1}}function uh(t,e){be.mkdirSync(Kn(t),{recursive:!0});let r=Ue(Kn(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
1342
|
+
`,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function K$(t,e){be.mkdirSync(Kn(t),{recursive:!0});let r=Ue(Kn(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 ih(t){return gc(Ue(t,".mcp.json"))}function z$(t,e){let r=Ue(t,".mcp.json");er(r,"mcpServers",[e])}function er(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!at(n)||!at(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,uh(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function Y$(t){let e=ch??lh();switch(t){case"copilot":er(Yo(e),"mcpServers",[Qt]);return;case"claude":er(Ue(e,".claude.json"),"mcpServers",[Qt]);return;case"gemini":er(Ue(e,".gemini","settings.json"),"mcpServers",[Qt]);return;case"qwen":er(Ue(e,".qwen","settings.json"),"mcpServers",[Qt]);return;case"agy":er(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Qt]);return;case"opencode":er(Ue(e,".config","opencode","opencode.json"),"mcp",[Qt]);return;case"codex":Z$(Ue(e,".codex","config.toml"),Qt);return;default:return}}function Z$(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=Q$(a);if(l===null)return;if(l!==void 0){if(ah(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=ej(a);if(c===null)return;if(c!==void 0&&ah(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;K$(t,s.join(`
|
|
1343
|
+
`)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function ah(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function Q$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:dh(e[1])}function ej(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 dh(r)}function dh(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 gc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!at(e)||!at(e.mcpServers))return!1;let r=at(e.mcpServers[zn])?e.mcpServers[zn]:void 0;return fh(r,wc())}catch{return!1}}function fh(t,e){return t!==void 0&&Vo(t)===Vo(e)}function Vo(t){return Array.isArray(t)?`[${t.map(e=>Vo(e)).join(",")}]`:at(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${Vo(t[e])}`).join(",")}}`:JSON.stringify(t)}function at(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var zn,Qt,X$,be,ch,Yn=E(()=>{"use strict";Oe();zn="lmctl",Qt="lmctl0",X$={existsSync:F$,mkdirSync:U$,readFileSync:W$,writeFileSync:H$,renameSync:B$,unlinkSync:q$},be=X$});import{spawnSync as wh}from"node:child_process";import{cpSync as mh,existsSync as Tc,mkdirSync as yh,mkdtempSync as tj,readFileSync as Eh,statSync as rj,writeFileSync as bc}from"node:fs";import{homedir as nj,tmpdir as sj}from"node:os";import{basename as ph,join as Ye}from"node:path";function At(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Sc(t,e,r){if(Array.isArray(t)){for(let n of t)Sc(n,e,r);return}if(At(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))Sc(n,e,r)}}function lj(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(!(!At(a)||!Array.isArray(a.steps)))for(let l of a.steps)At(l)&&l.members!==void 0&&Sc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(aj(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function bh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(oj)})}catch(s){throw new Ze(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Ze(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>hh)throw new Ze(e,`fetched ${t} exceeds ${hh} bytes`);return n}async function cj(t,e){if(typeof t!="string")return[t];Zt(t)&&(t=await Vn(t));let r;if(kc.test(t))r=await bh(t,e);else{if(!Tc(t))throw new Ze(e,`mcp file not found: ${t}`);r=Eh(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Ze(e,`mcp source is not JSON: ${t}`)}if(At(n)&&At(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...At(o)?o:{}}));if(At(n)&&typeof n.name=="string")return[n];throw new Ze(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Qo(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Zo(t,e,r,n){let s=wh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Ze(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Ze(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function uj(t,e,r){wh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function dj(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function fj(t){let e=["mcp","add"];if(Qo(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 mj(t){if(Qo(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 pj(t){let e=Ye(process.env.XDG_CONFIG_HOME??Ye(en(),".config"),"opencode"),r=Ye(e,"opencode.json"),n={};if(Tc(r))try{let o=JSON.parse(Eh(r,"utf8"));At(o)&&(n=o)}catch{}let s=At(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Qo(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"),yh(e,{recursive:!0}),bc(r,`${JSON.stringify(n,null,2)}
|
|
1344
|
+
`,"utf8")}function hj(t,e){let r={};for(let n of t)r[n.name]=Qo(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{Ec(Yo(en()),r)}catch(n){throw new Ze(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function _j(t){if(typeof t!="string")return t.name;let e=ph(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?ph(t.replace(/\/skill\.md$/i,"")):e}async function _h(t,e,r){let n=_j(t),s=Ye(e,n);if(yh(s,{recursive:!0}),typeof t!="string")return bc(Ye(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(Zt(t)&&(t=await Vn(t)),kc.test(t))return bc(Ye(s,"SKILL.md"),await bh(t,r),"utf8"),{name:n,dir:s};if(!Tc(t))throw new Ze(r,`skill path not found: ${t}`);return rj(t).isDirectory()?(mh(t,s,{recursive:!0}),{name:n,dir:s}):(mh(t,Ye(s,"SKILL.md")),{name:n,dir:s})}async function ei(t){let{dal:e,member:r,stderr:n}=t,s=lj(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=ke(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
1345
|
+
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await cj(c,r.alias));if(o==="opencode")pj(l);else if(o==="copilot")hj(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(uj(o,dj(o,c.name),i),o==="claude"){let{name:u,...d}=c;Zo("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Zo("codex",mj(c),i,r.alias):Zo(o,fj(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(ij.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=tj(Ye(sj(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!kc.test(c)?c:(await _h(c,l,r.alias)).dir;Zo(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(gh[o]!==void 0){let l=gh[o]();for(let c of s.skills)await _h(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 Ze,kc,oj,hh,ij,aj,en,gh,vc=E(()=>{"use strict";Pe();_c();Yn();Ze=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},kc=/^https?:\/\//i,oj=8e3,hh=1e6,ij=new Set(["opencode"]),aj=t=>JSON.stringify(t),en=()=>process.env.HOME??nj();gh={claude:()=>Ye(en(),".claude","skills"),qwen:()=>Ye(en(),".qwen","skills"),codex:()=>Ye(en(),".codex","skills"),copilot:()=>Ye(en(),".copilot","skills")}});async function X(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ce()});try{return await e(r)}finally{r.close()}}function P(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 W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1346
1346
|
`)}function w(t,e){return t.stderr.write(`error: ${e}
|
|
1347
1347
|
`),1}function fe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
1348
|
-
`),2}var xe=E(()=>{"use strict";Pe();Ve()});var
|
|
1348
|
+
`),2}var xe=E(()=>{"use strict";Pe();Ve()});var Ih={};le(Ih,{defaultTeamNameForProject:()=>Cj,resolveAlias:()=>ni,resolveProject:()=>ti,resolveTeam:()=>ri,runCode:()=>yj});import{execFileSync as gj}from"node:child_process";import{basename as wj,resolve as Sh}from"node:path";import*as xc from"node:readline";import{setTimeout as Ic}from"node:timers/promises";async function yj(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return Ej(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return kh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return jj(e);try{return await X(e,async s=>{switch(r){case"team":return bj(n,e,s);case"chat":return Ij(n,e,s);case"spec":return xj(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function Ej(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(`
|
|
1349
1349
|
`)),0}function bj(t,e,r){let[n,...s]=t;switch(n){case"add":return Sj(s,e,r);case"list":return Tj(s,e,r);case"show":return kj(s,e,r);case"rm":return vj(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function Sj(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=N(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=tn(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")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
|
|
1350
|
-
`),0}function Tj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=tn(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=
|
|
1350
|
+
`),0}function Tj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=tn(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=vh(r.listTeamMembers(s.team.id));if(M(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${ke(i)} ${i.sessionid??"(unseeded)"}
|
|
1351
1351
|
`);return 0}function kj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=tn(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"?w(e,`member not found: ${s}`):(M(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
|
|
1352
1352
|
`),e.stdout.write(`role: ${i.role}
|
|
1353
1353
|
`),e.stdout.write(`provider: ${ke(i)}
|
|
@@ -1355,13 +1355,13 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1355
1355
|
`),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
|
|
1356
1356
|
`),e.stdout.write(`sessiondir: ${i.sessiondir}
|
|
1357
1357
|
`)),0)}function vj(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=tn(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 w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
|
|
1358
|
-
`),0}async function Ij(t,e,r){if(t.includes("--help")||t.includes("-h"))return
|
|
1358
|
+
`),0}async function Ij(t,e,r){if(t.includes("--help")||t.includes("-h"))return kh(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=tn(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=ni(e,r,s.team,N(n,"--alias"));if(typeof o=="number")return o;let i=await Lj(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
|
|
1359
1359
|
`);let a=e.stdin??process.stdin,l=xc.createInterface({input:a,terminal:!1}),c=i;Zn(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Zn(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
|
|
1360
1360
|
`),0;if(d==="/help"){Oj(e),Zn(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
|
|
1361
1361
|
`),Zn(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
|
|
1362
1362
|
`);let f=await Hr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
|
|
1363
|
-
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),Zn(e,c,s.project)}}finally{l.close()}return 0}async function xj(t,e,r){let n=P(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=tn(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??
|
|
1364
|
-
`),Nj(e,m,p.id)}function $j(t,e){let r=Hn(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 jj(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${
|
|
1363
|
+
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),Zn(e,c,s.project)}}finally{l.close()}return 0}async function xj(t,e,r){let n=P(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=tn(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??Th,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=N(n,"--slug")??Rj(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=$j(r,e),p=await Qn(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}
|
|
1364
|
+
`),Nj(e,m,p.id)}function $j(t,e){let r=Hn(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 jj(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Th}`," --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(`
|
|
1365
1365
|
`)),0}async function Nj(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await Qn(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)"}
|
|
1366
1366
|
`),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)"}
|
|
1367
1367
|
`),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await Aj(t,e,r,n);if(i!=="continue")return i;continue}await Ic(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
|
|
@@ -1369,34 +1369,34 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1369
1369
|
`),await Ic(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
|
|
1370
1370
|
`),await Ic(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
|
|
1371
1371
|
`);let a=xc.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}
|
|
1372
|
-
`),0;if(c==="/done")return await Qn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Qn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Qn(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 Rj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function
|
|
1372
|
+
`),0;if(c==="/done")return await Qn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Qn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Qn(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 Rj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function kh(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(`
|
|
1373
1373
|
`)),0}function Oj(t){t.stderr.write(`commands: /help, /exit
|
|
1374
|
-
`)}function Zn(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function ti(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=gj("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=
|
|
1374
|
+
`)}function Zn(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function ti(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=gj("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Sh(s),i=e.listProjects().find(a=>Sh(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function ri(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function ni(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=vh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function tn(t,e,r,n){let s=ti(t,e,r);if(typeof s=="number")return s;let o=ri(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function vh(t){return t.filter(e=>e.state!=="retired")}async function Lj(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
|
|
1375
1375
|
`),Do(r,e),Fo(r);let s=await Jr({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=zr(ke(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
|
|
1376
1376
|
${i}
|
|
1377
1377
|
`),await ei({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
|
|
1378
1378
|
|
|
1379
|
-
${Kr}`:Kr;return e.setMemberPromptSnapshot(o.id,l)??o}function Cj(t){return`${wj(t.local_path)}-code`}var Sh,$c=E(()=>{"use strict";Un();yo();Xn();ac();lc();Pe();Yr();vc();xe();oc();Sh="spec-driven-task"});import Ih from"jexl";function tr(t){Ih.compile(xh(t))}async function vr(t,e){return Ih.eval(xh(t),e)}function xh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var rn=E(()=>{"use strict"});import{z as y}from"zod";function Cc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var Mj,$h,jc,Nc,Ac,Rc,Oc,Lc,jh,Dj,Pj,Fj,es,Uj,si,oi,ii,ai,li,Nh,Wj,Bj,qj,Hj,ci,nn=E(()=>{"use strict";rn();Mj=y.object({kind:y.enum(["success","neutral","failure"])}),$h=y.enum(["string","number","boolean","object","array"]),jc=y.object({name:y.string().min(1),type:$h,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Nc=y.object({name:y.string().min(1),type:$h,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Ac=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Rc="__failure__",Oc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Lc=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)}),Dj=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(),Pj=y.union([y.string().min(1),Dj]),Fj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),es=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(Pj).optional(),skills:y.array(Fj).optional()}),Uj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),si=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:es,pre_checks:y.array(Uj).optional(),reviewers:y.array(es.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"})}),oi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(es.extend({topic:y.string().min(1)})).optional(),consolidator:es,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()}),ii=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:es.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()}),ai=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)}),li=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()}),Nh=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{tr(Cc(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}`})}}),Wj=y.discriminatedUnion("type",[jh,si,oi,ii,ai,li,Nh]),Bj=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:Wj,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{tr(Cc(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}`})}}),qj=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{tr(Cc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),Hj=y.discriminatedUnion("type",[jh,si,oi,ii,ai,li,Nh,Bj,qj]),ci=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),Hj),terminals:y.record(y.string().min(1),Mj),errors:Lc,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(jc).optional(),outputs:y.array(Nc).optional(),triggers:y.array(Ac).optional(),read_only:y.boolean().optional(),requires:Oc}).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 Y}from"zod";var Jj,ui,Xj,Gj,Vj,gt,sn=E(()=>{"use strict";nn();Jj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ui=Y.string().regex(Jj),Xj=Y.object({step_id:ui,type:Y.literal("main"),index:Y.number().int().min(0)}),Gj=Y.record(ui,Y.record(Y.string().min(1),Y.array(Y.array(Xj)))),Vj=Y.object({id:ui,name:Y.string().min(1),type:Y.string().min(1),typeVersion:Y.number().int().positive().default(1),parameters:Y.record(Y.string(),Y.unknown()).default({}),members:Y.record(Y.string(),Y.unknown()).optional(),estimated_duration_ms:Y.number().int().nonnegative().optional()}),gt=Y.object({schema_version:Y.literal("lmctl/v3"),definition_schema_version:Y.literal(3),name:Y.string().min(1),version:Y.number().int().positive(),description:Y.string().optional(),estimated_duration_ms:Y.number().int().nonnegative().optional(),default_task_timeout_ms:Y.number().int().positive().max(216e5).optional(),concurrency_key:Y.string().min(1).optional(),concurrent_limit:Y.number().int().positive().optional(),errors:Lc,inputs:Y.array(jc).optional(),outputs:Y.array(Nc).optional(),steps:Y.array(Vj).min(1),connections:Gj.default({}),entry_step_id:ui,triggers:Y.array(Ac).optional(),read_only:Y.boolean().optional(),requires:Oc}).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 di(t){return Dc(t)}function Dc(t){if(Array.isArray(t))return t.map(Dc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Dc(e[n]);if(typeof r.type=="string"){let n=zj[r.type];n!==void 0&&(r.type=n)}return r}var Mc,Kj,zj,Pc=E(()=>{"use strict";Mc="lmctl.builtin.",Kj={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},zj=Object.fromEntries(Object.entries(Kj).map(([t,e])=>[e,t]))});import{readFileSync as Yj}from"node:fs";function Oh(t){return Zj(t)}function Zj(t){let e=di(tN(t));if(eN(e),Lh(e)===3)return Qj(e);let r=ci.safeParse(e);if(!r.success)throw new Rt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=rN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Rt(n);return r.data}function Qj(t){let e=gt.safeParse(t);if(!e.success)throw new Rt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function eN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Lh(t);if(!(e===null||Ah.includes(e)))throw new Rt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Ah.join(", ")}`}]})}function Lh(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 tN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1380
|
-
`)||e.startsWith("{")||e.startsWith("[")?
|
|
1381
|
-
`),s=[];for(let I=0;I<n.length;I+=1){let O=dN(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,$,O,B,F,L)=>{l.has(I)&&r(B,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(B,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:$,params:O,line:B,isTerminal:F,...L?{members:L}:{}}),u.push(I)},T=I=>{let $=[],O=I+1;for(;O<s.length;O+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(B===null)break;$.push({label:B[1],dst:B[2]})}return{branches:$,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:$,text:O}=s[I],B=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r($,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=rr(F[1],$,r);for(let Q of Object.keys(L))Fh.has(Q)||r($,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Fh].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(B==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=F[1],Q=F[2],_e=F[3],oe=Ph[Q];oe===void 0&&r($,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(Ph).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:bt}=lN(oe,rr(_e,$,r));_(L,oe,we,$,!1,Object.keys(bt).length>0?bt:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=F[1],Q=F[2],_e=F[3],oe=Uh[Q];oe===void 0&&r($,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(Uh).join(", ")})`),p.has(L)&&r($,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:oe,parameters:rr(_e,$,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r($,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${O}`),L=F[1],Q=F[2].trim(),_e=B==="mcp"?h:g;_e.has(L)&&r($,`duplicate ${B} declaration: ${L}`);let oe;if(Q.startsWith("{")){let we=rr(Q,$,r);B==="mcp"?oe={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r($,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:L,content:we.content})}else{let we=Bh(Q);(typeof we!="string"||we.length===0)&&r($,`\`${B} ${L}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(L,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r($,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},$,!0);continue}if(B==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(L.length<3||L.length%2===0)&&r($,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Q=0;Q+2<L.length+1&&!(Q+2>L.length-1);Q+=2){let _e=L[Q],oe=L[Q+1],we=L[Q+2],bt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:bt,dstDeclId:we,line:$})}continue}if(B==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r($,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Q=[],_e,oe=I+1;for(;oe<s.length;oe+=1){let we=s[oe].text,bt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(bt!==null){_e!==void 0&&r(s[oe].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let kn=bt[2];Q.push({when:bt[1].trim(),next:`@terminal:${kn}`}),c.push({srcDeclId:L,port:kn,dstDeclId:bt[3],line:s[oe].n});continue}let Ca=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ca!==null){_e!==void 0&&r(s[oe].n,`\`choice ${L}\` has more than one \`default\``);let kn=Ca[1];_e=`@terminal:${kn}`,c.push({srcDeclId:L,port:kn,dstDeclId:Ca[2],line:s[oe].n});continue}break}Q.length===0&&r($,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:Q,..._e!==void 0?{default_next:_e}:{}},$,!1),I=oe-1;continue}if(B==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",rr(F[2],$,r),$,!1);continue}if(B==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=rr(F[2],$,r);"mode"in L&&r($,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",L,$,!1);continue}if(B==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=F[1],Q=rr(F[2],$,r),_e=Q.workflow;(typeof _e!="string"||_e.length===0)&&r($,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Q;_(L,"lmctl/subflow",{workflow_name:_e,...we},$,!1),d.push({declId:L,target:_e,line:$});continue}if(B==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r($,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=F[1],Q=rr(F[2],$,r),{branches:_e,nextIdx:oe}=T(I);_e.length===0&&r($,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},$,!1,{agent:Q});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:$});I=oe;continue}if(B==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r($,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r($,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r($,`unknown statement \`${B}\` (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 S=I=>{if(Array.isArray(I)){for(let O of I)S(O);return}if(typeof I!="object"||I===null)return;let $=I;if(typeof $.alias=="string")for(let[O,B]of[["mcp",h],["skills",g]]){let F=$[O];Array.isArray(F)&&($[O]=F.map(L=>typeof L=="string"&&B.has(L)?structuredClone(B.get(L)):L))}for(let O of Object.values($))S(O)};for(let I of u){let $=l.get(I);$.members!==void 0&&S($.members)}let v=I=>Mh(i,I),x=u.map(I=>{let $=l.get(I);return{id:v(I),name:I,type:$.type,typeVersion:1,parameters:$.params,...$.members?{members:$.members}:{}}}),k={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let $=v(I.srcDeclId);k[$]??={},k[$][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),k[$][I.port]=[[{step_id:v(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let $=l.get(I);cN.has($.type)||r($.line,`unknown archetype \`${$.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let $=R.get(I.srcDeclId);$===void 0?R.set(I.srcDeclId,[I.dstDeclId]):$.push(I.dstDeclId)}for(let I of u){let $=l.get(I);if($.type!=="lmctl/loop")continue;let O=$.params.body;if(typeof O=="string"&&l.has(O)){let B=R.get(I);B===void 0?R.set(I,[O]):B.push(O)}}let C=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let $ of R.get(I)??[])C.has($)||(C.add($),q.push($))}for(let I of u)C.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let te=new Map;for(let I of c){let $=te.get(I.srcDeclId);$===void 0&&($=new Set,te.set(I.srcDeclId,$)),$.add(I.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let $=l.get(I);if($.isTerminal)continue;let O=te.get(I)??new Set;if($.type==="lmctl/review"){let F=[...O].some(L=>!j.has(L));!O.has("approve")&&!F&&r($.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let B=uN[$.type];if(B!==void 0)for(let F of B)O.has(F)||r($.line,`uncovered outcome: required outcome \`${F}\` of step \`${I}\` (\`${$.type}\`) has no connection \u2014 route it (\`seq ${I} -${F}-> <target|terminal>\`)`);else O.size===0&&r($.line,`uncovered outcome: non-terminal step \`${I}\` (\`${$.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let $=l.get(I),O=iN[$.type];if(O===void 0)continue;let B={...$.params,...$.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(B);if(!F.success){let L=F.error.issues[0],Q=L.path.length===0?"$":L.path.map(String).join(".");r($.line,`step \`${I}\` (\`${$.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Q}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${$.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:k,entry_step_id:v(f)},me=gt.safeParse(H);if(!me.success)throw new on(me.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return me.data}function dN(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 rr(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 fN(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]=Bh(l)}return s}function fN(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Bh(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 iN,aN,Ph,on,cN,uN,Fh,Uh,qh=E(()=>{"use strict";sn();Dh();nn();iN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:si},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:oi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ii},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ai},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:li}},aN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ph={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"},on=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1379
|
+
${Kr}`:Kr;return e.setMemberPromptSnapshot(o.id,l)??o}function Cj(t){return`${wj(t.local_path)}-code`}var Th,$c=E(()=>{"use strict";Un();yo();Xn();ac();lc();Pe();Yr();vc();xe();oc();Th="spec-driven-task"});import xh from"jexl";function tr(t){xh.compile($h(t))}async function vr(t,e){return xh.eval($h(t),e)}function $h(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var rn=E(()=>{"use strict"});import{z as y}from"zod";function Cc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var Mj,jh,jc,Nc,Ac,Rc,Oc,Lc,Nh,Dj,Pj,Fj,es,Uj,si,oi,ii,ai,li,Ah,Wj,Bj,qj,Hj,ci,nn=E(()=>{"use strict";rn();Mj=y.object({kind:y.enum(["success","neutral","failure"])}),jh=y.enum(["string","number","boolean","object","array"]),jc=y.object({name:y.string().min(1),type:jh,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),Nc=y.object({name:y.string().min(1),type:jh,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Ac=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Rc="__failure__",Oc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Lc=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(),Nh=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),Dj=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(),Pj=y.union([y.string().min(1),Dj]),Fj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),es=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(Pj).optional(),skills:y.array(Fj).optional()}),Uj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),si=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:es,pre_checks:y.array(Uj).optional(),reviewers:y.array(es.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"})}),oi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(es.extend({topic:y.string().min(1)})).optional(),consolidator:es,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()}),ii=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:es.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()}),ai=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)}),li=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()}),Ah=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{tr(Cc(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}`})}}),Wj=y.discriminatedUnion("type",[Nh,si,oi,ii,ai,li,Ah]),Bj=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:Wj,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{tr(Cc(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}`})}}),qj=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{tr(Cc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),Hj=y.discriminatedUnion("type",[Nh,si,oi,ii,ai,li,Ah,Bj,qj]),ci=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),Hj),terminals:y.record(y.string().min(1),Mj),errors:Lc,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(jc).optional(),outputs:y.array(Nc).optional(),triggers:y.array(Ac).optional(),read_only:y.boolean().optional(),requires:Oc}).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 Y}from"zod";var Jj,ui,Xj,Gj,Vj,gt,sn=E(()=>{"use strict";nn();Jj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ui=Y.string().regex(Jj),Xj=Y.object({step_id:ui,type:Y.literal("main"),index:Y.number().int().min(0)}),Gj=Y.record(ui,Y.record(Y.string().min(1),Y.array(Y.array(Xj)))),Vj=Y.object({id:ui,name:Y.string().min(1),type:Y.string().min(1),typeVersion:Y.number().int().positive().default(1),parameters:Y.record(Y.string(),Y.unknown()).default({}),members:Y.record(Y.string(),Y.unknown()).optional(),estimated_duration_ms:Y.number().int().nonnegative().optional()}),gt=Y.object({schema_version:Y.literal("lmctl/v3"),definition_schema_version:Y.literal(3),name:Y.string().min(1),version:Y.number().int().positive(),description:Y.string().optional(),estimated_duration_ms:Y.number().int().nonnegative().optional(),default_task_timeout_ms:Y.number().int().positive().max(216e5).optional(),concurrency_key:Y.string().min(1).optional(),concurrent_limit:Y.number().int().positive().optional(),errors:Lc,inputs:Y.array(jc).optional(),outputs:Y.array(Nc).optional(),steps:Y.array(Vj).min(1),connections:Gj.default({}),entry_step_id:ui,triggers:Y.array(Ac).optional(),read_only:Y.boolean().optional(),requires:Oc}).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 di(t){return Dc(t)}function Dc(t){if(Array.isArray(t))return t.map(Dc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Dc(e[n]);if(typeof r.type=="string"){let n=zj[r.type];n!==void 0&&(r.type=n)}return r}var Mc,Kj,zj,Pc=E(()=>{"use strict";Mc="lmctl.builtin.",Kj={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},zj=Object.fromEntries(Object.entries(Kj).map(([t,e])=>[e,t]))});import{readFileSync as Yj}from"node:fs";function Lh(t){return Zj(t)}function Zj(t){let e=di(tN(t));if(eN(e),Ch(e)===3)return Qj(e);let r=ci.safeParse(e);if(!r.success)throw new Rt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=rN(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Rt(n);return r.data}function Qj(t){let e=gt.safeParse(t);if(!e.success)throw new Rt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function eN(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Ch(t);if(!(e===null||Rh.includes(e)))throw new Rt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Rh.join(", ")}`}]})}function Ch(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 tN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1380
|
+
`)||e.startsWith("{")||e.startsWith("[")?Oh(t,"$"):e.endsWith(".json")?Oh(Yj(e,"utf8"),e):t}function Oh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Rt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function rN(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"}),nN(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function nN(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 Rh,Rt,Mh=E(()=>{"use strict";nn();sn();Pc();Rh=[1,2,3],Rt=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 sN}from"node:crypto";function Dh(t,e){let r=oN(e),n=sN("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function oN(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Ph=E(()=>{"use strict";sn()});function lN(t,e){let r=aN[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 Bh(t){let e=[],r=(I,$)=>{throw new on([{line:I,message:$}])},n=t.split(`
|
|
1381
|
+
`),s=[];for(let I=0;I<n.length;I+=1){let O=dN(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,$,O,B,F,L)=>{l.has(I)&&r(B,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(B,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:$,params:O,line:B,isTerminal:F,...L?{members:L}:{}}),u.push(I)},T=I=>{let $=[],O=I+1;for(;O<s.length;O+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(B===null)break;$.push({label:B[1],dst:B[2]})}return{branches:$,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:$,text:O}=s[I],B=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r($,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=rr(F[1],$,r);for(let Q of Object.keys(L))Uh.has(Q)||r($,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Uh].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(B==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=F[1],Q=F[2],_e=F[3],oe=Fh[Q];oe===void 0&&r($,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(Fh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:bt}=lN(oe,rr(_e,$,r));_(L,oe,we,$,!1,Object.keys(bt).length>0?bt:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=F[1],Q=F[2],_e=F[3],oe=Wh[Q];oe===void 0&&r($,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(Wh).join(", ")})`),p.has(L)&&r($,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:oe,parameters:rr(_e,$,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r($,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${O}`),L=F[1],Q=F[2].trim(),_e=B==="mcp"?h:g;_e.has(L)&&r($,`duplicate ${B} declaration: ${L}`);let oe;if(Q.startsWith("{")){let we=rr(Q,$,r);B==="mcp"?oe={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r($,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:L,content:we.content})}else{let we=qh(Q);(typeof we!="string"||we.length===0)&&r($,`\`${B} ${L}\`: string form must be a non-empty file path or http(s) URL`),oe=we}_e.set(L,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r($,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},$,!0);continue}if(B==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(L.length<3||L.length%2===0)&&r($,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let Q=0;Q+2<L.length+1&&!(Q+2>L.length-1);Q+=2){let _e=L[Q],oe=L[Q+1],we=L[Q+2],bt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:bt,dstDeclId:we,line:$})}continue}if(B==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r($,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],Q=[],_e,oe=I+1;for(;oe<s.length;oe+=1){let we=s[oe].text,bt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(bt!==null){_e!==void 0&&r(s[oe].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let kn=bt[2];Q.push({when:bt[1].trim(),next:`@terminal:${kn}`}),c.push({srcDeclId:L,port:kn,dstDeclId:bt[3],line:s[oe].n});continue}let Ca=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ca!==null){_e!==void 0&&r(s[oe].n,`\`choice ${L}\` has more than one \`default\``);let kn=Ca[1];_e=`@terminal:${kn}`,c.push({srcDeclId:L,port:kn,dstDeclId:Ca[2],line:s[oe].n});continue}break}Q.length===0&&r($,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:Q,..._e!==void 0?{default_next:_e}:{}},$,!1),I=oe-1;continue}if(B==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",rr(F[2],$,r),$,!1);continue}if(B==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=rr(F[2],$,r);"mode"in L&&r($,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",L,$,!1);continue}if(B==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r($,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=F[1],Q=rr(F[2],$,r),_e=Q.workflow;(typeof _e!="string"||_e.length===0)&&r($,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=Q;_(L,"lmctl/subflow",{workflow_name:_e,...we},$,!1),d.push({declId:L,target:_e,line:$});continue}if(B==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r($,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=F[1],Q=rr(F[2],$,r),{branches:_e,nextIdx:oe}=T(I);_e.length===0&&r($,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},$,!1,{agent:Q});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:$});I=oe;continue}if(B==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r($,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r($,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r($,`unknown statement \`${B}\` (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 S=I=>{if(Array.isArray(I)){for(let O of I)S(O);return}if(typeof I!="object"||I===null)return;let $=I;if(typeof $.alias=="string")for(let[O,B]of[["mcp",h],["skills",g]]){let F=$[O];Array.isArray(F)&&($[O]=F.map(L=>typeof L=="string"&&B.has(L)?structuredClone(B.get(L)):L))}for(let O of Object.values($))S(O)};for(let I of u){let $=l.get(I);$.members!==void 0&&S($.members)}let v=I=>Dh(i,I),x=u.map(I=>{let $=l.get(I);return{id:v(I),name:I,type:$.type,typeVersion:1,parameters:$.params,...$.members?{members:$.members}:{}}}),k={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let $=v(I.srcDeclId);k[$]??={},k[$][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),k[$][I.port]=[[{step_id:v(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let $=l.get(I);cN.has($.type)||r($.line,`unknown archetype \`${$.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let $=R.get(I.srcDeclId);$===void 0?R.set(I.srcDeclId,[I.dstDeclId]):$.push(I.dstDeclId)}for(let I of u){let $=l.get(I);if($.type!=="lmctl/loop")continue;let O=$.params.body;if(typeof O=="string"&&l.has(O)){let B=R.get(I);B===void 0?R.set(I,[O]):B.push(O)}}let C=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let $ of R.get(I)??[])C.has($)||(C.add($),q.push($))}for(let I of u)C.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let te=new Map;for(let I of c){let $=te.get(I.srcDeclId);$===void 0&&($=new Set,te.set(I.srcDeclId,$)),$.add(I.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let $=l.get(I);if($.isTerminal)continue;let O=te.get(I)??new Set;if($.type==="lmctl/review"){let F=[...O].some(L=>!j.has(L));!O.has("approve")&&!F&&r($.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let B=uN[$.type];if(B!==void 0)for(let F of B)O.has(F)||r($.line,`uncovered outcome: required outcome \`${F}\` of step \`${I}\` (\`${$.type}\`) has no connection \u2014 route it (\`seq ${I} -${F}-> <target|terminal>\`)`);else O.size===0&&r($.line,`uncovered outcome: non-terminal step \`${I}\` (\`${$.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let $=l.get(I),O=iN[$.type];if(O===void 0)continue;let B={...$.params,...$.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(B);if(!F.success){let L=F.error.issues[0],Q=L.path.length===0?"$":L.path.map(String).join(".");r($.line,`step \`${I}\` (\`${$.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${Q}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${$.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:x,connections:k,entry_step_id:v(f)},me=gt.safeParse(H);if(!me.success)throw new on(me.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return me.data}function dN(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 rr(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 fN(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]=qh(l)}return s}function fN(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function qh(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 iN,aN,Fh,on,cN,uN,Uh,Wh,Hh=E(()=>{"use strict";sn();Ph();nn();iN={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:si},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:oi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ii},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ai},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:li}},aN={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Fh={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"},on=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1382
1382
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1383
|
-
`)}`),this.issues=e,this.name="DslCompileError"}},cN=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"]),uN={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},
|
|
1384
|
-
`)){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"&&pN()&&hN(t)){let r;try{r=
|
|
1385
|
-
`)||e.startsWith("{")||e.startsWith("[")?Hh(t):e.endsWith(".json")?Hh(mN(e,"utf8")):t}function Hh(t){return JSON.parse(t)}function wN(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Fc,Ot,an=E(()=>{"use strict";nn();Ch();Pc();sn();qh();Fc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Ot=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function fi(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:yN(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:bN(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function yN(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=EN(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function EN(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 bN(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Uc=E(()=>{"use strict"});var Jh={};le(Jh,{enqueueFromAgentOutput:()=>TN,enqueueFromGitHubIssue:()=>Wc,enqueueManual:()=>SN,enqueueScheduled:()=>kN});function Wc(t,e){return pi(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:mi(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function SN(t,e){return pi(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:mi(e.payload),concurrency_key:e.concurrency_key})}function TN(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return pi(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:mi(e.payload),concurrency_key:e.concurrency_key})}function kN(t,e){return pi(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:mi(e.payload),concurrency_key:e.concurrency_key})}function mi(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function pi(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=fi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Bc=E(()=>{"use strict";an();Uc()});async function Gh(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Xh(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 vN(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...IN(o.parameters_override)},l=Xh(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 Xh(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Wc(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 vN(t,e){if(t===null||t.trim().length===0)return!0;try{return await vr(t,e)===!0}catch{return!1}}function IN(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 Vh=E(()=>{"use strict";rn();Bc()});import{spawnSync as xN}from"node:child_process";async function Hc(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=xN(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(!jN(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Gh({dal:t.dal,project:t.project,issue:NN(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function ln(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=$N(r.intake_config);try{let s=await Hc({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 $N(t){if(t===null)return{};try{let e=JSON.parse(t);if(!qc(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 jN(t){return Array.isArray(t)&&t.every(e=>{if(!qc(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:qc(n)&&typeof n.name=="string"))})}function NN(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 qc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var hi=E(()=>{"use strict";Vh()});function zh(t){return async e=>RN(t.app,e,t.log!==void 0?{log:t.log}:{})}async function RN(t,e,r={}){let n=ON(e.path),s={"content-type":"application/json",...e.headers??{},[_i]:Jc},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 LN(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Kh(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} ${Kh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Kh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function ON(t){let e=t.startsWith("/")?t:`/${t}`;return`${AN}${e}`}async function LN(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()!==_i&&(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 _i,Jc,AN,Xc=E(()=>{"use strict";_i="x-mailbox-channel",Jc="1",AN="http://mailbox.local"});import{createHash as Yh,createHmac as CN,timingSafeEqual as MN}from"node:crypto";function Zh(){return async(t,e)=>{let r=Qh();if(r===null||WN(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(_i)===Jc){await e();return}let n=t.req.query("token");if(n!==void 0&&gi(n,r)){Vc(t,r),await e();return}if(UN(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 Qh(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function e_(t){let e=Qh();return e!==null&&gi(t,e)}function Vc(t,e,r=new Date){t.header("Set-Cookie",`${Gc}=${PN(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function t_(t){t.header("Set-Cookie",`${Gc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function PN(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+DN*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${r_(t,n)}`,"utf8").toString("base64url")}function FN(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:gi(s[2],r_(e,`${s[0]}|${s[1]}`))}function gi(t,e){return MN(Yh("sha256").update(t).digest(),Yh("sha256").update(e).digest())}function UN(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&gi(r,e))return!0;let n=BN(t.req.header("cookie")??"")[Gc];return n!==void 0&&FN(n,e)}function WN(t){return t==="/login"||t==="/logout"}function BN(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 r_(t,e){return CN("sha256",t).update(e).digest("hex")}var Gc,DN,n_=E(()=>{"use strict";Xc();Gc="lmctl_next_session",DN=30});import{existsSync as cn,mkdirSync as qN,readdirSync as HN,readFileSync as wi,unlinkSync as JN,writeFileSync as Yc}from"node:fs";import{join as Ir}from"node:path";function Qe(t){if(!XN.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function o_(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 zN(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:s_,updated_at:s_}:null}function GN(t,e,r,n){let s=r!==null?`
|
|
1383
|
+
`)}`),this.issues=e,this.name="DslCompileError"}},cN=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"]),uN={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Uh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Wh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as mN}from"node:fs";function pN(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function hN(t){for(let e of t.split(`
|
|
1384
|
+
`)){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"&&pN()&&hN(t)){let r;try{r=Bh(t)}catch(s){throw s instanceof on?new Ot(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=gt.safeParse(r);if(!n.success)throw new Ot(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=di(gN(t));if(wN(e)&&e.definition_schema_version===3){let r=gt.safeParse(e);if(!r.success)throw new Ot(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return _N(e)}function _N(t){let e=ci.safeParse(t);if(!e.success)throw new Ot(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 Ot([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Lh(r)}catch(s){throw s instanceof Rt?new Fc(s):s}}function gN(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1385
|
+
`)||e.startsWith("{")||e.startsWith("[")?Jh(t):e.endsWith(".json")?Jh(mN(e,"utf8")):t}function Jh(t){return JSON.parse(t)}function wN(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Fc,Ot,an=E(()=>{"use strict";nn();Mh();Pc();sn();Hh();Fc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Ot=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function fi(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:yN(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:bN(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function yN(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=EN(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function EN(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 bN(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Uc=E(()=>{"use strict"});var Xh={};le(Xh,{enqueueFromAgentOutput:()=>TN,enqueueFromGitHubIssue:()=>Wc,enqueueManual:()=>SN,enqueueScheduled:()=>kN});function Wc(t,e){return pi(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:mi(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function SN(t,e){return pi(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:mi(e.payload),concurrency_key:e.concurrency_key})}function TN(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return pi(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:mi(e.payload),concurrency_key:e.concurrency_key})}function kN(t,e){return pi(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:mi(e.payload),concurrency_key:e.concurrency_key})}function mi(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function pi(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=fi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Bc=E(()=>{"use strict";an();Uc()});async function Vh(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Gh(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 vN(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...IN(o.parameters_override)},l=Gh(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 Gh(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Wc(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 vN(t,e){if(t===null||t.trim().length===0)return!0;try{return await vr(t,e)===!0}catch{return!1}}function IN(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 Kh=E(()=>{"use strict";rn();Bc()});import{spawnSync as xN}from"node:child_process";async function Hc(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=xN(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(!jN(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Vh({dal:t.dal,project:t.project,issue:NN(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function ln(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=$N(r.intake_config);try{let s=await Hc({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 $N(t){if(t===null)return{};try{let e=JSON.parse(t);if(!qc(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 jN(t){return Array.isArray(t)&&t.every(e=>{if(!qc(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:qc(n)&&typeof n.name=="string"))})}function NN(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 qc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var hi=E(()=>{"use strict";Kh()});function Yh(t){return async e=>RN(t.app,e,t.log!==void 0?{log:t.log}:{})}async function RN(t,e,r={}){let n=ON(e.path),s={"content-type":"application/json",...e.headers??{},[_i]:Jc},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 LN(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${zh(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} ${zh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function zh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function ON(t){let e=t.startsWith("/")?t:`/${t}`;return`${AN}${e}`}async function LN(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()!==_i&&(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 _i,Jc,AN,Xc=E(()=>{"use strict";_i="x-mailbox-channel",Jc="1",AN="http://mailbox.local"});import{createHash as Zh,createHmac as CN,timingSafeEqual as MN}from"node:crypto";function Qh(){return async(t,e)=>{let r=e_();if(r===null||WN(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(_i)===Jc){await e();return}let n=t.req.query("token");if(n!==void 0&&gi(n,r)){Vc(t,r),await e();return}if(UN(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 e_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function t_(t){let e=e_();return e!==null&&gi(t,e)}function Vc(t,e,r=new Date){t.header("Set-Cookie",`${Gc}=${PN(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function r_(t){t.header("Set-Cookie",`${Gc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function PN(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+DN*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${n_(t,n)}`,"utf8").toString("base64url")}function FN(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:gi(s[2],n_(e,`${s[0]}|${s[1]}`))}function gi(t,e){return MN(Zh("sha256").update(t).digest(),Zh("sha256").update(e).digest())}function UN(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&gi(r,e))return!0;let n=BN(t.req.header("cookie")??"")[Gc];return n!==void 0&&FN(n,e)}function WN(t){return t==="/login"||t==="/logout"}function BN(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 n_(t,e){return CN("sha256",t).update(e).digest("hex")}var Gc,DN,s_=E(()=>{"use strict";Xc();Gc="lmctl_next_session",DN=30});import{existsSync as cn,mkdirSync as qN,readdirSync as HN,readFileSync as wi,unlinkSync as JN,writeFileSync as Yc}from"node:fs";import{join as Ir}from"node:path";function Qe(t){if(!XN.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function i_(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 zN(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:o_,updated_at:o_}:null}function GN(t,e,r,n){let s=r!==null?`
|
|
1386
1386
|
description: ${r}`:"";return`---
|
|
1387
1387
|
name: ${t}${s}
|
|
1388
1388
|
type: ${e}
|
|
1389
1389
|
---
|
|
1390
|
-
${n}`}function VN(t,e,r,n){let s=Ir(t,Zc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=cn(s)?wi(s,"utf8"):"",a=new RegExp(`^- \\[${
|
|
1390
|
+
${n}`}function VN(t,e,r,n){let s=Ir(t,Zc),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=cn(s)?wi(s,"utf8"):"",a=new RegExp(`^- \\[${a_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
|
|
1391
1391
|
`)?`${i}
|
|
1392
1392
|
${o}
|
|
1393
1393
|
`:`${i}${o}
|
|
1394
|
-
`,Yc(s,i,"utf8")}function KN(t,e){let r=Ir(t,Zc);if(!cn(r))return;let n=wi(r,"utf8"),s=new RegExp(`^- \\[${i_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function i_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zN(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function lt(t,e){return t.durable_memory_mode==="db"?new zc(e,t.id):new Kc(t.local_path)}var XN,Zc,s_,Kc,zc,Qc=E(()=>{"use strict";XN=/^[a-zA-Z0-9_-]+$/;Zc="MEMORY.md",s_="1970-01-01T00:00:00.000Z",Kc=class{dir;constructor(e){this.dir=Ir(e,"durable-memory")}read(e){Qe(e);let r=Ir(this.dir,`${e}.md`);if(!cn(r))return null;let n=wi(r,"utf8");return o_(e,n)}write(e){Qe(e.name),qN(this.dir,{recursive:!0});let r=Ir(this.dir,`${e.name}.md`),n=!cn(r),s=GN(e.name,e.type,e.description??null,e.body);return Yc(r,s,"utf8"),VN(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){Qe(e);let r=Ir(this.dir,`${e}.md`);return cn(r)?(JN(r),KN(this.dir,e),!0):!1}listFiles(){if(!cn(this.dir))return[];let e=HN(this.dir).filter(n=>n.endsWith(".md")&&n!==Zc),r=[];for(let n of e){let s=n.slice(0,-3),o=wi(Ir(this.dir,n),"utf8"),i=o_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};zc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Qe(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){Qe(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 Qe(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function l_(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=lt(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=lt(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||!a_.has(a))return n.json({error:`invalid type: must be one of ${[...a_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=lt(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=lt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var a_,c_=E(()=>{"use strict";Qc();a_=new Set(["user","feedback","project","reference"])});function ZN(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(YN[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function QN(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 u_(t,e=new Date){let{time:r,date:n}=QN(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=ZN(h.data),T=h.data.length,S=new Uint8Array(30+g.length),v=new DataView(S.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,T,!0),v.setUint32(22,T,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),S.set(g,30),s.push(S,h.data);let x=new Uint8Array(46+g.length),k=new DataView(x.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),x.set(g,46),o.push(x),i+=S.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 YN,d_=E(()=>{"use strict";YN=(()=>{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 bi,mkdirSync as eA,readdirSync as tA,readFileSync as p_,statSync as rA,unlinkSync as nA,writeFileSync as sA}from"node:fs";import{join as ns}from"node:path";function h_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ct(n);if(typeof s=="string")return A(n,s,400);let o=ie(s,"name"),i=ie(s,"local_path");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(i===null||i.length===0)return A(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return A(n,`project already exists: ${o}`,409);let a=ie(s,"workflow_name")??"bugfix",l,c=ie(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return A(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return A(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:ie(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 A(n,"project not found",404);let o=await ct(n);if(typeof o=="string")return A(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 A(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 A(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 A(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 A(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?A(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ct(n);if(typeof s=="string")return A(n,s,400);let o=ie(s,"name");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return A(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 A(n,"team not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"alias"),a=ie(o,"provider");if(i===null||i.length===0)return A(n,"missing or empty alias",400);if(a===null||a.length===0)return A(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return A(n,`member already exists: ${i}`,409);let l=ie(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ie(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 A(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return A(n,"member not found",404);let i=await ct(n);if(typeof i=="string")return A(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 A(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 A(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 A(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return A(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?A(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 A(n,"project not found",404);let o=lt(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 A(n,"project not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!yi.includes(l))return A(n,`invalid type: must be one of ${yi.join("|")}`,400);try{Qe(i)}catch(d){return A(n,d.message,400)}let c=lt(s,r);try{if(c.read(i)!==null)return A(n,`chapter already exists: ${i}`,409)}catch(d){return A(n,d.message,400)}try{c.write({type:l,name:i,description:ie(o,"description"),body:a})}catch(d){return A(n,d.message,400)}let u=c.read(i);return u===null?A(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 A(n,"project not found",404);let o=lt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i===null?A(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 A(n,"project not found",404);let o=n.req.param("chapter"),i=await ct(n);if(typeof i=="string")return A(n,i,400);let a=lt(s,r),l;try{l=a.read(o)}catch(m){return A(n,m.message,400)}if(l===null)return A(n,"chapter not found",404);let c=ie(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ie(i,"description"):l.description,d=ie(i,"type")??l.type;if(!yi.includes(d))return A(n,`invalid type: must be one of ${yi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return A(n,m.message,400)}let f=a.read(o);return f===null?A(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 A(n,"project not found",404);let o=lt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i?n.json({removed:!0}):A(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?A(n,"project not found",404):n.json(iA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!Ei.has(l))return A(n,`invalid type: must be one of ${[...Ei].join("|")}`,400);try{Qe(i)}catch(f){return A(n,f.message,400)}let c=ts(s.local_path),u=ns(c,`${i}.md`);if(bi(u))return A(n,`chapter already exists: ${i}`,409);eA(c,{recursive:!0}),m_(u,i,l,ie(o,"description"),a);let d=rs(c,i);return d===null?A(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 A(n,"project not found",404);try{Qe(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=rs(ts(s.local_path),n.req.param("chapter"));return o===null?A(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 A(n,"project not found",404);let o=n.req.param("chapter");try{Qe(o)}catch(m){return A(n,m.message,400)}let i=ts(s.local_path),a=rs(i,o);if(a===null)return A(n,"chapter not found",404);let l=await ct(n);if(typeof l=="string")return A(n,l,400);let c=ie(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ie(l,"description"):a.description,d=ie(l,"type")??a.type;if(!Ei.has(d))return A(n,`invalid type: must be one of ${[...Ei].join("|")}`,400);m_(ns(i,`${o}.md`),o,d,u,c);let f=rs(i,o);return f===null?A(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 A(n,"project not found",404);let o=n.req.param("chapter");try{Qe(o)}catch(a){return A(n,a.message,400)}let i=ns(ts(s.local_path),`${o}.md`);return bi(i)?(nA(i),n.json({removed:!0})):A(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>A(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 ct(n);return typeof s=="string"?A(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(f_))),t.post("/api/chat/sessions",async n=>{let s=await oA(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ie(s,"title"):null,i=r.createChatbotSession(f_,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?A(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 A(n,"chat session not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"role"),a=ie(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return A(n,"role must be one of user|assistant|tool",400);if(a===null)return A(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 A(n,"invalid run id",400);if(r.getRun(s)===null)return A(n,"run not found",404);let i=Sr(r,s),a=[];for(let c of i){let u=lA(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=p_(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=u_(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 A(t,e,r){return t.json({error:e},r)}async function ct(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 oA(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 ie(t,e){let r=t[e];return typeof r!="string"?null:r}function ts(t){return ns(t,"ai-test")}function rs(t,e){let r=ns(t,`${e}.md`);if(!bi(r))return null;let n=p_(r,"utf8"),s=aA(n),o=rA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function iA(t){let e=ts(t);return bi(e)?tA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=rs(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 m_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1394
|
+
`,Yc(s,i,"utf8")}function KN(t,e){let r=Ir(t,Zc);if(!cn(r))return;let n=wi(r,"utf8"),s=new RegExp(`^- \\[${a_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function a_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zN(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function lt(t,e){return t.durable_memory_mode==="db"?new zc(e,t.id):new Kc(t.local_path)}var XN,Zc,o_,Kc,zc,Qc=E(()=>{"use strict";XN=/^[a-zA-Z0-9_-]+$/;Zc="MEMORY.md",o_="1970-01-01T00:00:00.000Z",Kc=class{dir;constructor(e){this.dir=Ir(e,"durable-memory")}read(e){Qe(e);let r=Ir(this.dir,`${e}.md`);if(!cn(r))return null;let n=wi(r,"utf8");return i_(e,n)}write(e){Qe(e.name),qN(this.dir,{recursive:!0});let r=Ir(this.dir,`${e.name}.md`),n=!cn(r),s=GN(e.name,e.type,e.description??null,e.body);return Yc(r,s,"utf8"),VN(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){Qe(e);let r=Ir(this.dir,`${e}.md`);return cn(r)?(JN(r),KN(this.dir,e),!0):!1}listFiles(){if(!cn(this.dir))return[];let e=HN(this.dir).filter(n=>n.endsWith(".md")&&n!==Zc),r=[];for(let n of e){let s=n.slice(0,-3),o=wi(Ir(this.dir,n),"utf8"),i=i_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};zc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Qe(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){Qe(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 Qe(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function c_(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=lt(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=lt(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||!l_.has(a))return n.json({error:`invalid type: must be one of ${[...l_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=lt(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=lt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var l_,u_=E(()=>{"use strict";Qc();l_=new Set(["user","feedback","project","reference"])});function ZN(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(YN[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function QN(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 d_(t,e=new Date){let{time:r,date:n}=QN(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=ZN(h.data),T=h.data.length,S=new Uint8Array(30+g.length),v=new DataView(S.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,T,!0),v.setUint32(22,T,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),S.set(g,30),s.push(S,h.data);let x=new Uint8Array(46+g.length),k=new DataView(x.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),x.set(g,46),o.push(x),i+=S.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 YN,f_=E(()=>{"use strict";YN=(()=>{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 bi,mkdirSync as eA,readdirSync as tA,readFileSync as h_,statSync as rA,unlinkSync as nA,writeFileSync as sA}from"node:fs";import{join as ns}from"node:path";function __(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ct(n);if(typeof s=="string")return A(n,s,400);let o=ie(s,"name"),i=ie(s,"local_path");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(i===null||i.length===0)return A(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return A(n,`project already exists: ${o}`,409);let a=ie(s,"workflow_name")??"bugfix",l,c=ie(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return A(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return A(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:ie(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 A(n,"project not found",404);let o=await ct(n);if(typeof o=="string")return A(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 A(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 A(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 A(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 A(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?A(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ct(n);if(typeof s=="string")return A(n,s,400);let o=ie(s,"name");if(o===null||o.length===0)return A(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return A(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 A(n,"team not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"alias"),a=ie(o,"provider");if(i===null||i.length===0)return A(n,"missing or empty alias",400);if(a===null||a.length===0)return A(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return A(n,`member already exists: ${i}`,409);let l=ie(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ie(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 A(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return A(n,"member not found",404);let i=await ct(n);if(typeof i=="string")return A(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 A(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 A(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 A(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return A(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?A(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 A(n,"project not found",404);let o=lt(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 A(n,"project not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!yi.includes(l))return A(n,`invalid type: must be one of ${yi.join("|")}`,400);try{Qe(i)}catch(d){return A(n,d.message,400)}let c=lt(s,r);try{if(c.read(i)!==null)return A(n,`chapter already exists: ${i}`,409)}catch(d){return A(n,d.message,400)}try{c.write({type:l,name:i,description:ie(o,"description"),body:a})}catch(d){return A(n,d.message,400)}let u=c.read(i);return u===null?A(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 A(n,"project not found",404);let o=lt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i===null?A(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 A(n,"project not found",404);let o=n.req.param("chapter"),i=await ct(n);if(typeof i=="string")return A(n,i,400);let a=lt(s,r),l;try{l=a.read(o)}catch(m){return A(n,m.message,400)}if(l===null)return A(n,"chapter not found",404);let c=ie(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ie(i,"description"):l.description,d=ie(i,"type")??l.type;if(!yi.includes(d))return A(n,`invalid type: must be one of ${yi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return A(n,m.message,400)}let f=a.read(o);return f===null?A(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 A(n,"project not found",404);let o=lt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return A(n,a.message,400)}return i?n.json({removed:!0}):A(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?A(n,"project not found",404):n.json(iA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return A(n,"project not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return A(n,"missing or empty name",400);if(a===null)return A(n,"missing body",400);if(l===null||!Ei.has(l))return A(n,`invalid type: must be one of ${[...Ei].join("|")}`,400);try{Qe(i)}catch(f){return A(n,f.message,400)}let c=ts(s.local_path),u=ns(c,`${i}.md`);if(bi(u))return A(n,`chapter already exists: ${i}`,409);eA(c,{recursive:!0}),p_(u,i,l,ie(o,"description"),a);let d=rs(c,i);return d===null?A(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 A(n,"project not found",404);try{Qe(n.req.param("chapter"))}catch(i){return A(n,i.message,400)}let o=rs(ts(s.local_path),n.req.param("chapter"));return o===null?A(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 A(n,"project not found",404);let o=n.req.param("chapter");try{Qe(o)}catch(m){return A(n,m.message,400)}let i=ts(s.local_path),a=rs(i,o);if(a===null)return A(n,"chapter not found",404);let l=await ct(n);if(typeof l=="string")return A(n,l,400);let c=ie(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ie(l,"description"):a.description,d=ie(l,"type")??a.type;if(!Ei.has(d))return A(n,`invalid type: must be one of ${[...Ei].join("|")}`,400);p_(ns(i,`${o}.md`),o,d,u,c);let f=rs(i,o);return f===null?A(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 A(n,"project not found",404);let o=n.req.param("chapter");try{Qe(o)}catch(a){return A(n,a.message,400)}let i=ns(ts(s.local_path),`${o}.md`);return bi(i)?(nA(i),n.json({removed:!0})):A(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>A(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 ct(n);return typeof s=="string"?A(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(m_))),t.post("/api/chat/sessions",async n=>{let s=await oA(n);if(typeof s=="string")return A(n,s,400);let o=s!==null?ie(s,"title"):null,i=r.createChatbotSession(m_,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?A(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 A(n,"chat session not found",404);let o=await ct(n);if(typeof o=="string")return A(n,o,400);let i=ie(o,"role"),a=ie(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return A(n,"role must be one of user|assistant|tool",400);if(a===null)return A(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 A(n,"invalid run id",400);if(r.getRun(s)===null)return A(n,"run not found",404);let i=Sr(r,s),a=[];for(let c of i){let u=lA(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=h_(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=d_(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 A(t,e,r){return t.json({error:e},r)}async function ct(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 oA(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 ie(t,e){let r=t[e];return typeof r!="string"?null:r}function ts(t){return ns(t,"ai-test")}function rs(t,e){let r=ns(t,`${e}.md`);if(!bi(r))return null;let n=h_(r,"utf8"),s=aA(n),o=rA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function iA(t){let e=ts(t);return bi(e)?tA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=rs(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 p_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1395
1395
|
description: ${n}`:"",i=`---
|
|
1396
1396
|
name: ${e}${o}
|
|
1397
1397
|
type: ${r}
|
|
1398
1398
|
---
|
|
1399
|
-
${s}`;sA(t,i,"utf8")}function aA(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 lA(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?cA(t.path):uA(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function cA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function uA(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var yi,Ei,
|
|
1399
|
+
${s}`;sA(t,i,"utf8")}function aA(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 lA(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?cA(t.path):uA(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function cA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function uA(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var yi,Ei,m_,g_=E(()=>{"use strict";Nt();f_();Qc();yi=["user","feedback","project","reference"],Ei=new Set(["smoke","integration","vision","scenario","regression"]),m_="operator"});function je(t,e){return`<!doctype html>
|
|
1400
1400
|
<html lang="en">
|
|
1401
1401
|
<head>
|
|
1402
1402
|
<meta charset="utf-8">
|
|
@@ -1457,46 +1457,46 @@ ${s}`;sA(t,i,"utf8")}function aA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1457
1457
|
</nav>
|
|
1458
1458
|
<main>${e}</main>
|
|
1459
1459
|
</body>
|
|
1460
|
-
</html>`}function b(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function de(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function ae(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var eu=E(()=>{"use strict"});function
|
|
1460
|
+
</html>`}function b(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function de(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function ae(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var eu=E(()=>{"use strict"});function w_(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
|
|
1461
1461
|
JOIN step s ON s.id = sa.step_id
|
|
1462
1462
|
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
|
|
1463
1463
|
JOIN step s ON s.id = sa.step_id
|
|
1464
1464
|
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let j of a){let H=l.get(j.step_id)??[];H.push({kind:j.kind,id:j.id}),l.set(j.step_id,H)}let c=i.map(j=>({id:j.id,state_name:j.state_name,outcome:j.outcome,duration_ms:j.started_at!==null&&j.ended_at!==null?Math.max(0,new Date(j.ended_at).getTime()-new Date(j.started_at).getTime()):null,artifacts:l.get(j.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 j of d)try{let H=JSON.parse(j.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let m=u.map(j=>({kind:j.kind,count:j.count,total_elapsed_ms:j.kind==="tool_result"?f:0})),p=c.filter(j=>j.outcome==="request_changes"),h=[...new Set(p.map(j=>j.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),S=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,v=S!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
1465
1465
|
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,S,g,_):[],k=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
1466
|
-
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",C=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,te={run_id:t,workflow_name:C?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(te)})}var
|
|
1467
|
-
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function
|
|
1468
|
-
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=su(r[i]),l=ru.exec(a);if(l===null)continue;let c=l[1].trim();if(nu.test(c))continue;let u
|
|
1469
|
-
`),r=null;for(let n=0;n<e.length;n+=1){let s=su(e[n]),o=ru.exec(s);if(o===null)continue;let i=o[1].trim();if(nu.test(i))continue;let a
|
|
1470
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(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
|
|
1466
|
+
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",C=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,te={run_id:t,workflow_name:C?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(te)})}var y_=E(()=>{"use strict"});import{spawnSync as b_}from"node:child_process";function tu(t){return dA[t]??`no install hint; ensure '${t}' is on PATH`}function fA(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 E_(t){return b_("which",[t],{encoding:"utf8"}).status===0}function S_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!E_(e)){let r=tu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!E_(e)){let s=tu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=fA(e);if(r===null)continue;let n=b_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:tu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var dA,T_=E(()=>{"use strict";dA={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 mA,readdirSync as pA,readFileSync as hA}from"node:fs";import{join as k_}from"node:path";function _A(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(`
|
|
1467
|
+
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function v_(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 I_(t,e){if(e.length===0)return null;let r=k_(t,"durable-memory");if(!mA(r))return null;let n;try{n=pA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=hA(k_(r,o),"utf8");if(_A(i).some(l=>e.includes(l))){let l=v_(i,"name")??o.replace(".md",""),c=v_(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 x_=E(()=>{"use strict"});function su(t){let e=t.trim().replace(gA,"").trim();for(let r=0;r<4;r+=1){let n=wA.exec(e);if(n===null)break;e=n[2].trim()}return e}function $_(t){let e=t.trim(),r=yA.exec(e);if(r!==null)return r[2];let n=EA.exec(e);return n!==null?n[0]:null}function ss(t,e){let r=t.split(`
|
|
1468
|
+
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=su(r[i]),l=ru.exec(a);if(l===null)continue;let c=l[1].trim();if(nu.test(c))continue;let u=$_(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=su(r[i]),l=ru.exec(a);if(l===null)break;let c=nu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function j_(t){let e=t.split(`
|
|
1469
|
+
`),r=null;for(let n=0;n<e.length;n+=1){let s=su(e[n]),o=ru.exec(s);if(o===null)continue;let i=o[1].trim();if(nu.test(i))continue;let a=$_(i);if(a===null||!Mr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var gA,wA,ru,nu,yA,EA,ou=E(()=>{"use strict";Rn();gA=/^#{1,6}\s+/,wA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,ru=/^STANCE:\s+(.+)$/,nu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,yA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,EA=/^[A-Za-z0-9_-]+/});function N_(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 A_=E(()=>{"use strict"});import{readFileSync as bA}from"node:fs";import{dirname as SA,join as TA}from"node:path";import{fileURLToPath as kA}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 AA(t){let e=[],r=[];for(let n of t)vA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function RA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&IA.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 OA(t,e){if(t.length===0)return{matched:!1};let r=AA(t);for(let n of r){let s=RA(n,e);if(s.matched)return s}return{matched:!1}}function iu(t){return OA(t,NA)}function LA(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 au(t){return LA(t).split(" ").filter(e=>e.length>0)}var vA,IA,$A,jA,NA,R_=E(()=>{"use strict";vA=new Set(["&&","||",";","|",">",">>","<","<<"]),IA=/^[A-Za-z_][A-Za-z0-9_]*=/;$A=SA(kA(import.meta.url)),jA=JSON.parse(bA(TA($A,"side_effect_classifier.json"),"utf-8")),NA=xA(jA)});function Si(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 O_(t,e){try{return await vr(lu(t)??t,Si(e))===!0}catch{return!1}}async function Ti(t,e){try{return await vr(lu(t)??t,Si(e))}catch{return}}async function L_(t,e){if(typeof t!="string")return t;let r=lu(t);if(r===null)return t;try{return await vr(r,Si(e))}catch{return}}async function C_(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+=CA(await vr(a,Si(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function lu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function CA(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var os=E(()=>{"use strict";rn()});import{existsSync as M_,readdirSync as D_,readFileSync as MA,statSync as P_}from"node:fs";import{join as vi}from"node:path";function F_(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function J(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function et(t,e,r,n,s={}){let o=D(),i=J(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,`${is}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Mr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Js,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:DA(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function DA(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
1470
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(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 U_(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=nr(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=nr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=nr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=PA(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return C_(n,e)}function PA(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 nr(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 as(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=N_(e.dal,e.run_id,()=>o),c=cu(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let S=au(T.summary),v=iu(S);v.matched&&!c&&(u.violation={summary:T.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),FA(T,(S,v)=>{m+=S,p+=v})},g=await Hr({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:ke(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),UA(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&&uu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function FA(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=ki(s.input_tokens),a=ki(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=ki(o.input_tokens),a=ki(o.output_tokens);(i>0||a>0)&&e(i,a)}}function ki(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Lt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=J(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 as({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 un(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=J(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(Uf(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(`
|
|
1471
1471
|
|
|
1472
|
-
`);try{let p=await as({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=ss(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 dn(t,e){return(e?.length??0)>0?
|
|
1472
|
+
`);try{let p=await as({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=ss(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 dn(t,e){return(e?.length??0)>0?I_(t.project.local_path,e):null}function W_(t){return iu(au(t))}function cu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
1473
1473
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
1474
|
-
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 uu(t,e){if(!
|
|
1475
|
-
`);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 BA(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||!WA.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var is,WA,We=E(()=>{"use strict";Pe();nn();Un();
|
|
1474
|
+
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 uu(t,e){if(!M_(t))return!1;let r=vi(t,"durable-memory");function n(s){let o;try{o=D_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=vi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(P_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function UA(t,e,r){let n=vi(t.local_path,"durable-memory");if(!M_(n))return;let s;try{s=D_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=vi(n,o),a;try{a=P_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=MA(i,"utf8")}catch{continue}let c=BA(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
|
|
1475
|
+
`);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 BA(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||!WA.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var is,WA,We=E(()=>{"use strict";Pe();nn();Un();x_();ou();Rn();A_();R_();os();is="__paused__:";WA=new Set(["user","feedback","project","reference"])});import{spawnSync as B_}from"node:child_process";function qA(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=B_("git",["diff","--quiet"],{cwd:o}).status!==0,a=B_("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),K(t,r,n,Rc),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),K(t,r,n,"clean"),V(t.workflow,e.next)}var q_,H_=E(()=>{"use strict";We();q_={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=>qA(t,t.state)}});async function HA(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await O_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),K(t,r,n,"matched"),V(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),K(t,r,n,"no_match"),e.default_next!==void 0?V(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var J_,X_=E(()=>{"use strict";We();os();J_={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=>HA(t,t.state)}});async function JA(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=dn(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 un(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??""}
|
|
1476
1476
|
${m}`:null).filter(m=>m!==null).join(`
|
|
1477
1477
|
|
|
1478
|
-
`),c=`${n}:consolidator`,u=await un(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=J(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"&&K(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(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"),K(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Lt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var
|
|
1478
|
+
`),c=`${n}:consolidator`,u=await un(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=J(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"&&K(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(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"),K(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Lt(t,n,m,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var G_,V_=E(()=>{"use strict";We();G_={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=>JA(t,t.state)}});async function XA(t,e){let r=t.stateId,n=t.displayName,s=J(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 Ti(e.items_from,t),a=zA(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?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await VA(t,e,s.id,a,l):await GA(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})),K(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function GA(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await z_(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 VA(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 z_(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function z_(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__":KA(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 KA(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function zA(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 K_,Y_=E(()=>{"use strict";We();os();K_={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=>XA(t,t.state)}});async function YA(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=J(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:Z(t.workflow)}}let i=dn(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 Lt(t,n,o,e.write_back_durable_memory),V(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}`),K(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await as({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:Z(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"),K(t,r,n,"done"),e.write_back_durable_memory&&await Lt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Z_({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:Z(t.workflow)}}}return{kind:"paused"}}let l=J(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}
|
|
1479
1479
|
|
|
1480
|
-
${u}`:u;try{let f=await as({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:Z(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 Lt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(
|
|
1480
|
+
${u}`:u;try{let f=await as({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:Z(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 Lt(t,n,o,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Z_({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:Z(t.workflow)}}}function Z_(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=D();e.dal.setRunPausedState(e.run_id,`${is}${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(ZA({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function ZA(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=QA(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:eR(o,3),paused_at:i,created_run_inputs:nr(e.job.payload)}}function QA(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 eR(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 Q_,eg=E(()=>{"use strict";Un();We();Q_={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=>YA(t,t.state)}});async function tR(t,e){let r=t.stateId,n=t.displayName,s=U_(t,e.over);if(s===null){let d=J(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?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=J(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:Z(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=rR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=J(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})),K(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function rR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var tg,rg=E(()=>{"use strict";We();tg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>tR(t,t.state)}});import{createHash as nR}from"node:crypto";import{existsSync as sR,mkdirSync as oR,readFileSync as iR,writeFileSync as aR}from"node:fs";import{dirname as lR,isAbsolute as sg,normalize as cR,resolve as ls}from"node:path";import{Document as uR,ExternalHyperlink as dR,HeadingLevel as fn,LevelFormat as fR,Packer as mR,Paragraph as ut,Table as pR,TableCell as hR,TableRow as _R,TextRun as dt,WidthType as gR}from"docx";import{marked as wR}from"marked";async function yR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await ER(t,e,n),i=await bR(t,e),a=await SR(t,e.title),l=await xR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return oR(lR(i),{recursive:!0}),aR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:nR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),K(t,r,n,{output_path:i,path:i,bytes:l.length}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function ER(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?IR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=kR(t.project.local_path,o);if(i!==null){if(!sR(i))throw new Error(`markdown_source file not found: ${i}`);return Ii(iR(i,"utf8"))}return Ii(o)}async function bR(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=TR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function SR(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 TR(t,e){let r=ls(t);return cR(sg(e)?ls(e):ls(r,e))}function kR(t,e){return vR(e)?sg(e)?ls(e):ls(t,e):null}function vR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function IR(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 Ii(s);let o=t.dal.query(`SELECT sa.content
|
|
1481
1481
|
FROM step_artifact sa
|
|
1482
1482
|
JOIN step s ON s.id = sa.step_id
|
|
1483
1483
|
WHERE s.run_id = ?
|
|
1484
1484
|
AND s.state_name LIKE ?
|
|
1485
1485
|
AND sa.content IS NOT NULL
|
|
1486
1486
|
ORDER BY sa.id DESC
|
|
1487
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Ii(o[0].content)}function Ii(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function xR(t,e){let r=
|
|
1488
|
-
`).map(r=>new ut({children:[new dt({text:r.length===0?" ":r,font:"Courier New"})]}))}function sr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function AR(t){return t.type==="list"&&Array.isArray(t.items)}function RR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function OR(t){return t.type==="code"&&typeof t.text=="string"}function LR(t){switch(t){case 1:return fn.HEADING_1;case 2:return fn.HEADING_2;case 3:return fn.HEADING_3;case 4:return fn.HEADING_4;case 5:return fn.HEADING_5;default:return fn.HEADING_6}}var
|
|
1489
|
-
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g
|
|
1487
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Ii(o[0].content)}function Ii(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function xR(t,e){let r=ig(wR.lexer(t,{gfm:!0})),n=new uR({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:fR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ut("")]:r}]});return mR.toBuffer(n)}function ig(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ut({heading:LR(r.depth),children:or(sr(r))}));break;case"paragraph":e.push(new ut({children:or(sr(r))}));break;case"text":e.push(new ut({children:sr(r).length===0?[new dt(r.text)]:or(sr(r))}));break;case"blockquote":e.push(...ig(sr(r)).map(n=>n instanceof ut?n:new ut({children:[new dt(r.text)]})));break;case"list":AR(r)&&e.push(...$R(r));break;case"table":RR(r)&&e.push(jR(r));break;case"code":OR(r)&&e.push(...NR(r));break;case"hr":e.push(new ut(""));break;case"html":r.text.trim().length>0&&e.push(new ut({children:[new dt(r.text)]}));break;default:break}return e}function or(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new dt({text:n.text,...du(e)}));break;case"strong":r.push(...or(sr(n),{...e,bold:!0}));break;case"em":r.push(...or(sr(n),{...e,italics:!0}));break;case"codespan":r.push(new dt({text:n.text,...du({...e,code:!0})}));break;case"link":r.push(new dR({link:n.href,children:or(sr(n),{...e})}));break;case"br":r.push(new dt({text:"",break:1}));break;case"image":r.push(new dt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new dt({text:n.text,strike:!0}));break;default:r.push(new dt({text:n.raw,...du(e)}));break}return r.length===0?[new dt("")]:r}function du(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function $R(t){return t.items.map(e=>new ut({children:or(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:ng(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:ng(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function ng(t){return t.task?`[${t.checked?"x":" "}] `:""}function jR(t){let e=[t.header,...t.rows].map(r=>new _R({children:r.map(n=>new hR({children:[new ut({children:or(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new pR({width:{size:100,type:gR.PERCENTAGE},rows:e})}function NR(t){return t.text.split(`
|
|
1488
|
+
`).map(r=>new ut({children:[new dt({text:r.length===0?" ":r,font:"Courier New"})]}))}function sr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function AR(t){return t.type==="list"&&Array.isArray(t.items)}function RR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function OR(t){return t.type==="code"&&typeof t.text=="string"}function LR(t){switch(t){case 1:return fn.HEADING_1;case 2:return fn.HEADING_2;case 3:return fn.HEADING_3;case 4:return fn.HEADING_4;case 5:return fn.HEADING_5;default:return fn.HEADING_6}}var og,ag=E(()=>{"use strict";We();og={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=>yR(t,t.state)}});import{createHash as CR}from"node:crypto";import{existsSync as MR,mkdirSync as DR,readFileSync as lg,statSync as PR}from"node:fs";import{dirname as FR,isAbsolute as cg,normalize as UR,resolve as cs}from"node:path";import{marked as WR}from"marked";import BR from"write-excel-file/node";async function qR(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await HR(t,e),i=JR(e.input_format),a=await XR(t,e),l=await GR(t,e.title),c=i==="markdown"?rO(o):YR(o);await nO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=PR(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=CR("sha256").update(lg(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}`),K(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function HR(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=KR(t.project.local_path,r);if(n!==null){if(!MR(n))throw new Error(`source file not found: ${n}`);return lg(n,"utf8")}return r}function JR(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function XR(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=VR(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function GR(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 VR(t,e){let r=cs(t);return UR(cg(e)?cs(e):cs(r,e))}function KR(t,e){return zR(e)?cg(e)?cs(e):cs(t,e):null}function zR(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function YR(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(!xi(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>ZR(r,n))}function ZR(t,e){if(!xi(t))throw new Error(`sheets[${e}] must be an object`);let r=QR(t.headers,`sheets[${e}].headers`),n=eO(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:tO(t.styles)}}function QR(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 eO(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 tO(t){if(!xi(t)||!xi(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 rO(t){let e=WR.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(uO(s)){n=s.text;continue}dO(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 nO(t){DR(FR(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:aO(n.name,e),data:sO(n),columns:iO(n)}));await BR(r).toFile(t.outputPath)}function sO(t){let e=[];if(t.headers.length>0){let r=cO(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(oO));return e.length===0?[[{}]]:e}function oO(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 iO(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 aO(t,e){let r=lO(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 lO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function cO(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 uO(t){return t.type==="heading"&&typeof t.text=="string"}function dO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function xi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ug,dg=E(()=>{"use strict";We();ug={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>qR(t,t.state)}});import{spawnSync as fO}from"node:child_process";async function pO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(fO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=J(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}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let o=dn(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 un(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1489
|
+
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=j_(p.text);if(g!==null){let _=J(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=J(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),S=ss(p.text,T);if(S.outcome===null){let x=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(x.id,null,`unhandled_stance:${S.reason}`),{kind:"escalate",token:"",reason:`no_stance:${S.reason}`}}let v=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,S.outcome,"outcomes_from_stance"),K(t,r,n,S.outcome),V(t.workflow,e.outcomes_from_stance[S.outcome])}let g=ss(p.text,mO);if(g.outcome!==null){let T=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Lt(t,n,T,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>un(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1490
1490
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Lt(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1491
1491
|
|
|
1492
|
-
`),e.loop_feedback_artifact!==void 0){let g=J(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=J(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}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}var mO,dg,fg=E(()=>{"use strict";ou();We();mO=["blocked","failed","aborted"],dg={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=>pO(t,t.state)}});import{spawnSync as hO}from"node:child_process";async function _O(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=cu(t,n),i=U_(s);if(i.matched&&!o){let h=J(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:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=hO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=J(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:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&uu(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:Z(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}`),K(t,r,n,m),V(t.workflow,p))}var mg,pg=E(()=>{"use strict";We();mg={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=>_O(t,t.state)}});async function gO(t,e){let r=t.stateId,n=t.displayName,s=J(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:Z(t.workflow)};let i=Ce(o.definition),a=await wO(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:Z(t.workflow)};K(t,r,n,yO(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:Z(t.workflow)}:V(t.workflow,u)}async function wO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await O_(s,t);r[n]=o===s?await Ti(s,t):o}return r}function yO(t,e,r){let n={};for(let s of r)n[s.name]=EO(t,e,s);return n}function EO(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=bO(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 bO(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 hg,_g=E(()=>{"use strict";an();We();os();hg={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=>gO(t,t.state)}});function SO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var gg,wg=E(()=>{"use strict";We();gg={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=>SO(t,t.state)}});async function TO(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=kO(t.cursor),a=o.filter(vO).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 kO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function vO(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var yg,Eg=E(()=>{"use strict";yg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>TO(t)}});async function IO(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 bg,Sg=E(()=>{"use strict";bg={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=>IO(t)}});function Tg(t){t.register(B_),t.register(dg),t.register(X_),t.register(Z_),t.register(eg),t.register(sg),t.register(cg),t.register(mg),t.register(H_),t.register(V_),t.register(hg),t.register(gg),t.register(bg),t.register(yg)}var kg=E(()=>{"use strict";q_();J_();G_();z_();Q_();tg();ig();ug();fg();pg();_g();wg();Eg();Sg()});function ji(){return $i===null&&($i=new fu,Tg($i)),$i}var xO,fu,$i,mu=E(()=>{"use strict";kg();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"},fu=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())}},$i=null});async function xg(t){Rg(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=jO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=us(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=b_(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(us(n)){let m=pu({dal:t.dal,workflow:Ai(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:nr(t.job.payload)??{},team_id:t.team.id}),p=await jg(n,m,i.current_state??n.entry_step_id);return Ig(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=pu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:nr(t.job.payload)??{},team_id:t.team.id}),f=await $g(d,i.current_state??n.start_at);return Ig(t.dal,r.id,i.id,n.name,f),f}function Ig(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 pu(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 hu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Rg(n);let o=us(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=pu({dal:t.dal,workflow:us(n)?Ai(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return us(n)?jg(n,a,i.current_state??n.entry_step_id):$g(a,i.current_state??n.start_at)}};return e}async function $g(t,e){let r=e;if(r.startsWith(is))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 Ct(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=Ni(t,Z(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return et(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Ct(t,l.terminal);r=l.state;continue}let i,a=Ag(t,r);if(a!==null){let l=J(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===An)return Ct(t,Qa);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):et(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await hu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return et(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ni(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return et(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Ct(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=Ni(t,Z(t.workflow));return n.kind==="terminal"?Ct(t,n.terminal):Ct(t,Z(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 et(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Ag(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===An)return Ct(e,Qa);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 et(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 $O(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return et(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=Ai(t,a);try{let p=Ni(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return et(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Ct(e,p.terminal);let h=s.get(p.state);if(h===void 0)return et(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(Mr(d))return et(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 et(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})}),Ct(e,"aborted")}async function $O(t,e,r){let n=Ng(e,r),s=t.workflow;t.workflow=Ai(e,r);try{return await hu(t,r.id,n,r.name)}finally{t.workflow=s}}function Ng(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 hu(t,e,r,n){let s=ji().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?RO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(P_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function jO(t,e){try{let r=JSON.parse(t);if(AO(r)&&r.definition_schema_version===3)return gt.parse(r)}catch{return e}return e}function us(t){return t.definition_schema_version===3}function Ai(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]=Ng(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:NO(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 NO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function AO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function RO(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 Ct(t,e){t.dal.setRunTerminalState(t.run_id,e);try{g_(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 Ag(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 Ni(t,e){if(!OO(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&&LO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function OO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function LO(t,e,r){let n=CO(t),s=r.capture_evidence&&n!==null?MO(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 CO(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 MO(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 Rg(t){if(!vg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${vg.join(", ")}`)}var vg,Og=E(()=>{"use strict";sn();w_();S_();We();mu();Rn();vg=[1,2,3]});import{readFileSync as DO,readdirSync as PO}from"node:fs";import{basename as FO,join as UO,resolve as WO}from"node:path";function Mg(t={}){let e=WO(t.workflowsDir??"workflows"),r=PO(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=>BO(UO(e,n)))}}function BO(t){let e=FO(t);try{let r=DO(t,"utf8"),n=Ce(r);return Fg(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:Ug(r)}}}function Dg(t,e){try{let r=Ce(e);return Fg(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:Ug(r)}}}function Pg(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(`
|
|
1492
|
+
`),e.loop_feedback_artifact!==void 0){let g=J(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=J(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}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}var mO,fg,mg=E(()=>{"use strict";ou();We();mO=["blocked","failed","aborted"],fg={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=>pO(t,t.state)}});import{spawnSync as hO}from"node:child_process";async function _O(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=cu(t,n),i=W_(s);if(i.matched&&!o){let h=J(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:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=hO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=J(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:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&uu(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:Z(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}`),K(t,r,n,m),V(t.workflow,p))}var pg,hg=E(()=>{"use strict";We();pg={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=>_O(t,t.state)}});async function gO(t,e){let r=t.stateId,n=t.displayName,s=J(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:Z(t.workflow)};let i=Ce(o.definition),a=await wO(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:Z(t.workflow)};K(t,r,n,yO(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:Z(t.workflow)}:V(t.workflow,u)}async function wO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await L_(s,t);r[n]=o===s?await Ti(s,t):o}return r}function yO(t,e,r){let n={};for(let s of r)n[s.name]=EO(t,e,s);return n}function EO(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=bO(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 bO(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 _g,gg=E(()=>{"use strict";an();We();os();_g={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=>gO(t,t.state)}});function SO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var wg,yg=E(()=>{"use strict";We();wg={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=>SO(t,t.state)}});async function TO(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=kO(t.cursor),a=o.filter(vO).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 kO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function vO(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 Eg,bg=E(()=>{"use strict";Eg={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=>TO(t)}});async function IO(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 Sg,Tg=E(()=>{"use strict";Sg={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=>IO(t)}});function kg(t){t.register(q_),t.register(fg),t.register(G_),t.register(Q_),t.register(tg),t.register(og),t.register(ug),t.register(pg),t.register(J_),t.register(K_),t.register(_g),t.register(wg),t.register(Sg),t.register(Eg)}var vg=E(()=>{"use strict";H_();X_();V_();Y_();eg();rg();ag();dg();mg();hg();gg();yg();bg();Tg()});function ji(){return $i===null&&($i=new fu,kg($i)),$i}var xO,fu,$i,mu=E(()=>{"use strict";vg();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"},fu=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())}},$i=null});async function $g(t){Og(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=jO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=us(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=S_(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(us(n)){let m=pu({dal:t.dal,workflow:Ai(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:nr(t.job.payload)??{},team_id:t.team.id}),p=await Ng(n,m,i.current_state??n.entry_step_id);return xg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=pu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:nr(t.job.payload)??{},team_id:t.team.id}),f=await jg(d,i.current_state??n.start_at);return xg(t.dal,r.id,i.id,n.name,f),f}function xg(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 pu(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 hu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Og(n);let o=us(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=pu({dal:t.dal,workflow:us(n)?Ai(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return us(n)?Ng(n,a,i.current_state??n.entry_step_id):jg(a,i.current_state??n.start_at)}};return e}async function jg(t,e){let r=e;if(r.startsWith(is))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 Ct(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=Ni(t,Z(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return et(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Ct(t,l.terminal);r=l.state;continue}let i,a=Rg(t,r);if(a!==null){let l=J(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===An)return Ct(t,Qa);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):et(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await hu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return et(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ni(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return et(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Ct(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=Ni(t,Z(t.workflow));return n.kind==="terminal"?Ct(t,n.terminal):Ct(t,Z(t.workflow))}async function Ng(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 et(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Rg(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===An)return Ct(e,Qa);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 et(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 $O(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return et(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=Ai(t,a);try{let p=Ni(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return et(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Ct(e,p.terminal);let h=s.get(p.state);if(h===void 0)return et(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(Mr(d))return et(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 et(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})}),Ct(e,"aborted")}async function $O(t,e,r){let n=Ag(e,r),s=t.workflow;t.workflow=Ai(e,r);try{return await hu(t,r.id,n,r.name)}finally{t.workflow=s}}function Ag(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 hu(t,e,r,n){let s=ji().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?RO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(F_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function jO(t,e){try{let r=JSON.parse(t);if(AO(r)&&r.definition_schema_version===3)return gt.parse(r)}catch{return e}return e}function us(t){return t.definition_schema_version===3}function Ai(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]=Ag(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:NO(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 NO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function AO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function RO(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 Ct(t,e){t.dal.setRunTerminalState(t.run_id,e);try{w_(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 Rg(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 Ni(t,e){if(!OO(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&&LO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function OO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function LO(t,e,r){let n=CO(t),s=r.capture_evidence&&n!==null?MO(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 CO(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 MO(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 Og(t){if(!Ig.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Ig.join(", ")}`)}var Ig,Lg=E(()=>{"use strict";sn();y_();T_();We();mu();Rn();Ig=[1,2,3]});import{readFileSync as DO,readdirSync as PO}from"node:fs";import{basename as FO,join as UO,resolve as WO}from"node:path";function Dg(t={}){let e=WO(t.workflowsDir??"workflows"),r=PO(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=>BO(UO(e,n)))}}function BO(t){let e=FO(t);try{let r=DO(t,"utf8"),n=Ce(r);return Ug(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:Wg(r)}}}function Pg(t,e){try{let r=Ce(e);return Ug(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:Wg(r)}}}function Fg(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(`
|
|
1493
1493
|
`)}
|
|
1494
|
-
`}function
|
|
1494
|
+
`}function Ug(t,e){let r=HO(e),n=JO(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=qO(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 qO(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function HO(t){return _u(t)?t.entry_step_id:t.start_at}function JO(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 Wg(t){return t instanceof Ot?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 Bg(t){let e=new Set;if(_u(t))for(let r of t.steps){let n=r.members??{};Cg(n,e)}else for(let r of Object.values(t.states))Cg(r,e);return[...e].sort()}function Cg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=Mg(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=Mg(i);a!==null&&e.add(a)}}}function Mg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ri=E(()=>{"use strict";an()});function XO({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,Oi)[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}=GO(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ds}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Oi,source_ref:ds,payload:JSON.stringify({kind:ds,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function GO(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
1495
1495
|
FROM run r
|
|
1496
1496
|
JOIN job j ON j.id = r.job_id
|
|
1497
1497
|
WHERE j.project_id = ?
|
|
1498
1498
|
AND r.terminal_state IS NOT NULL
|
|
1499
|
-
${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
|
|
1499
|
+
${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 qg(t){for(let e of VO)try{e(t)}catch{}}var Oi,ds,VO,gu=E(()=>{"use strict";Oi="memory_policy",ds="memory_consolidation_request";VO=[XO]});var Kg={};le(Kg,{getOrInsertConsolidationWorkflow:()=>Jg,runJobById:()=>fs,runOnce:()=>$r,startWorker:()=>QO});import{createHash as KO}from"node:crypto";import{readFileSync as zO}from"node:fs";import{pathToFileURL as YO}from"node:url";function Jg(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Jo({swallow:!0});let n=Xo(e);if(n===null)return null;let s=zO(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:YO(n).href,source_sha256:KO("sha256").update(s).digest("hex")})}catch{return null}}async function $r(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??Hg,evaluator:n=>Gg(t.dal,n)}),r===null?null:await Xg(t.dal,r,e)}catch(n){if(r!==null)return ir(t.dal,r,"worker_run_failed",xr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Li(xr(n))})})}catch{}return null}finally{t.max_concurrent}}async function fs(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??Hg,evaluator:s=>Gg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Xg(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...ir(t.dal,r,"worker_run_failed",xr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Li(xr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Xg(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return ir(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Oi&&e.source_ref===ds,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Jg(t):i=Vg(t,e,n),i===null)return ir(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 ir(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return ir(t,e,"worker_workflow_invalid",xr(d),r,n)}let u=eL(c,l);if(u.length>0)return ir(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await $g({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 ir(t,e,"worker_run_failed",xr(d),r,n,a)}}function Gg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Vg(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 fi({workflow:s,job:e,project:r})}function Vg(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function QO(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await $r(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Li(xr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??ZO))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function ir(t,e,r,n,s,o,i){let a=Li(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 xr(t){return t instanceof Error?t.message:String(t)}function Li(t){return t.length>4096?t.slice(0,4096):t}function eL(t,e){let r=Bg(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Hg,ZO,ms=E(()=>{"use strict";Go();Lg();an();Ri();Uc();gu();Hg=6e5,ZO=5e3});import{existsSync as tL,readFileSync as rL}from"node:fs";import{marked as nL}from"marked";function Qg(t,e){t.get("/layman",r=>r.html(je("Layman Home",sL(e.dal)))),t.get("/api/layman",r=>r.json(nw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Zg(r);return n===null?r.notFound():r.html(je(`Start ${mn(n)}`,aL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Zg(r);return n===null?r.notFound():n==="newspaper"?zg(r,e.dal):lL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=br(e.dal,Ci(r,"id"));return n===null?r.notFound():r.html(je(`Run ${n.id}`,dL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=br(e.dal,Ci(r,"id"));return n===null?r.notFound():r.json(SL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>mL(r,e.dal)),t.get("/layman/newspaper",r=>r.html(je("Newspaper Subscriptions",EL(e.dal)))),t.post("/layman/newspaper",r=>zg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Yg(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Yg(r,e.dal))}function sL(t){let e=nw(t);return`<section class="layman-home">
|
|
1500
1500
|
<h1>Welcome</h1>
|
|
1501
1501
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
1502
1502
|
<div class="grid">${Mi.map(oL).join("")}</div>
|
|
@@ -1511,7 +1511,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1511
1511
|
<h2>${b(t.title)}</h2>
|
|
1512
1512
|
<p>${b(t.description)}</p>
|
|
1513
1513
|
<p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
|
|
1514
|
-
</article>`}function iL(t){return de(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(mn(e.workflow_name)),b(e.terminal_state??e.current_state??"queued"),b(e.started_at)]))}function aL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${b(mn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${b(mn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=
|
|
1514
|
+
</article>`}function iL(t){return de(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(mn(e.workflow_name)),b(e.terminal_state??e.current_state??"queued"),b(e.started_at)]))}function aL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${b(mn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${b(mn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=ew(n);return e==="info-qa"?`<h1>Ask a Question</h1>
|
|
1515
1515
|
<form method="post" action="/layman/start/info-qa">
|
|
1516
1516
|
${s}
|
|
1517
1517
|
<label>Ask anything<textarea name="question" rows="8" required></textarea></label>
|
|
@@ -1524,12 +1524,12 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1524
1524
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
1525
1525
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
1526
1526
|
<button type="submit">Start Document Wizard</button>
|
|
1527
|
-
</form>`:
|
|
1528
|
-
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${hL(t,e,r)}`;let s=
|
|
1527
|
+
</form>`:rw(n,"/layman/start/newspaper")}function ew(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${b(e.id)}">${b(e.name)}</option>`).join("")}</select></label>`}async function lL(t,e,r){let n=await t.req.parseBody(),s=iw(e,n);if(s===null)return t.html(je("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(je("Start workflow",`<p class="error">${b(mn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?cL(n):uL(n);if(typeof i=="string")return t.html(je("Start workflow",`<p class="error">${b(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 $r({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 cL(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 uL(t){let e=Ge(t.task_description).trim(),r=jL(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 dL(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(mn(r))}</h1>
|
|
1528
|
+
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${hL(t,e,r)}`;let s=ow(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${fL(e,s)}`:`${n}<section hx-get="/layman/run/${b(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
1529
1529
|
<h2>Running</h2>
|
|
1530
1530
|
<p class="muted">Current stage: <strong>${b(e.current_state??"starting")}</strong></p>
|
|
1531
|
-
${
|
|
1532
|
-
</section>`}function
|
|
1531
|
+
${tw(e)}
|
|
1532
|
+
</section>`}function tw(t){let e=t.steps.map(r=>[b(r.id),b(`\u25B6 ${r.state_name}`),b(r.outcome??"running"),b(r.status_detail??"")]);return de(["step","stage","outcome","detail"],e)}function fL(t,e){return`<section class="metric paused-interactive">
|
|
1533
1533
|
<h2>${b(vL(e.state_name))}</h2>
|
|
1534
1534
|
<p class="muted">The agent is waiting for your response.</p>
|
|
1535
1535
|
<h3>Agent output</h3>
|
|
@@ -1545,15 +1545,15 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1545
1545
|
<p>Status: <strong>${b(e.terminal_state)}</strong></p>
|
|
1546
1546
|
${n?_L(t,e,r):wL(e)}
|
|
1547
1547
|
<h2>Stage Log</h2>
|
|
1548
|
-
${
|
|
1548
|
+
${tw(e)}
|
|
1549
1549
|
</section>`}function _L(t,e,r){if(r==="info-qa"){let n=bu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Su(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return gL(t,e);if(r==="newspaper"){let n=bu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Su(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function gL(t,e){let r=Sr(t,e.id),n=wu(r,["render_docx"]),s=wu(r,["render_xlsx"]),o=bu(e,["review:coder[0]_transcript","chat_output_md"])??yL(wu(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
|
|
1550
1550
|
<pre>${b($L(xL(o??"No preview available."),30))}</pre>
|
|
1551
1551
|
<h3>Downloads</h3>
|
|
1552
1552
|
${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function wL(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function bu(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 wu(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function yL(t){if(t===null||!tL(t)||!t.endsWith(".md"))return null;try{return rL(t,"utf8")}catch{return null}}function EL(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
|
|
1553
|
-
${bL(
|
|
1553
|
+
${bL(sw(t))}
|
|
1554
1554
|
<h2>Add Subscription</h2>
|
|
1555
|
-
${e.length===0?'<p class="error">Create a project before subscribing.</p>':
|
|
1556
|
-
${
|
|
1555
|
+
${e.length===0?'<p class="error">Create a project before subscribing.</p>':rw(e,"/layman/newspaper")}`}function rw(t,e){return`<form method="post" action="${b(e)}">
|
|
1556
|
+
${ew(t)}
|
|
1557
1557
|
<label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
|
|
1558
1558
|
<label>Schedule<select name="schedule">
|
|
1559
1559
|
<option value="daily">Daily at 6am</option>
|
|
@@ -1563,31 +1563,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1563
1563
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
1564
1564
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
1565
1565
|
<button type="submit">Create subscription</button>
|
|
1566
|
-
</form>`}async function
|
|
1566
|
+
</form>`}async function zg(t,e){let r=await t.req.parseBody(),n=iw(e,r);if(n===null)return t.html(je("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(je("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(je("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:kL(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 Yg(t,e){let r=Ci(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function bL(t){return de(["id","project","topics","status","action"],t.map(e=>{let r=NL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(e.id),b(e.project_name),b(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function nw(t){let e=sw(t);return{workflows:Mi,recent_runs:TL(t),newspaper_subscriptions:e.length}}function SL(t,e){let r=ow(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 TL(t){return t.query(`SELECT r.*, w.name AS workflow_name
|
|
1567
1567
|
FROM run r
|
|
1568
1568
|
JOIN workflow w ON w.id = r.workflow_id
|
|
1569
1569
|
WHERE w.name IN (${Eu.map(()=>"?").join(",")})
|
|
1570
1570
|
ORDER BY r.id DESC
|
|
1571
|
-
LIMIT 10`,...Eu)}function
|
|
1571
|
+
LIMIT 10`,...Eu)}function sw(t){return t.query(`SELECT pw.*, p.name AS project_name
|
|
1572
1572
|
FROM project_workflow pw
|
|
1573
1573
|
JOIN workflow w ON w.id = pw.workflow_id
|
|
1574
1574
|
JOIN project p ON p.id = pw.project_id
|
|
1575
1575
|
WHERE w.name = ?
|
|
1576
|
-
ORDER BY pw.id DESC`,"newspaper")}function
|
|
1576
|
+
ORDER BY pw.id DESC`,"newspaper")}function ow(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function iw(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function kL(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 Zg(t){let e=t.req.param("workflow");return Eu.includes(e)?e:null}function mn(t){return Mi.find(e=>e.name===t)?.title??t}function vL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Su(t){return nL.parse(t,{async:!1})}function IL(t){return t==="done"||t==="pr_ready"||t==="merged"}function xL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function $L(t,e){return t.split(`
|
|
1577
1577
|
`).slice(0,e).join(`
|
|
1578
|
-
`)}function jL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function NL(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 yu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ci(t,e){return Number(t.req.param(e))}var Mi,Eu,iw=E(()=>{"use strict";ms();Nt();eu();Mi=[{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."}],Eu=Mi.map(t=>t.name)});function RL(t){return t.replace(/^\/+/,"")}function aw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function pn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=RL(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 aw(t.userId)&&aw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${AL}/${t.identityId}/`}function LL(t){return String(Math.max(0,Math.floor(t))).padStart(OL,"0")}function Tu(t,e,r){return`${t}${e}${LL(r)}.json`}function Di(t,e){return`${t}${e}`}function Pi(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 AL,OL,Fi=E(()=>{"use strict";AL="mailbox";OL=12});function Mt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ui[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=Ui[a&15]+i,a=a>>4;let l=Ui[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ui[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 Ui,Wi=E(()=>{"use strict";Ui="0123456789abcdef"});function vu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Iu(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 fw(t){return t.conversation_id===dw&&DL(t.payload)}function DL(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function PL(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:fw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var lw,cw,uw,CL,dw,ML,ku,jr,Bi=E(()=>{"use strict";Fi();Wi();lw=3e3,cw=1e4,uw=12e3,CL=1e3,dw="__lmctl_heartbeat__",ML={kind:"heartbeat"},ku={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},jr=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=pn({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=vu(e.readIntervalMs??e.pollIntervalMs??lw,lw),this.heartbeatIdleMs=vu(e.heartbeatIdleMs??cw,cw),this.backoffReadIntervalMs=vu(e.backoffReadIntervalMs??e.pollIntervalMs??uw,uw)}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??ku;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=Di(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:CL,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Pi(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:Mt(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=Tu(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??ku;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=Tu(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(Iu(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),fw(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=PL(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??ku;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(dw,ML)}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 FL}from"@hono/node-server/conninfo";function mw(t,e){let r=e.bucket??UL,n=e.remoteAddressOf??(o=>BL(o)),s=o=>{let i=n(o);return qL(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=xu(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 Iu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:$u(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=xu(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:$u(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=xu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=WL(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:$u(d)},500)}})}function xu(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 WL(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function BL(t){try{return FL(t).remote.address}catch{return}}function qL(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function $u(t){return t instanceof Error?t.message:String(t)}var UL,pw=E(()=>{"use strict";Bi();UL="local"});function hw(t,e){t.get("/mailbox/workspace",r=>XL(r,e)),t.get("/mailbox/projects",r=>GL(r,e)),t.get("/mailbox/projects/:id",r=>VL(r,e)),t.post("/mailbox/projects",r=>KL(r,e)),t.patch("/mailbox/projects/:id",r=>zL(r,e)),t.delete("/mailbox/projects/:id",r=>YL(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>ZL(r,e)),t.get("/mailbox/prompts/:id",r=>QL(r,e))}function XL(t,e){e.dal.ensureWorkspace({id:_n,name:ju});let r=_w(e.dal),n={id:_n,name:ju,created_at:JL,projects:r};return t.json({workspace:n})}function GL(t,e){return t.json({projects:_w(e.dal)})}function VL(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(hn)){let s=Nu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ji(s)})}let n=ww(e.dal,r);return n===null?t.json({project:null},404):t.json({project:gw(n)})}async function KL(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:_n,name:ju});let s=e.dal.insertWebProject({workspace_id:_n,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:Ji(s)},201)}async function zL(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(hn)){let o=Nu(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:Ji(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function YL(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(hn)){let n=Nu(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 ZL(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=ww(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=`${HL}${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 eC({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:`${Hi}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function QL(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=tC(e.dal,r);return t.json({result:n})}function _w(t){let e=t.listProjects().map(gw),r=t.listWebProjectsActive(_n).map(Ji);return[...e,...r].sort(dC)}function gw(t){return{id:`${Hi}${t.id}`,workspace_id:_n,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 Ji(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:`${hn}${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 Nu(t,e){if(!e.startsWith(hn))return null;let r=e.slice(hn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function ww(t,e){if(e.startsWith(Hi)){let n=e.slice(Hi.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 eC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Bc(),Jh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function tC(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=lC(t,o?.team_id??null),a=aC(s),l=cC(n,a,i.length>0),c=uC(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:rC(t,o.workflow_name),d=u.totalEstimatedMs,f=yw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:nC(t,s.id),g=sC(s,a,h,u.perStep,i),_=oC(h,u.perStep),T=iC(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 rC(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 nC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function sC(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=yw(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 oC(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 iC(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 yw(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 aC(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 lC(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 cC(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 uC(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 dC(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 Hi,hn,HL,_n,ju,JL,Ew=E(()=>{"use strict";Hi="project:",hn="web_project:",HL="prompt:",_n="default",ju="Default workspace",JL=new Date(0).toISOString()});import{Buffer as bw}from"node:buffer";function Sw(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 Tw(t){return pC[t]}function kw(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 fC,mC,Xi,pC,Au=E(()=>{"use strict";fC=1e4,mC=256*1024,Xi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Sw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,fC),this.pushByteCap=Sw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,mC),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+=bw.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=${bw.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
|
|
1578
|
+
`)}function jL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function NL(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 yu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ci(t,e){return Number(t.req.param(e))}var Mi,Eu,aw=E(()=>{"use strict";ms();Nt();eu();Mi=[{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."}],Eu=Mi.map(t=>t.name)});function RL(t){return t.replace(/^\/+/,"")}function lw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function pn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=RL(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 lw(t.userId)&&lw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${AL}/${t.identityId}/`}function LL(t){return String(Math.max(0,Math.floor(t))).padStart(OL,"0")}function Tu(t,e,r){return`${t}${e}${LL(r)}.json`}function Di(t,e){return`${t}${e}`}function Pi(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 AL,OL,Fi=E(()=>{"use strict";AL="mailbox";OL=12});function Mt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ui[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=Ui[a&15]+i,a=a>>4;let l=Ui[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ui[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 Ui,Wi=E(()=>{"use strict";Ui="0123456789abcdef"});function vu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Iu(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 mw(t){return t.conversation_id===fw&&DL(t.payload)}function DL(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function PL(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:mw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var cw,uw,dw,CL,fw,ML,ku,jr,Bi=E(()=>{"use strict";Fi();Wi();cw=3e3,uw=1e4,dw=12e3,CL=1e3,fw="__lmctl_heartbeat__",ML={kind:"heartbeat"},ku={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},jr=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=pn({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=vu(e.readIntervalMs??e.pollIntervalMs??cw,cw),this.heartbeatIdleMs=vu(e.heartbeatIdleMs??uw,uw),this.backoffReadIntervalMs=vu(e.backoffReadIntervalMs??e.pollIntervalMs??dw,dw)}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??ku;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=Di(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:CL,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Pi(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:Mt(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=Tu(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??ku;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=Tu(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(Iu(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),mw(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=PL(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??ku;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(fw,ML)}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 FL}from"@hono/node-server/conninfo";function pw(t,e){let r=e.bucket??UL,n=e.remoteAddressOf??(o=>BL(o)),s=o=>{let i=n(o);return qL(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=xu(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 Iu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:$u(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=xu(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:$u(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=xu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=WL(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:$u(d)},500)}})}function xu(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 WL(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function BL(t){try{return FL(t).remote.address}catch{return}}function qL(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function $u(t){return t instanceof Error?t.message:String(t)}var UL,hw=E(()=>{"use strict";Bi();UL="local"});function _w(t,e){t.get("/mailbox/workspace",r=>XL(r,e)),t.get("/mailbox/projects",r=>GL(r,e)),t.get("/mailbox/projects/:id",r=>VL(r,e)),t.post("/mailbox/projects",r=>KL(r,e)),t.patch("/mailbox/projects/:id",r=>zL(r,e)),t.delete("/mailbox/projects/:id",r=>YL(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>ZL(r,e)),t.get("/mailbox/prompts/:id",r=>QL(r,e))}function XL(t,e){e.dal.ensureWorkspace({id:_n,name:ju});let r=gw(e.dal),n={id:_n,name:ju,created_at:JL,projects:r};return t.json({workspace:n})}function GL(t,e){return t.json({projects:gw(e.dal)})}function VL(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(hn)){let s=Nu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ji(s)})}let n=yw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:ww(n)})}async function KL(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:_n,name:ju});let s=e.dal.insertWebProject({workspace_id:_n,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:Ji(s)},201)}async function zL(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(hn)){let o=Nu(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:Ji(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function YL(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(hn)){let n=Nu(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 ZL(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=yw(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=`${HL}${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 eC({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:`${Hi}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function QL(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=tC(e.dal,r);return t.json({result:n})}function gw(t){let e=t.listProjects().map(ww),r=t.listWebProjectsActive(_n).map(Ji);return[...e,...r].sort(dC)}function ww(t){return{id:`${Hi}${t.id}`,workspace_id:_n,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 Ji(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:`${hn}${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 Nu(t,e){if(!e.startsWith(hn))return null;let r=e.slice(hn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function yw(t,e){if(e.startsWith(Hi)){let n=e.slice(Hi.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 eC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Bc(),Xh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function tC(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=lC(t,o?.team_id??null),a=aC(s),l=cC(n,a,i.length>0),c=uC(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:rC(t,o.workflow_name),d=u.totalEstimatedMs,f=Ew(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:nC(t,s.id),g=sC(s,a,h,u.perStep,i),_=oC(h,u.perStep),T=iC(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 rC(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 nC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function sC(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=Ew(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 oC(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 iC(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 Ew(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 aC(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 lC(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 cC(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 uC(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 dC(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 Hi,hn,HL,_n,ju,JL,bw=E(()=>{"use strict";Hi="project:",hn="web_project:",HL="prompt:",_n="default",ju="Default workspace",JL=new Date(0).toISOString()});import{Buffer as Sw}from"node:buffer";function Tw(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 kw(t){return pC[t]}function vw(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 fC,mC,Xi,pC,Au=E(()=>{"use strict";fC=1e4,mC=256*1024,Xi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Tw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,fC),this.pushByteCap=Tw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,mC),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+=Sw.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=${Sw.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
|
|
1579
1579
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
1580
|
-
`,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)}};pC={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 Iw(t,e){t.post("/mailbox/terminal/launch",r=>hC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>_C(r,e)),t.get("/mailbox/terminal/sessions",r=>gC(r,e))}async function hC(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"||!vw.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=kw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Tw(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 _C(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||!vw.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 gC(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 vw,xw=E(()=>{"use strict";Au();vw=/^[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 wC}from"node:buffer";function bC(t){try{return wC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function $w(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 SC[t]}function Nw(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 yC,EC,Gi,SC,Ru=E(()=>{"use strict";yC=2e3,EC=64*1024,Gi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=$w(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,yC),this.pushByteCap=$w(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,EC),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=bC(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")))})}};SC={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 Rw(t,e){t.post("/mailbox/chat/launch",r=>TC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>kC(r,e)),t.get("/mailbox/chat/sessions",r=>vC(r,e))}async function TC(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"||!Aw.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=Nw(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 kC(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||!Aw.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 vC(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 Aw,Ow=E(()=>{"use strict";Ru();Aw=/^[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 IC}from"node:fs";function Cw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Lw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=IC(e.path,{encoding:"utf8"});return Lw(r)}catch{return[]}}function Lw(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 Mw=E(()=>{"use strict"});function Dw(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 Vi(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
1580
|
+
`,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)}};pC={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 xw(t,e){t.post("/mailbox/terminal/launch",r=>hC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>_C(r,e)),t.get("/mailbox/terminal/sessions",r=>gC(r,e))}async function hC(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"||!Iw.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=vw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=kw(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 _C(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||!Iw.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 gC(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 Iw,$w=E(()=>{"use strict";Au();Iw=/^[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 wC}from"node:buffer";function bC(t){try{return wC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function jw(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 Nw(t){return SC[t]}function Aw(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 yC,EC,Gi,SC,Ru=E(()=>{"use strict";yC=2e3,EC=64*1024,Gi=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=jw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,yC),this.pushByteCap=jw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,EC),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=bC(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")))})}};SC={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 Ow(t,e){t.post("/mailbox/chat/launch",r=>TC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>kC(r,e)),t.get("/mailbox/chat/sessions",r=>vC(r,e))}async function TC(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"||!Rw.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=Aw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Nw(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 kC(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||!Rw.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 vC(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 Rw,Lw=E(()=>{"use strict";Ru();Rw=/^[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 IC}from"node:fs";function Mw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Cw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=IC(e.path,{encoding:"utf8"});return Cw(r)}catch{return[]}}function Cw(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 Dw=E(()=>{"use strict"});function Pw(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 Vi(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
1581
1581
|
WHERE run_id = ?
|
|
1582
1582
|
AND acknowledged_at IS NULL
|
|
1583
1583
|
AND requires_user = 1
|
|
1584
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Ki=E(()=>{"use strict"});function Gw(t,e){t.all("/runtime/*",r=>xC(r.req.raw,e))}async function xC(t,e){try{return Response.json(await $C(t,e))}catch(r){if(r instanceof se)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 $C(t,e){let r=new URL(t.url),n=CC(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Ou(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return zi(t,n.id,s[2]),jC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){zi(t,n.id,s[2]);let o=Fw(e.dal,s[4]);return Pw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Ou(t),e.dal.listTeams().map(o=>LC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Uw(e.dal,Ww(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return qw(t,n.id,i.context),Bw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Uw(e.dal,Ww(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");qw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return Bw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){zi(t,n.id,s[2]);let o=Fw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return RC(e.dal,o,a),Pw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ps(t,n.id),e.dal.listWorkflows().map(o=>MC(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ps(t,n.id);let o=PC(e.dal,s[2]);return DC(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ps(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return FC(e.dal,o,i).map(l=>Jw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ps(t,n.id);let o=Hw(e.dal,s[2]);return Jw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ps(t,n.id);let o=Hw(e.dal,s[2]),i=WC(e.dal,o);return{runId:Pu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function jC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Vw(t,e,r))}}function Pw(t,e,r){let n=Vw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:NC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:AC(t,r)}}function Vw(t,e,r){let n=Kw(t,r.id),s=Cu(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 NC(t,e){let r=Kw(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:Cu(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 AC(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 RC(t,e,r){let n=OC(t,e.id);if(n!==null){let s=Vi(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=_t(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(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 Kw(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 OC(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 Cu(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 Fw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function Uw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function Ww(t){return t.startsWith("team:")?t.slice(5):t}function LC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Bw(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??Xw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function CC(t){let e=t.workspaceName??In()??fr.default;return{id:e,name:e}}function Ou(t){if(t.headers.get("x-lmctl-workspace-id")!==Xw)throw new se(400,"runtime request requires global-admin workspace identity")}function zi(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function ps(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function qw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");zi(t,e,r.workspaceId);return}Ou(t)}function Mu(t){return`${gn}${Du(t.name)}`}function Du(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Pu(t){return`${Lu}${t.id}`}function MC(t){let e=Yi(t.definition);return{id:Mu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function DC(t){let e=Yi(t.definition);return{id:Mu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Yi(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 PC(t,e){if(!e.startsWith(gn))throw new se(404,`template not found: ${e}`);let r=e.slice(gn.length),n=t.listWorkflows().filter(s=>Du(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Hw(t,e){if(!e.startsWith(Lu))throw new se(404,`run not found: ${e}`);let r=e.slice(Lu.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function FC(t,e,r){if(r!==null){if(!r.startsWith(gn))return[];let s=r.slice(gn.length),o=t.listWorkflows().filter(a=>Du(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 Jw(t,e){let r=t.getWorkflow(e.workflow_id),n=Cu(e),s=UC(r,e);return{id:Pu(e),templateId:r===null?`${gn}unknown`:Mu(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 UC(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]:[Yi(t.definition).nameToId.get(r)??r]}function WC(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Yi(r.definition),s=c=>n.nameToId.get(c)??c,o=Pu(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=BC(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 BC(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 Xw,gn,Lu,se,zw=E(()=>{"use strict";Ve();Ki();Nt();Xw="global-admin";gn="template:",Lu="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as qC,writeFileSync as HC}from"node:fs";import{randomUUID as Yw}from"node:crypto";import{dirname as JC,resolve as Zi,sep as Zw}from"node:path";async function ey(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(!zC(n))return t.text("missing image file",400);if(n.size>XC)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=YC(s);if(o===null||!(o in Qw))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=GC(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Zi(KC()):Zi(i.local_path),l=Zi(a,"uploads",Yw()),c=Zi(l,`${Yw()}${Qw[o]}`);if(!VC(c,a))return t.text("invalid upload path",400);qC(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);HC(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function GC(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function VC(t,e){let r=e.endsWith(Zw)?e:`${e}${Zw}`;return t.startsWith(r)}function KC(){return JC(ce())}function zC(t){return typeof File<"u"&&t instanceof File}function YC(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 XC,Qw,ty=E(()=>{"use strict";Ve();XC=10*1024*1024,Qw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Qi}from"node:fs";import{basename as ZC,dirname as QC,extname as eM,isAbsolute as tM,join as rM,relative as nM}from"node:path";import{fileURLToPath as sM}from"node:url";import{Hono as oM}from"hono";import{serveStatic as wt}from"@hono/node-server/serve-static";function ly(t){let e=new oM,r=[],n=t.localWebui!==void 0?Uu(t.localWebui.webuiDir):iM();if(t.localWebui!==void 0&&mw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=aM();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,wt({root:n})),e.use("/vendor/*",s,wt({root:n})),e.use("/src/*",s,wt({root:n})),e.get("/",s,wt({root:n,path:"index.html"})),e.get("/admin",s,wt({root:n,path:"index.html"})),e.get("/admin/*",s,wt({root:n,path:"index.html"})),e.get("/terminal",s,wt({root:n,path:"index.html"})),e.get("/terminal/*",s,wt({root:n,path:"index.html"})),e.get("/chat",s,wt({root:n,path:"index.html"})),e.get("/chat/*",s,wt({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("*",Zh()),e.get("/login",s=>s.html(je("Login",`
|
|
1584
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Ki=E(()=>{"use strict"});function Vw(t,e){t.all("/runtime/*",r=>xC(r.req.raw,e))}async function xC(t,e){try{return Response.json(await $C(t,e))}catch(r){if(r instanceof se)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 $C(t,e){let r=new URL(t.url),n=CC(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Ou(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return zi(t,n.id,s[2]),jC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){zi(t,n.id,s[2]);let o=Uw(e.dal,s[4]);return Fw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Ou(t),e.dal.listTeams().map(o=>LC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Ww(e.dal,Bw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return Hw(t,n.id,i.context),qw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Ww(e.dal,Bw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");Hw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return qw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){zi(t,n.id,s[2]);let o=Uw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return RC(e.dal,o,a),Fw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ps(t,n.id),e.dal.listWorkflows().map(o=>MC(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ps(t,n.id);let o=PC(e.dal,s[2]);return DC(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ps(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return FC(e.dal,o,i).map(l=>Xw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ps(t,n.id);let o=Jw(e.dal,s[2]);return Xw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ps(t,n.id);let o=Jw(e.dal,s[2]),i=WC(e.dal,o);return{runId:Pu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function jC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Kw(t,e,r))}}function Fw(t,e,r){let n=Kw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:NC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:AC(t,r)}}function Kw(t,e,r){let n=zw(t,r.id),s=Cu(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 NC(t,e){let r=zw(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:Cu(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 AC(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 RC(t,e,r){let n=OC(t,e.id);if(n!==null){let s=Vi(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=_t(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(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 zw(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 OC(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 Cu(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 Uw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function Ww(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function Bw(t){return t.startsWith("team:")?t.slice(5):t}function LC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function qw(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??Gw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function CC(t){let e=t.workspaceName??In()??fr.default;return{id:e,name:e}}function Ou(t){if(t.headers.get("x-lmctl-workspace-id")!==Gw)throw new se(400,"runtime request requires global-admin workspace identity")}function zi(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function ps(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function Hw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");zi(t,e,r.workspaceId);return}Ou(t)}function Mu(t){return`${gn}${Du(t.name)}`}function Du(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Pu(t){return`${Lu}${t.id}`}function MC(t){let e=Yi(t.definition);return{id:Mu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function DC(t){let e=Yi(t.definition);return{id:Mu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Yi(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 PC(t,e){if(!e.startsWith(gn))throw new se(404,`template not found: ${e}`);let r=e.slice(gn.length),n=t.listWorkflows().filter(s=>Du(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Jw(t,e){if(!e.startsWith(Lu))throw new se(404,`run not found: ${e}`);let r=e.slice(Lu.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function FC(t,e,r){if(r!==null){if(!r.startsWith(gn))return[];let s=r.slice(gn.length),o=t.listWorkflows().filter(a=>Du(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 Xw(t,e){let r=t.getWorkflow(e.workflow_id),n=Cu(e),s=UC(r,e);return{id:Pu(e),templateId:r===null?`${gn}unknown`:Mu(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 UC(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]:[Yi(t.definition).nameToId.get(r)??r]}function WC(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Yi(r.definition),s=c=>n.nameToId.get(c)??c,o=Pu(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=BC(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 BC(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 Gw,gn,Lu,se,Yw=E(()=>{"use strict";Ve();Ki();Nt();Gw="global-admin";gn="template:",Lu="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as qC,writeFileSync as HC}from"node:fs";import{randomUUID as Zw}from"node:crypto";import{dirname as JC,resolve as Zi,sep as Qw}from"node:path";async function ty(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(!zC(n))return t.text("missing image file",400);if(n.size>XC)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=YC(s);if(o===null||!(o in ey))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=GC(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Zi(KC()):Zi(i.local_path),l=Zi(a,"uploads",Zw()),c=Zi(l,`${Zw()}${ey[o]}`);if(!VC(c,a))return t.text("invalid upload path",400);qC(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);HC(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function GC(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function VC(t,e){let r=e.endsWith(Qw)?e:`${e}${Qw}`;return t.startsWith(r)}function KC(){return JC(ce())}function zC(t){return typeof File<"u"&&t instanceof File}function YC(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 XC,ey,ry=E(()=>{"use strict";Ve();XC=10*1024*1024,ey={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Qi}from"node:fs";import{basename as ZC,dirname as QC,extname as eM,isAbsolute as tM,join as rM,relative as nM}from"node:path";import{fileURLToPath as sM}from"node:url";import{Hono as oM}from"hono";import{serveStatic as wt}from"@hono/node-server/serve-static";function cy(t){let e=new oM,r=[],n=t.localWebui!==void 0?Uu(t.localWebui.webuiDir):iM();if(t.localWebui!==void 0&&pw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=aM();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,wt({root:n})),e.use("/vendor/*",s,wt({root:n})),e.use("/src/*",s,wt({root:n})),e.get("/",s,wt({root:n,path:"index.html"})),e.get("/admin",s,wt({root:n,path:"index.html"})),e.get("/admin/*",s,wt({root:n,path:"index.html"})),e.get("/terminal",s,wt({root:n,path:"index.html"})),e.get("/terminal/*",s,wt({root:n,path:"index.html"})),e.get("/chat",s,wt({root:n,path:"index.html"})),e.get("/chat/*",s,wt({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("*",Qh()),e.get("/login",s=>s.html(je("Login",`
|
|
1585
1585
|
<h1>Login</h1>
|
|
1586
1586
|
<form method="post" action="/login">
|
|
1587
1587
|
<label>Token <input name="token" type="password"></label>
|
|
1588
1588
|
<button type="submit">Login</button>
|
|
1589
1589
|
</form>
|
|
1590
|
-
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return e_(i)?(Vc(s,i),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(t_(s),s.redirect("/login",302))),Zg(e,{dal:t.dal}),Gw(e,{dal:t.dal}),hw(e,{dal:t.dal}),Iw(e,{terminalSessionManager:t.terminalSessionManager}),Rw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Bn(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 Kl(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 U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),l_(e,{dal:t.dal}),h_(e,{dal:t.dal}),e.get("/api/status",s=>U(s,vo(t.dal),pM)),e.get("/api/projects",s=>U(s,Io(t.dal),hM)),e.get("/api/teams",s=>U(s,gp(t.dal),wM)),e.get("/api/workflows",s=>U(s,xo(t.dal),yM)),e.get("/api/workflows/verify",s=>{let o=Mg();return s.req.header("accept")?.includes("text/plain")?s.text(Pg(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,wp(t.dal,{status:s.req.query("status")}),EM)),e.post("/api/uploads",s=>ey(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=$o(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),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 U(s,d,ae)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(ms(),Vg)),i=$o(t.dal,ee(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():U(s,o,ae)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),_M)}),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 wn(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{tr(u)}catch{return s.text("invalid condition",400)}let d=uM(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 U(s,m,ae)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ee(s,"id"))?U(s,{removed:!0},ae):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return o===null?s.notFound():U(s,o,ae)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return o===null?s.notFound():U(s,o,ae)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=ny(s.req.query("status"),dM);if(typeof i=="string")return s.text(i,400);let a=ny(s.req.query("severity"),uy);return typeof a=="string"?s.text(a,400):U(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")}:{}}),gM)}),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 wn(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=fM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=mM(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 U(s,d,ae)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/issues/:id/claim",async s=>{let o=ee(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await wn(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):U(s,c,ae)}),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 wn(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):U(s,l,ae)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(ee(s,"id"));if(o===null)return s.notFound();let i=await wn(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 U(s,t.dal.closeIssue(ee(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ae)}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(ee(s,"id"));if(o===null)return s.notFound();let i=await wn(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 U(s,t.dal.reopenIssue(ee(s,"id"),a),ae)}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 U(s,{...o,owner:a,repo:l},ae)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=ee(s,"run_id"),i=s.req.query("kind"),a=Sr(t.dal,o,i);return U(s,a,ae)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=ee(s,"run_id"),i=s.req.param("kind"),a=Sr(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):U(s,l,ae);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=lM(l.path);if(cM(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=ZC(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 U(s,l,ae)}return U(s,l,ae)}),e.get("/api/runs",s=>U(s,Xr(t.dal,{limit:Fu(s,"limit")??100}),bM)),e.get("/api/runs/:id",s=>{let o=br(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,SM)}),e.get("/api/runs/:id/where",s=>{let o=Gr(t.dal,ee(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(No(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Ao(t.dal,ee(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ro(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(ee(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ea(t.daemon),U(s,i,sy)):U(s,i,sy,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=ee(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?(ea(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=>ry(s,t.dal,o=>U(s,o,kM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Sp(t.dal,ee(s,"id"),ee(s,"step_id"));return o===null?s.notFound():cy(s)?s.html(`<pre>${b(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=>ry(s,t.dal,o=>{let i=Cw(o);return U(s,i,a=>de(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>U(s,Tp(t.dal,{type:s.req.query("type")}),vM)),e.get("/api/external-signals",s=>U(s,kp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),IM)),e.get("/api/attentions",s=>U(s,zt(t.dal,{unacked:s.req.query("unacked")==="true"}),xM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(ee(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${b(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=jo(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${de(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=_t(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/escalations/:id/respond",async s=>{let o=ee(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=_t(t.dal,o);if(c===null)return s.notFound();let u=zt(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);ea(t.daemon);let p=zt(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 ea(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=yp(t.dal,{status:i,pr_url:o});return U(s,a,$M)}),e.get("/api/submitted-prs/:id",s=>{let o=ee(s,"id"),i=Ep(t.dal,o);return i===null?s.notFound():U(s,i,jM)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),oy)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Bn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),oy)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Bn(s.req.param("team_name"));try{let i=await up(t.dal,o,s.req.param("alias"));return U(s,i,a=>iy("compacted",a.row))}catch(i){if(i instanceof Wn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Bn(s.req.param("team_name")),i=await Kl(t.dal,o,s.req.param("alias"));return U(s,i,a=>iy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,ay)),e.post("/api/intake/scan",async s=>(r=await ln(t.dal),U(s,r,ay))),e.get("/api/stats/run-throughput",s=>U(s,xp(t.dal),NM)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,AM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},ae);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},ae)}),e.get("/metrics/:project_id",s=>{let o=ee(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=rc(t.dal,o),l=nc(t.dal,{project_id:o});return s.html(je(`Metrics \u2014 ${i.name}`,RM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=ee(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Fu(s,"since_days");return s.json(rc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=ee(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Fu(s,"since_days");return s.json(nc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(ee(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function ry(t,e,r){let n=tc(e,ee(t,"id"),ee(t,"step_id"));return n===null?t.notFound():r(n)}function ea(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return cy(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 cy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function iM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Qi(`${t}/index.html`)?Uu(t):null;let e="src/serve/webui-dist";if(Qi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Qi(`${r}/index.html`))return r;let n=rM(QC(sM(import.meta.url)),"webui-dist");return Qi(`${n}/index.html`)?Uu(n):null}function Uu(t){if(!tM(t))return t;let e=nM(process.cwd(),t);return e.length===0?".":e}function aM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ee(t,e){return Number(t.req.param(e))}function Fu(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 lM(t){switch(eM(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 cM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function wn(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 uM(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 ny(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 fM(t){if(t!=null)return typeof t=="string"&&uy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function mM(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 pM(t){return`<h1>Status</h1><div class="grid">
|
|
1590
|
+
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return t_(i)?(Vc(s,i),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(r_(s),s.redirect("/login",302))),Qg(e,{dal:t.dal}),Vw(e,{dal:t.dal}),_w(e,{dal:t.dal}),xw(e,{terminalSessionManager:t.terminalSessionManager}),Ow(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Bn(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 Kl(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 U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),c_(e,{dal:t.dal}),__(e,{dal:t.dal}),e.get("/api/status",s=>U(s,vo(t.dal),pM)),e.get("/api/projects",s=>U(s,Io(t.dal),hM)),e.get("/api/teams",s=>U(s,wp(t.dal),wM)),e.get("/api/workflows",s=>U(s,xo(t.dal),yM)),e.get("/api/workflows/verify",s=>{let o=Dg();return s.req.header("accept")?.includes("text/plain")?s.text(Fg(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,yp(t.dal,{status:s.req.query("status")}),EM)),e.post("/api/uploads",s=>ty(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=$o(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),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 U(s,d,ae)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(ms(),Kg)),i=$o(t.dal,ee(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():U(s,o,ae)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),_M)}),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 wn(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{tr(u)}catch{return s.text("invalid condition",400)}let d=uM(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 U(s,m,ae)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ee(s,"id"))?U(s,{removed:!0},ae):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return o===null?s.notFound():U(s,o,ae)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return o===null?s.notFound():U(s,o,ae)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=sy(s.req.query("status"),dM);if(typeof i=="string")return s.text(i,400);let a=sy(s.req.query("severity"),dy);return typeof a=="string"?s.text(a,400):U(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")}:{}}),gM)}),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 wn(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=fM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=mM(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 U(s,d,ae)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/issues/:id/claim",async s=>{let o=ee(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await wn(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):U(s,c,ae)}),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 wn(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):U(s,l,ae)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(ee(s,"id"));if(o===null)return s.notFound();let i=await wn(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 U(s,t.dal.closeIssue(ee(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ae)}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(ee(s,"id"));if(o===null)return s.notFound();let i=await wn(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 U(s,t.dal.reopenIssue(ee(s,"id"),a),ae)}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 U(s,{...o,owner:a,repo:l},ae)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=ee(s,"run_id"),i=s.req.query("kind"),a=Sr(t.dal,o,i);return U(s,a,ae)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=ee(s,"run_id"),i=s.req.param("kind"),a=Sr(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):U(s,l,ae);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=lM(l.path);if(cM(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=ZC(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 U(s,l,ae)}return U(s,l,ae)}),e.get("/api/runs",s=>U(s,Xr(t.dal,{limit:Fu(s,"limit")??100}),bM)),e.get("/api/runs/:id",s=>{let o=br(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,SM)}),e.get("/api/runs/:id/where",s=>{let o=Gr(t.dal,ee(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(No(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Ao(t.dal,ee(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ro(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(ee(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ea(t.daemon),U(s,i,oy)):U(s,i,oy,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=ee(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?(ea(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=>ny(s,t.dal,o=>U(s,o,kM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Tp(t.dal,ee(s,"id"),ee(s,"step_id"));return o===null?s.notFound():uy(s)?s.html(`<pre>${b(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=>ny(s,t.dal,o=>{let i=Mw(o);return U(s,i,a=>de(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>U(s,kp(t.dal,{type:s.req.query("type")}),vM)),e.get("/api/external-signals",s=>U(s,vp(t.dal,{unhandled:s.req.query("unhandled")==="true"}),IM)),e.get("/api/attentions",s=>U(s,zt(t.dal,{unacked:s.req.query("unacked")==="true"}),xM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(ee(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${b(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=jo(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${de(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=_t(t.dal,ee(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/escalations/:id/respond",async s=>{let o=ee(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=_t(t.dal,o);if(c===null)return s.notFound();let u=zt(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);ea(t.daemon);let p=zt(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 ea(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=Ep(t.dal,{status:i,pr_url:o});return U(s,a,$M)}),e.get("/api/submitted-prs/:id",s=>{let o=ee(s,"id"),i=bp(t.dal,o);return i===null?s.notFound():U(s,i,jM)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),iy)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Bn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),iy)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Bn(s.req.param("team_name"));try{let i=await dp(t.dal,o,s.req.param("alias"));return U(s,i,a=>ay("compacted",a.row))}catch(i){if(i instanceof Wn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Bn(s.req.param("team_name")),i=await Kl(t.dal,o,s.req.param("alias"));return U(s,i,a=>ay(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,ly)),e.post("/api/intake/scan",async s=>(r=await ln(t.dal),U(s,r,ly))),e.get("/api/stats/run-throughput",s=>U(s,$p(t.dal),NM)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,AM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},ae);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},ae)}),e.get("/metrics/:project_id",s=>{let o=ee(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=rc(t.dal,o),l=nc(t.dal,{project_id:o});return s.html(je(`Metrics \u2014 ${i.name}`,RM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=ee(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Fu(s,"since_days");return s.json(rc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=ee(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Fu(s,"since_days");return s.json(nc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(ee(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function ny(t,e,r){let n=tc(e,ee(t,"id"),ee(t,"step_id"));return n===null?t.notFound():r(n)}function ea(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return uy(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 uy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function iM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Qi(`${t}/index.html`)?Uu(t):null;let e="src/serve/webui-dist";if(Qi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Qi(`${r}/index.html`))return r;let n=rM(QC(sM(import.meta.url)),"webui-dist");return Qi(`${n}/index.html`)?Uu(n):null}function Uu(t){if(!tM(t))return t;let e=nM(process.cwd(),t);return e.length===0?".":e}function aM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ee(t,e){return Number(t.req.param(e))}function Fu(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 lM(t){switch(eM(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 cM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function wn(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 uM(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 sy(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 fM(t){if(t!=null)return typeof t=="string"&&dy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function mM(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 pM(t){return`<h1>Status</h1><div class="grid">
|
|
1591
1591
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
1592
1592
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
1593
1593
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -1607,7 +1607,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1607
1607
|
</fieldset>
|
|
1608
1608
|
</form>
|
|
1609
1609
|
<div id="pause-result" style="margin-top:0.6em;"></div>
|
|
1610
|
-
</section>`}function kM(t){return`<section><h3>${b(t.state_name)}</h3>${ae(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
|
|
1610
|
+
</section>`}function kM(t){return`<section><h3>${b(t.state_name)}</h3>${ae(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 oy(t){return t.resumed?`<p>resumed run ${b(t.run.id)}</p>`:`<p>resume failed: ${b(t.reason)}</p>`}function vM(t){return`<h1>External Objects</h1>${de(["id","type","provider","external_id","status","url"],t.map(e=>[b(e.id),b(e.type),b(e.provider),b(e.external_id),b(e.status),b(e.url)]))}`}function IM(t){return`<h1>External Signals</h1>${de(["id","object","kind","handled"],t.map(e=>[b(e.id),b(e.object_id),b(e.kind),b(e.handled_at)]))}`}function xM(t){let e=`<style>
|
|
1611
1611
|
@keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
|
|
1612
1612
|
tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
|
|
1613
1613
|
tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
|
|
@@ -1621,7 +1621,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1621
1621
|
<dt>submitted_at</dt><dd>${b(t.submitted_at)}</dd>
|
|
1622
1622
|
<dt>last_scanned_at</dt><dd>${b(t.last_scanned_at??"\u2014")}</dd>
|
|
1623
1623
|
<dt>last_known_state</dt><dd>${b(t.last_known_state??"\u2014")}</dd>
|
|
1624
|
-
</dl>`}function
|
|
1624
|
+
</dl>`}function iy(t){return`<h1>Sessions</h1>${de(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Eo(e.team_name),n=encodeURIComponent(e.alias);return[b(e.team_name),b(e.alias),b(e.sessionid),b(e.input_tokens),b(e.cache_tokens),b(e.output_tokens),b(e.total_tokens),b(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 ay(t,e){return e===null?`<span>${b(t)}</span>`:`<span>${b(t)} ${b(e.team_name)}/${b(e.alias)}</span>`}function NM(t){return`<h1>Run Throughput</h1>${de(["workflow","terminal","count"],t.map(e=>[b(e.workflow_name),b(e.terminal_state),b(e.count)]))}`}function ly(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${de(["project","scanned","new jobs","error"],t.map(e=>[b(e.project_name),b(e.scanned),b(e.new_jobs),b(e.error)]))}`}function AM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ae(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function RM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),i=e.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(t)}</h1>
|
|
1625
1625
|
<h2>Request-changes rate</h2>
|
|
1626
1626
|
<p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
|
|
1627
1627
|
${de(["state","total steps","request_changes","rate"],s)}
|
|
@@ -1630,42 +1630,42 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1630
1630
|
<h2>Retry counts (runs with >1 attempt per state)</h2>
|
|
1631
1631
|
${de(["state","retried runs","avg attempts"],i)}
|
|
1632
1632
|
<h2>Tool efficacy</h2>
|
|
1633
|
-
${de(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var dM,
|
|
1633
|
+
${de(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var dM,dy,fy=E(()=>{"use strict";hi();rn();s_();u_();g_();Nt();eu();aw();hw();bw();$w();Lw();Dw();Yw();bo();ry();Ri();dM=["open","assigned","closed","reopened"],dy=["low","medium","high","critical"]});function OM(t){return Math.floor(t/6e4)*6e4}function LM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)CM(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function CM(t,e){let r=Date.now(),n=OM(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 my(t,e=250){let r=setInterval(()=>{try{LM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var py=E(()=>{"use strict"});function DM({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
|
|
1634
1634
|
FROM run r
|
|
1635
1635
|
JOIN job j ON j.id = r.job_id
|
|
1636
1636
|
WHERE j.project_id = ?
|
|
1637
1637
|
AND r.terminal_state IS NOT NULL
|
|
1638
1638
|
ORDER BY r.id DESC
|
|
1639
|
-
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,MM).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,py)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:py,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 hy(t){for(let e of PM)try{e(t)}catch{}}var MM,py,PM,_y=E(()=>{"use strict";MM="request_changes",py="reviewer_rejection_rate_high";PM=[DM]});function hs(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function gy(t){let e=t.intervalMs??hs(),r=t.runOnceFn??$r,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??fy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=wy(t.dal,t.monitorSessionActivityFn??zl,e,n).finally(()=>{a=null})),a.finally(()=>u(Yl(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=FM(t.dal,r,t.collectSessionSizesFn??cp,t.scanIntakeFn??ln,t.monitorSessionActivityFn??zl,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 FM(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(Bg({dal:t}),hy({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 wy(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 wy(t,e,r,n){let s=Yl(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 Wu=E(()=>{"use strict";hi();ms();gu();bo();my();_y();Zl()});function yy(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Ey=E(()=>{"use strict"});import{mkdirSync as UM,readFileSync as WM,readdirSync as BM,statSync as qM,writeFileSync as HM}from"node:fs";import{dirname as JM,join as Sy,sep as by}from"node:path";function ta(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Ty:return XM(t,s.input);case ky:return GM(t,s.input);case vy:return VM(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Hu,GetObjectCommand:qu,PutObjectCommand:Bu}}}function XM(t,e){let r=Iy(t,e.Key);return UM(JM(r),{recursive:!0}),HM(r,e.Body),{}}function GM(t,e){let r=Iy(t,e.Key),n;try{n=WM(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 VM(t,e){let r=e.Prefix??"";xy(r);let s=KM(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 Iy(t,e){return xy(e),Sy(t,e)}function xy(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function KM(t){let e=[],r=(n,s)=>{let o;try{o=BM(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=Sy(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=by==="/"?a:a.split(by).join("/");e.push({key:c,lastModified:qM(l).mtime})}}};return r(t,""),e}var Ty,ky,vy,Bu,qu,Hu,Ju=E(()=>{"use strict";Ty="localfs-put",ky="localfs-get",vy="localfs-list",Bu=class{input;_localfsTag=Ty;constructor(e){this.input=e}},qu=class{input;_localfsTag=ky;constructor(e){this.input=e}},Hu=class{input;_localfsTag=vy;constructor(e){this.input=e}}});function $y(){return{put:0,get:0,list:0}}function Xu(t,e=zM){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Gu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var zM,ra,Vu=E(()=>{"use strict";zM={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ra=class{counts=$y();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=$y(),e}estimateCostUsd(e){return Xu(this.counts,e)}}});function jy(t){let e=t.now??Date.now,r=t.timers??YM,n=null,s=null;async function o(){let l=e(),c=Gu(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=Xu(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===Gu(e())}}}var YM,Ny=E(()=>{"use strict";Vu();YM={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Ku=E(()=>{"use strict";Fi();Wi();Wi()});function ZM(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 QM(t){return t.reply_to!==void 0&&t.response!==void 0}function eD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Ay(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 na,_s,Ry=E(()=>{"use strict";Ku();na=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},_s=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new na("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=Mt(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(Ay(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Ay(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 na;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=ZM(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(QM(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??eD(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:Mt(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 zu(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 Oy=E(()=>{"use strict"});function Yu(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 Ly=E(()=>{"use strict"});function Qu(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 Zu,Cy=E(()=>{"use strict";Zu="daemon:events"});function Dy(t){return{kind:"prompt",prompt_id:t.prompt_id??Mt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ed(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 My,td=E(()=>{"use strict";Ku();My="prompt:root"});function gs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Fy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function tD(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Fy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Py(t,e=60){if(typeof t!="string"||t==="")return!0;let r=tD(t);return r===null?!0:Date.now()/1e3>=r-e}function Fy(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 rd=E(()=>{"use strict"});async function sa(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":rD},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 rD,nd=E(()=>{"use strict";rD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Uy,mkdirSync as Wy,readFileSync as By,writeFileSync as qy}from"node:fs";import{homedir as Hy}from"node:os";import{dirname as Jy,join as Xy}from"node:path";function ws(){return process.env.LMCTL_DEVICE_AUTH_PATH??Xy(Hy(),".lmctl","device-auth.json")}function Gy(){return process.env.LMCTL_TOKEN_PATH??Xy(Hy(),".lmctl","cli-tokens.json")}function sd(t=ws()){try{let e=JSON.parse(By(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 Vy(t,e=ws()){Wy(Jy(e),{recursive:!0,mode:448}),qy(e,JSON.stringify(t,null,2));try{Uy(e,384)}catch{}}function od(t,e=Gy()){let r={};try{r=JSON.parse(By(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};Wy(Jy(e),{recursive:!0,mode:448}),qy(e,JSON.stringify(s,null,2));try{Uy(e,384)}catch{}}async function Ky(t){let e=t.deviceAuthPath??ws(),r=sd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await sa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return od({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Gy()),{idToken:n.idToken,userId:r.userId}}var id=E(()=>{"use strict";nd()});function zy(t){if(t.length===0||!t.startsWith("---"))throw new yt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1640
|
-
`);if(e[0]!=="---")throw new yt("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 yt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!nD.has(c))throw new yt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${oa.join(", ")}`);r[c]=u}if(n===-1)throw new yt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of oa)if(r[i]===void 0)throw new yt(`missing required frontmatter key "${i}" \u2014 required: ${oa.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 oa,nD,yt,
|
|
1641
|
-
`);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=
|
|
1642
|
-
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(cD(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(uD(d)){s.push(f);continue}if(dD(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(!lD(d))continue;let m=aD(d);for(let g of Object.keys(m))if(!
|
|
1643
|
-
allowed keys: ${Zy.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 dd(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()===ld.toLowerCase());n.length>1&&r.push({field:ld,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?yn(e,o.teamfile):yn(o.teamfile);if(!Qy(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=Et(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 iD.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 Et(t){return t.members.find(e=>e.alias.toLowerCase()===ld.toLowerCase())}function fd(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=yn(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),!Qy(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=Et(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return fd(l,ad(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||ad(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function ia(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var ld,iD,Zy,Dt=E(()=>{"use strict";Yy();ld="Lead",iD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);Zy=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as fD,realpathSync as mD}from"node:fs";import{dirname as pD}from"node:path";function md(t){hD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function hD(t){let e=t.payload.root_teamfile;try{e=mD(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 En(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 En(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=_D(e);if("error"in r)return await En(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()-yD(t.env??process.env)).toISOString()});if(!s.acquired){let o=wD(r.alias,s.current);return await En(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??yr)({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 En(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 En(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 _D(t){if(!fD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Et(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??pD(t)}}async function En(t,e){let r=rE(e.message),n=e.response===null?null:rE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function rE(t){return t.length<=eE?{text:t,truncated:!1}:{text:t.slice(0,eE),truncated:!0}}function gD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function wD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:gD(t,e)}function yD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return tE;let r=Number(e);return!Number.isFinite(r)||r<=0?tE:r}var eE,tE,nE=E(()=>{"use strict";jt();Dt();eE=256*1024,tE=30*60*1e3});import{chmodSync as cE,existsSync as ED,mkdirSync as uE,readFileSync as ua,writeFileSync as dE}from"node:fs";import{dirname as pd,resolve as aa,join as fE}from"node:path";import{fileURLToPath as bD}from"node:url";import{homedir as mE}from"node:os";import{CognitoIdentityClient as SD,GetIdCommand as TD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as sE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as kD,ListObjectsV2Command as vD,PutObjectCommand as ID,S3Client as oE}from"@aws-sdk/client-s3";function Es(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:AD(t.selfUrl),n={},s;for(let x of r)if(ED(x)){n=ND(x),s=x;break}let o=(...x)=>{for(let k of x)if(typeof k=="string"&&k!=="")return k},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)??$D,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??jD,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)??da,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=ca(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ca(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ca(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ca(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),S=o(e.LMCTL_MAILBOX_KEY),v=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}:{},...S!==void 0?{mailboxKey:S}:{},...v!==void 0?{tokenPath:v}:{}},f}function ND(t){try{let e=ua(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 AD(t){let e=pd(bD(t??import.meta.url));return[aa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),aa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),aa(e,"..","..","..","infra","terraform","terraform.tfstate"),aa(e,"..","..","infra","terraform","terraform.tfstate")]}function ca(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function RD(t){let e=OD(t.intervalMs)??pE,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 OD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function hE(t){let e=t.tokenPath??fE(mE(),".lmctl","cli-tokens.json"),r=aE(t.tokenPath);if(Py(r.cognito?.idToken)&&sd()!==null)try{await Ky({region:t.region,clientId:t.cognitoClientId??da,cliTokensPath:e}),r=aE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let H=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}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 lE({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=sE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new oE({region:t.region,credentials:a}),c={ListObjectsV2Command:vD,GetObjectCommand:kD,PutObjectCommand:ID},u=gs(n),d=u??o,f=t.deviceId,m=pn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let I=Di(m,"web"),$=0,O;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of B.Contents??[]){let L=Pi(F.Key??"",m,"web");L!==void 0&&L>$&&($=L)}O=B.IsTruncated===!0?B.NextContinuationToken:void 0}while(O!==void 0);h=$,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${$} for user_id=${d}`),H=!0}catch(I){let $=I instanceof Error?I.message:String(I);if(i&&me===1&&MD(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${$}); clearing + refreshing`),CD(e),i=!1,o=await lE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=sE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new oE({region:t.region,credentials:a}),m=pn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${$}`);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,S=t.promptTriggerStore,v=new ra,x=new jr({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:j=>v.record(j),onMessage:async j=>{if(_!==void 0&&zu(j.payload)){_.onInbound(j.payload);return}if(T!==void 0&&Yu(j.payload)){await T.onInbound(j.payload);return}if(!Qu(j.payload)){if(S!==void 0&&ed(j.payload)){md({store:S,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new _s({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>x.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),T!==void 0&&T.setPublish(async j=>x.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let k=j=>x.putMessage({conversation_id:Zu,payload:j});x.start();let R=t.chatLogTailStore===void 0?void 0:RD({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??pE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let C=t.deviceId??o,q=`${d}/usage/`,te;return te=t.usageStore===void 0?void 0:jy({meter:v,store:t.usageStore,userId:d,deviceId:C,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${j} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),x.stop().catch(()=>{}),te?.stop()},publishOwnRollup:async(j,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${C}-${j}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let H={put:0,get:0,list:0},me;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let $ of I.Contents??[]){let O=$.Key??"";if(O.endsWith(`-${j}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),te!==void 0&&(await te.flushNow().catch(()=>{}),te.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function _E(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ta(t.rootDir),r=pn({identityId:ys,userId:ys,deviceId:iE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new jr({bucket:"local",identityId:ys,userId:ys,deviceId:iE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&zu(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Yu(c.payload)){await o.onInbound(c.payload);return}if(!Qu(c.payload)){if(i!==void 0&&ed(c.payload)){md({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??la,readIntervalMs:t.readIntervalMs??la,heartbeatIdleMs:t.heartbeatIdleMs??la,backoffReadIntervalMs:t.backoffReadIntervalMs??la});n=new _s({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Zu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ys,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function aE(t){let e=t??fE(mE(),".lmctl","cli-tokens.json");try{let r=ua(e,"utf8");return JSON.parse(r)}catch{return{}}}function LD(t,e){if(e===void 0||e==="")return;let r={};try{let s=ua(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};uE(pd(t),{recursive:!0,mode:448}),dE(t,JSON.stringify(n,null,2));try{cE(t,384)}catch{}}function CD(t){let e={};try{let n=ua(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,uE(pd(t),{recursive:!0,mode:448}),dE(t,JSON.stringify(r,null,2));try{cE(t,384)}catch{}}async function lE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new SD({region:t.region}).send(new TD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{LD(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 MD(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 pE,la,da,xD,$D,jD,ys,iE,hd=E(()=>{"use strict";Bi();Ju();Vu();Ny();Ry();Oy();Ly();Cy();td();Fi();rd();id();nE();pE=3e3,la=1e3,da="79u5jhkk46qofog661c9i0bdcs",xD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",$D="us-east-1_4iUdFggDn",jD="lmctl-next-preview-mailbox-254332045686";ys="local",iE="local"});import{spawn as yd}from"node:child_process";import{createInterface as gE}from"node:readline";var _d,gd,wd,wE,yE=E(()=>{"use strict";ul();Oe();_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=yd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=gE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
|
|
1639
|
+
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,MM).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,hy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:hy,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function _y(t){for(let e of PM)try{e(t)}catch{}}var MM,hy,PM,gy=E(()=>{"use strict";MM="request_changes",hy="reviewer_rejection_rate_high";PM=[DM]});function hs(){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 wy(t){let e=t.intervalMs??hs(),r=t.runOnceFn??$r,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??my)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=yy(t.dal,t.monitorSessionActivityFn??zl,e,n).finally(()=>{a=null})),a.finally(()=>u(Yl(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=FM(t.dal,r,t.collectSessionSizesFn??up,t.scanIntakeFn??ln,t.monitorSessionActivityFn??zl,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 FM(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(qg({dal:t}),_y({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 yy(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 yy(t,e,r,n){let s=Yl(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 Wu=E(()=>{"use strict";hi();ms();gu();bo();py();gy();Zl()});function Ey(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 by=E(()=>{"use strict"});import{mkdirSync as UM,readFileSync as WM,readdirSync as BM,statSync as qM,writeFileSync as HM}from"node:fs";import{dirname as JM,join as Ty,sep as Sy}from"node:path";function ta(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case ky:return XM(t,s.input);case vy:return GM(t,s.input);case Iy:return VM(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Hu,GetObjectCommand:qu,PutObjectCommand:Bu}}}function XM(t,e){let r=xy(t,e.Key);return UM(JM(r),{recursive:!0}),HM(r,e.Body),{}}function GM(t,e){let r=xy(t,e.Key),n;try{n=WM(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 VM(t,e){let r=e.Prefix??"";$y(r);let s=KM(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 xy(t,e){return $y(e),Ty(t,e)}function $y(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function KM(t){let e=[],r=(n,s)=>{let o;try{o=BM(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=Ty(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Sy==="/"?a:a.split(Sy).join("/");e.push({key:c,lastModified:qM(l).mtime})}}};return r(t,""),e}var ky,vy,Iy,Bu,qu,Hu,Ju=E(()=>{"use strict";ky="localfs-put",vy="localfs-get",Iy="localfs-list",Bu=class{input;_localfsTag=ky;constructor(e){this.input=e}},qu=class{input;_localfsTag=vy;constructor(e){this.input=e}},Hu=class{input;_localfsTag=Iy;constructor(e){this.input=e}}});function jy(){return{put:0,get:0,list:0}}function Xu(t,e=zM){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Gu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var zM,ra,Vu=E(()=>{"use strict";zM={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ra=class{counts=jy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=jy(),e}estimateCostUsd(e){return Xu(this.counts,e)}}});function Ny(t){let e=t.now??Date.now,r=t.timers??YM,n=null,s=null;async function o(){let l=e(),c=Gu(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=Xu(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===Gu(e())}}}var YM,Ay=E(()=>{"use strict";Vu();YM={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Ku=E(()=>{"use strict";Fi();Wi();Wi()});function ZM(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 QM(t){return t.reply_to!==void 0&&t.response!==void 0}function eD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Ry(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 na,_s,Oy=E(()=>{"use strict";Ku();na=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},_s=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new na("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=Mt(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(Ry(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Ry(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 na;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=ZM(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(QM(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??eD(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:Mt(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 zu(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 Ly=E(()=>{"use strict"});function Yu(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 Cy=E(()=>{"use strict"});function Qu(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 Zu,My=E(()=>{"use strict";Zu="daemon:events"});function Py(t){return{kind:"prompt",prompt_id:t.prompt_id??Mt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ed(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 Dy,td=E(()=>{"use strict";Ku();Dy="prompt:root"});function gs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Uy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function tD(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Uy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Fy(t,e=60){if(typeof t!="string"||t==="")return!0;let r=tD(t);return r===null?!0:Date.now()/1e3>=r-e}function Uy(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 rd=E(()=>{"use strict"});async function sa(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":rD},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 rD,nd=E(()=>{"use strict";rD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Wy,mkdirSync as By,readFileSync as qy,writeFileSync as Hy}from"node:fs";import{homedir as Jy}from"node:os";import{dirname as Xy,join as Gy}from"node:path";function ws(){return process.env.LMCTL_DEVICE_AUTH_PATH??Gy(Jy(),".lmctl","device-auth.json")}function Vy(){return process.env.LMCTL_TOKEN_PATH??Gy(Jy(),".lmctl","cli-tokens.json")}function sd(t=ws()){try{let e=JSON.parse(qy(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 Ky(t,e=ws()){By(Xy(e),{recursive:!0,mode:448}),Hy(e,JSON.stringify(t,null,2));try{Wy(e,384)}catch{}}function od(t,e=Vy()){let r={};try{r=JSON.parse(qy(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};By(Xy(e),{recursive:!0,mode:448}),Hy(e,JSON.stringify(s,null,2));try{Wy(e,384)}catch{}}async function zy(t){let e=t.deviceAuthPath??ws(),r=sd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await sa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return od({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Vy()),{idToken:n.idToken,userId:r.userId}}var id=E(()=>{"use strict";nd()});function Yy(t){if(t.length===0||!t.startsWith("---"))throw new yt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1640
|
+
`);if(e[0]!=="---")throw new yt("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 yt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!nD.has(c))throw new yt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${oa.join(", ")}`);r[c]=u}if(n===-1)throw new yt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of oa)if(r[i]===void 0)throw new yt(`missing required frontmatter key "${i}" \u2014 required: ${oa.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 oa,nD,yt,Zy=E(()=>{"use strict";oa=["title","description","members"],nD=new Set(oa),yt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as sD,writeFileSync as EK,renameSync as bK,existsSync as eE}from"node:fs";import{basename as oD,resolve as yn,dirname as ad}from"node:path";function aD(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 lD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function cD(t){return/^\s*_SESSION_\s+\S/.test(t)}function uD(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function dD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function cd(t){let e=oD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=sD(t,"utf-8"),r=ad(yn(t)),n=ud(e,cd(t),{baseDir:r,sourcePath:yn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=yn(r,s.sessiondir));return n}function ud(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
|
|
1641
|
+
`);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=Yy(a)}catch(u){if(u instanceof yt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
|
|
1642
|
+
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(cD(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(uD(d)){s.push(f);continue}if(dD(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(!lD(d))continue;let m=aD(d);for(let g of Object.keys(m))if(!Qy.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
|
|
1643
|
+
allowed keys: ${Qy.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 dd(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()===ld.toLowerCase());n.length>1&&r.push({field:ld,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?yn(e,o.teamfile):yn(o.teamfile);if(!eE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=Et(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 iD.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 Et(t){return t.members.find(e=>e.alias.toLowerCase()===ld.toLowerCase())}function fd(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=yn(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),!eE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=Et(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return fd(l,ad(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||ad(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function ia(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var ld,iD,Qy,Dt=E(()=>{"use strict";Zy();ld="Lead",iD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);Qy=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as fD,realpathSync as mD}from"node:fs";import{dirname as pD}from"node:path";function md(t){hD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function hD(t){let e=t.payload.root_teamfile;try{e=mD(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 En(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 En(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=_D(e);if("error"in r)return await En(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()-yD(t.env??process.env)).toISOString()});if(!s.acquired){let o=wD(r.alias,s.current);return await En(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??yr)({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 En(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 En(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 _D(t){if(!fD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Et(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??pD(t)}}async function En(t,e){let r=nE(e.message),n=e.response===null?null:nE(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 nE(t){return t.length<=tE?{text:t,truncated:!1}:{text:t.slice(0,tE),truncated:!0}}function gD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function wD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:gD(t,e)}function yD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return rE;let r=Number(e);return!Number.isFinite(r)||r<=0?rE:r}var tE,rE,sE=E(()=>{"use strict";jt();Dt();tE=256*1024,rE=30*60*1e3});import{chmodSync as uE,existsSync as ED,mkdirSync as dE,readFileSync as ua,writeFileSync as fE}from"node:fs";import{dirname as pd,resolve as aa,join as mE}from"node:path";import{fileURLToPath as bD}from"node:url";import{homedir as pE}from"node:os";import{CognitoIdentityClient as SD,GetIdCommand as TD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as oE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as kD,ListObjectsV2Command as vD,PutObjectCommand as ID,S3Client as iE}from"@aws-sdk/client-s3";function Es(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:AD(t.selfUrl),n={},s;for(let x of r)if(ED(x)){n=ND(x),s=x;break}let o=(...x)=>{for(let k of x)if(typeof k=="string"&&k!=="")return k},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)??$D,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??jD,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)??da,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=ca(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ca(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ca(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ca(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),S=o(e.LMCTL_MAILBOX_KEY),v=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}:{},...S!==void 0?{mailboxKey:S}:{},...v!==void 0?{tokenPath:v}:{}},f}function ND(t){try{let e=ua(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 AD(t){let e=pd(bD(t??import.meta.url));return[aa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),aa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),aa(e,"..","..","..","infra","terraform","terraform.tfstate"),aa(e,"..","..","infra","terraform","terraform.tfstate")]}function ca(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function RD(t){let e=OD(t.intervalMs)??hE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function OD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function _E(t){let e=t.tokenPath??mE(pE(),".lmctl","cli-tokens.json"),r=lE(t.tokenPath);if(Fy(r.cognito?.idToken)&&sd()!==null)try{await zy({region:t.region,clientId:t.cognitoClientId??da,cliTokensPath:e}),r=lE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let H=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}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 cE({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=oE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new iE({region:t.region,credentials:a}),c={ListObjectsV2Command:vD,GetObjectCommand:kD,PutObjectCommand:ID},u=gs(n),d=u??o,f=t.deviceId,m=pn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let I=Di(m,"web"),$=0,O;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of B.Contents??[]){let L=Pi(F.Key??"",m,"web");L!==void 0&&L>$&&($=L)}O=B.IsTruncated===!0?B.NextContinuationToken:void 0}while(O!==void 0);h=$,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${$} for user_id=${d}`),H=!0}catch(I){let $=I instanceof Error?I.message:String(I);if(i&&me===1&&MD(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${$}); clearing + refreshing`),CD(e),i=!1,o=await cE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=oE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new iE({region:t.region,credentials:a}),m=pn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${$}`);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,S=t.promptTriggerStore,v=new ra,x=new jr({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:j=>v.record(j),onMessage:async j=>{if(_!==void 0&&zu(j.payload)){_.onInbound(j.payload);return}if(T!==void 0&&Yu(j.payload)){await T.onInbound(j.payload);return}if(!Qu(j.payload)){if(S!==void 0&&ed(j.payload)){md({store:S,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new _s({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>x.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),T!==void 0&&T.setPublish(async j=>x.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let k=j=>x.putMessage({conversation_id:Zu,payload:j});x.start();let R=t.chatLogTailStore===void 0?void 0:RD({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??hE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let C=t.deviceId??o,q=`${d}/usage/`,te;return te=t.usageStore===void 0?void 0:Ny({meter:v,store:t.usageStore,userId:d,deviceId:C,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${j} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),x.stop().catch(()=>{}),te?.stop()},publishOwnRollup:async(j,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${C}-${j}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let H={put:0,get:0,list:0},me;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let $ of I.Contents??[]){let O=$.Key??"";if(O.endsWith(`-${j}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),te!==void 0&&(await te.flushNow().catch(()=>{}),te.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function gE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ta(t.rootDir),r=pn({identityId:ys,userId:ys,deviceId:aE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new jr({bucket:"local",identityId:ys,userId:ys,deviceId:aE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&zu(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Yu(c.payload)){await o.onInbound(c.payload);return}if(!Qu(c.payload)){if(i!==void 0&&ed(c.payload)){md({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??la,readIntervalMs:t.readIntervalMs??la,heartbeatIdleMs:t.heartbeatIdleMs??la,backoffReadIntervalMs:t.backoffReadIntervalMs??la});n=new _s({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Zu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ys,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function lE(t){let e=t??mE(pE(),".lmctl","cli-tokens.json");try{let r=ua(e,"utf8");return JSON.parse(r)}catch{return{}}}function LD(t,e){if(e===void 0||e==="")return;let r={};try{let s=ua(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};dE(pd(t),{recursive:!0,mode:448}),fE(t,JSON.stringify(n,null,2));try{uE(t,384)}catch{}}function CD(t){let e={};try{let n=ua(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,dE(pd(t),{recursive:!0,mode:448}),fE(t,JSON.stringify(r,null,2));try{uE(t,384)}catch{}}async function cE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new SD({region:t.region}).send(new TD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{LD(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 MD(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var hE,la,da,xD,$D,jD,ys,aE,hd=E(()=>{"use strict";Bi();Ju();Vu();Ay();Oy();Ly();Cy();My();td();Fi();rd();id();sE();hE=3e3,la=1e3,da="79u5jhkk46qofog661c9i0bdcs",xD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",$D="us-east-1_4iUdFggDn",jD="lmctl-next-preview-mailbox-254332045686";ys="local",aE="local"});import{spawn as yd}from"node:child_process";import{createInterface as wE}from"node:readline";var _d,gd,wd,yE,EE=E(()=>{"use strict";ul();Oe();_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=yd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=wE({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+`
|
|
1644
1644
|
`)}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+`
|
|
1645
1645
|
`)}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}}}},gd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=yd(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(`
|
|
1646
1646
|
`);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+`
|
|
1647
|
-
`)}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}})}},wd=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{to(n)}catch(a){z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=yd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=
|
|
1647
|
+
`)}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}})}},wd=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{to(n)}catch(a){z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=yd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=wE({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+`
|
|
1648
1648
|
`)}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+`
|
|
1649
1649
|
`)}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+`
|
|
1650
|
-
`)}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}})}}},
|
|
1651
|
-
`,{encoding:"utf8",mode:384}),r}var bd=E(()=>{"use strict"});import*as
|
|
1652
|
-
`),2;try{
|
|
1653
|
-
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),
|
|
1654
|
-
`)}let a=r.noDaemon?void 0:
|
|
1650
|
+
`)}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}})}}},yE=t=>{switch(t){case"codex":return new _d;case"claude":case"qwen":return new gd;case"gemini":case"copilot":case"opencode":return new wd;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as DD}from"node:crypto";import{existsSync as s8,mkdirSync as PD,readFileSync as FD,writeFileSync as UD}from"node:fs";import{homedir as WD}from"node:os";import{dirname as BD,join as qD}from"node:path";function fa(){return process.env.LMCTL_DEVICE_FILE??qD(WD(),".lmctl","device.json")}function Nr(t=fa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(FD(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 Ed(t=fa()){let e=Nr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:DD(),created_at:new Date().toISOString()};return PD(BD(t),{recursive:!0}),UD(t,`${JSON.stringify(r,null,2)}
|
|
1651
|
+
`,{encoding:"utf8",mode:384}),r}var bd=E(()=>{"use strict"});import*as bE from"node:child_process";function JD(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 Sd(t,e={}){let r=e.spawnSync===void 0&&process.env[XD]==="1",n=e.spawnSync??bE.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=ma[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=JD(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 SE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(ma).join(", ")})`;let e=HD[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 ma,HD,XD,TE=E(()=>{"use strict";ma={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},HD={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"};XD="LMCTL_SKIP_BINARY_CHECK"});var OE={};le(OE,{ProviderBinaryPreflightError:()=>pa,__setProviderBinaryCheckForTest:()=>tP,bootstrapAgentRestMailbox:()=>IE,publishRegisteredWorkflowsOnStart:()=>vE,resolveLocalMailboxDir:()=>AE,resolveLocalWebuiDir:()=>NE,resolveServeConfig:()=>xE,runProviderBinaryPreflight:()=>jE,runServe:()=>YD,validateServeArgs:()=>RE});import{randomBytes as GD}from"node:crypto";import{existsSync as VD}from"node:fs";import{homedir as KD}from"node:os";import{isAbsolute as kE,resolve as Td}from"node:path";async function YD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(zD),0;let r=RE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1652
|
+
`),2;try{jE(e)}catch(S){return 1}let n=pe({path:ce()}),s={portCli:rP(t)},o;try{o=xE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(S){return n.close(),e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
|
|
1653
|
+
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Ey(n);let i;if(r.localWebui!==void 0){let S=NE(r.localWebui.dir,process.env);if(S===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 v=AE(process.env),{s3:x,commands:k}=ta(v);i={webuiDir:S,rootDir:v,s3:x,commands:k},e.stdout.write(`local webui: serving SPA from ${S}; mailbox store ${v}
|
|
1654
|
+
`)}let a=r.noDaemon?void 0:wy({dal:n,intervalMs:hs()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Es({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)`)+`
|
|
1655
1655
|
`);let c=await eP({log:S=>e.stderr.write(`${S}
|
|
1656
|
-
`)}),u=new Gi({adapterFactory:
|
|
1657
|
-
`)}),d=Nr()?.device_id,f=
|
|
1658
|
-
`),await new Promise(S=>{let v=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),S()))()};process.once("SIGTERM",v),process.once("SIGINT",v)}),0}function ZD(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
|
|
1659
|
-
`)}}async function
|
|
1660
|
-
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await
|
|
1661
|
-
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(
|
|
1656
|
+
`)}),u=new Gi({adapterFactory:yE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:S=>e.stderr.write(`${S}
|
|
1657
|
+
`)}),d=Nr()?.device_id,f=cy({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:ZD(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 IE({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 vE({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}
|
|
1658
|
+
`),await new Promise(S=>{let v=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),S()))()};process.once("SIGTERM",v),process.once("SIGINT",v)}),0}function ZD(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 vE(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)}
|
|
1659
|
+
`)}}async function IE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await gE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1660
|
+
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await _E({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1661
|
+
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(Yh({app:t.app,log:r=>t.io?.stderr.write(`${r}
|
|
1662
1662
|
`)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
|
|
1663
1663
|
`)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
|
|
1664
|
-
`)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function
|
|
1665
|
-
`);return{port:a,apiUrl:d,apiToken:c}}function QD(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 eP(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 Xi({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 tP(t){
|
|
1664
|
+
`)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function xE(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=GD(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: ${QD(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
|
|
1665
|
+
`);return{port:a,apiUrl:d,apiToken:c}}function QD(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 eP(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 Xi({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 tP(t){$E=t??Sd}function jE(t){let e=Object.keys(ma),r=$E(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${SE(o)}
|
|
1666
1666
|
`);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
|
|
1667
1667
|
`),new pa(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
|
|
1668
|
-
`)}function
|
|
1668
|
+
`)}function NE(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=kE(r)?r:Td(process.cwd(),r);return VD(`${n}/index.html`)?n:null}function AE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?kE(e)?e:Td(process.cwd(),e):Td(KD(),".lmctl","local-mailbox")}function rP(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 RE(t,e=process.env){let r=nP(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 nP(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 zD,pa,$E,LE=E(()=>{"use strict";Pe();fy();Wu();by();Xc();hd();Ju();Au();Ru();EE();bd();TE();Ve();zD=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
|
|
1669
1669
|
|
|
1670
1670
|
Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
|
|
1671
1671
|
services. Help exits before any port binding or daemon startup.
|
|
@@ -1675,20 +1675,20 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1675
1675
|
against the local filesystem (no S3, no Cognito) with a fixed
|
|
1676
1676
|
local identity. Mailbox store defaults to
|
|
1677
1677
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
1678
|
-
`;pa=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}}
|
|
1679
|
-
`),1)}async function iP(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=N(r,"--project");return X(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await Hc({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await ln(s)),0})}async function aP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(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 w(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 X(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var sP,
|
|
1678
|
+
`;pa=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}},$E=Sd});var CE={};le(CE,{runIntake:()=>oP});async function oP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(sP),0):r==="scan"?iP(n,e):r==="config"?aP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
|
|
1679
|
+
`),1)}async function iP(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=N(r,"--project");return X(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await Hc({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await ln(s)),0})}async function aP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(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 w(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 X(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var sP,ME=E(()=>{"use strict";hi();xe();sP=`usage: lmctl intake <scan|config> ...
|
|
1680
1680
|
|
|
1681
1681
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1682
1682
|
intake settings such as enabled state, labels, and issue state filters.
|
|
1683
|
-
`});import{createHash as lP}from"node:crypto";import{existsSync as bs,mkdirSync as cP,readFileSync as
|
|
1684
|
-
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=fd(o,
|
|
1685
|
-
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??
|
|
1683
|
+
`});import{createHash as lP}from"node:crypto";import{existsSync as bs,mkdirSync as cP,readFileSync as PE,realpathSync as uP,writeFileSync as dP}from"node:fs";import{dirname as FE,resolve as UE}from"node:path";function Ar(t){let e=UE(t);return bs(e)?uP(e):e}function DE(t,e){let r=FE(e),n=ud(t,cd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=UE(r,s.sessiondir));return n}function Ss(t,e){let r=Ar(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!bs(r)&&"upsertRootTeam"in e&&(cP(FE(r),{recursive:!0}),dP(r,n.raw_text,"utf8")),DE(n.raw_text,r);if(bs(r)){let s=PE(r,"utf8"),o=DE(s,r);return"upsertRootTeam"in e&&mP(o)&&pP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!bs(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function WE(t,e,r){let n=Ar(t),s=e.getRootTeam(n);s===null||!bs(n)||PE(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 mP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=fP)}function pP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:lP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var fP,ha=E(()=>{"use strict";Dt();fP=5});import{existsSync as hP}from"node:fs";import{dirname as BE}from"node:path";function wP(t){return _P.test(t)||gP.test(t)}function qE(t){return _a.test(t)}function kd(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!_a.test(n)?null:{teamfile:r,alias:n}}function Pt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!qE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${_a.source}).`);let n=Ar(t);if(r===void 0&&!hP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=Ss(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=ia(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}.
|
|
1684
|
+
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=fd(o,BE(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.
|
|
1685
|
+
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??BE(n),isLead:Et(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function ar(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=kd(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?qE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${_a.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
1686
1686
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(wP(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.
|
|
1687
1687
|
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}".
|
|
1688
1688
|
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.
|
|
1689
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,_P,gP,_a,Ts=E(()=>{"use strict";Dt();ha();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},_P=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,gP=/^ses_[A-Za-z0-9_-]+$/,_a=/^[A-Za-z][A-Za-z0-9_-]*$/});function
|
|
1689
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,_P,gP,_a,Ts=E(()=>{"use strict";Dt();ha();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},_P=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,gP=/^ses_[A-Za-z0-9_-]+$/,_a=/^[A-Za-z][A-Za-z0-9_-]*$/});function XE(t){let e=HE(t.registry,t.fromTeamfile);if(e===void 0)return bn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!JE(e,t.fromAlias))return bn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=HE(t.registry,t.toTeamfile);return r===void 0?bn(`target team is not registered in policy graph: ${t.toTeamfile}`):JE(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?bn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?bn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:bn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function HE(t,e){return t.teams.find(r=>r.teamfile===e)}function JE(t,e){return t.aliases.some(r=>r===e)}function bn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var GE=E(()=>{"use strict"});import{basename as yP}from"node:path";function KE(t,e){let r=new Date(e.now.getTime()-wa()).toISOString(),n=ZE(t,r).filter(p=>!p.sender.teamfile.startsWith("prompt:")),s=TP(e.sender,n),o=kP(e.sender,n);o!==null&&o.teamfile===e.root&&!ga(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(p=>ga(p,i)),c=n.filter(p=>ga(p.receiver,i)&&s.some(h=>ga(h,p.receiver))).reduce((p,h)=>p+Math.max(0,h.activeCount-1),0),u=l.length+c+1,d=l.map(p=>p.at).filter(p=>p!==null).sort((p,h)=>h-p)[0]??null,f=d!==null&&e.now.getTime()-d<EP;return{stop:l.length>=1&&(f||u>bP),chain:vP(a)}}function zE(t,e){let r=new Date(e.now.getTime()-wa()).toISOString(),n=ZE(t,r),s=QE(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 wa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return VE;let r=Number(e);return!Number.isFinite(r)||r<=0?VE:r}function YE(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function SP(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),activeCount:t.active_count}}function ZE(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(SP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function TP(t,e,r={}){let n=new Map;for(let a of e)n.set(Rr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Rr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Rr(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=Rr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function QE(t,e){let r=Rr(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=Rr(l.sender),u=Rr(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 kP(t,e){let r=QE(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ga(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Rr(t){return`${t.teamfile}\0${t.alias}`}function vP(t){return t.map(e=>`${yP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var EP,bP,VE,eb=E(()=>{"use strict";EP=6e4,bP=2,VE=30*60*1e3});var ob={};le(ob,{parseIdleTimeoutMs:()=>sb,runChat:()=>xP});async function xP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${rb}
|
|
1690
1690
|
`),t.length===0?2:0;let r=$P(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1691
|
-
${
|
|
1691
|
+
${rb}
|
|
1692
1692
|
`),2;if(r.runFlag!==void 0){let l=Number.parseInt(r.runFlag,10);return!Number.isFinite(l)||l<=0||String(l)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
|
|
1693
1693
|
`),2):await X(e,async c=>{let u=c.getRun(l);if(u===null)return e.stderr.write(`error: run ${l}: not found
|
|
1694
1694
|
`),1;if(u.terminal_state!==null&&u.terminal_state.length>0)return w(e,`run ${l}: already terminal (${u.terminal_state}); chat --run cannot resume a terminated run`);let d=Vi(c,l);if(d===null)return e.stderr.write(`error: run ${l}: no pending operator-answerable attention (chat --run only resumes paused runs)
|
|
@@ -1703,7 +1703,7 @@ ${tb}
|
|
|
1703
1703
|
`),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
|
|
1704
1704
|
`),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
|
|
1705
1705
|
`),2;let l=n.alias;try{let c=await X(e,h=>Pt(n.teamfile,l,h)),u=c.teamfile,d=await X(e,h=>jP(r.fromFlag,u,h)),f=await NP(e,{explicitRoot:r.rootFlag,sender:d,receiverTeamfile:u,operatorOrigin:r.fromFlag===void 0}),m=r.fromFlag===void 0?null:await AP(e,{rootTeamfile:f,sender:d,receiverTeamfile:u,receiverAlias:c.alias});m!==null&&!m.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${m.reason}
|
|
1706
|
-
`),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{}},Ko(e,c.isLead,c.alias,c.provider,c.sessiondir);try{zo(e,Ne(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m},r.fromFlag!==void 0&&d.teamfile!==u){let h=await X(e,g=>
|
|
1706
|
+
`),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{}},Ko(e,c.isLead,c.alias,c.provider,c.sessiondir);try{zo(e,Ne(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m},r.fromFlag!==void 0&&d.teamfile!==u){let h=await X(e,g=>KE(g,{root:f,sender:d,receiverTeamfile:u,receiverAlias:c.alias,now:new Date}));if(h.stop){let g=YE(h.chain);return await ya(e,{...o,message:r.prompt,response:null,status:"error",error_detail:g}),e.stderr.write(`${g}
|
|
1707
1707
|
`),1}}let p=await LP(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=MP(c.alias,p.current);return await ya(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
|
|
1708
1708
|
`),1}i=p.lease}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: ${u}
|
|
1709
1709
|
`),c instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
|
|
@@ -1713,12 +1713,12 @@ ${tb}
|
|
|
1713
1713
|
`):e.stdout.write(`${c.text}${c.text.endsWith(`
|
|
1714
1714
|
`)?"":`
|
|
1715
1715
|
`}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await ya(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: ${c}`:c}),e.stderr.write(`error: ${c}
|
|
1716
|
-
`),1}finally{i!==null&&await CP(e,i)}}function $P(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=
|
|
1717
|
-
`)}}function MP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function ya(t,e){let r=
|
|
1718
|
-
`)}}function
|
|
1716
|
+
`),1}finally{i!==null&&await CP(e,i)}}function $P(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=sb(_);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 jP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=kd(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Ar(n.teamfile),o=Ss(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ia(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 NP(t,e){return e.explicitRoot!==void 0?Ar(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await X(t,r=>zE(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function AP(t,e){return await X(t,r=>XE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:RP(r,e.sender.teamfile,e.receiverTeamfile)}))}function RP(t,e,r){return{teams:[e,r].map(s=>OP(s,t))}}function OP(t,e){let r=Ss(t,e),n=Et(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function LP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-wa()).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 X(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function CP(t,e){try{await X(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)}
|
|
1717
|
+
`)}}function MP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function ya(t,e){let r=nb(e.message),n=e.response===null?null:nb(e.response);try{await X(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)}
|
|
1718
|
+
`)}}function nb(t){return t.length<=tb?{text:t,truncated:!1}:{text:t.slice(0,tb),truncated:!0}}function sb(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 DP(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
1719
1719
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
1720
1720
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
1721
|
-
`)}var IP,
|
|
1721
|
+
`)}var IP,tb,rb,ib=E(()=>{"use strict";jt();xe();Ts();Dt();Yn();GE();ha();eb();Ki();Nt();IP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},tb=256*1024,rb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
1722
1722
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
1723
1723
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
1724
1724
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -1726,16 +1726,16 @@ ${tb}
|
|
|
1726
1726
|
[--permission-mode plan|yolo] [--idle-timeout <duration>]
|
|
1727
1727
|
[--from <teamfile>:<alias>] [--root <teamfile>] [--force]
|
|
1728
1728
|
|
|
1729
|
-
Send a prompt to a team member or raw provider session, or answer a paused run.`});var ks,Y8,vd=E(()=>{"use strict";ks=[{name:"lmctl_chat",description:'Send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. For batch or long-running background jobs, call the CLI directly instead: `lmctl chat <team.lmctl> <alias> "<prompt>"`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"],additionalProperties:!1},local:!0}],Y8=ks.length});import{spawn as PP}from"node:child_process";async function
|
|
1730
|
-
`}async function
|
|
1729
|
+
Send a prompt to a team member or raw provider session, or answer a paused run.`});var ks,Y8,vd=E(()=>{"use strict";ks=[{name:"lmctl_chat",description:'Send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. For batch or long-running background jobs, call the CLI directly instead: `lmctl chat <team.lmctl> <alias> "<prompt>"`.',inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"],additionalProperties:!1},local:!0}],Y8=ks.length});import{spawn as PP}from"node:child_process";async function lb(t,e,r){let n=UP.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};if(n.inputSchema.additionalProperties===!1){let o=new Set(Object.keys(n.inputSchema.properties));for(let i of Object.keys(s))if(!o.has(i))return{status:"error",code:400,message:`unknown parameter: ${i}`}}return WP(n.name,s)}function WP(t,e){return t==="lmctl_chat"?BP(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function BP(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),qP(o,process.cwd())}function qP(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=PP("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=HP(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function HP(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return ab;let r=Number(e);return!Number.isFinite(r)||r<=0?ab:r}function Id(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:FP),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var FP,ab,UP,xd=E(()=>{"use strict";vd();FP="http://127.0.0.1:8787",ab=30*60*1e3,UP=new Map(ks.map(t=>[t.name,t]))});async function VP(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write($d({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:JP,capabilities:{tools:{listChanged:!1}},serverInfo:{name:XP,version:GP}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:ks.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await lb(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function $d(t){return`${JSON.stringify(t)}
|
|
1730
|
+
`}async function cb(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($d({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 VP(l,t);c.kind==="response"?t.io.write($d(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(`
|
|
1731
1731
|
`);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(`
|
|
1732
1732
|
`)}};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}
|
|
1733
|
-
`),a.finally(()=>c(1))})})}var JP,XP,GP,
|
|
1734
|
-
`),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??YP(),o=1;try{let i=s===void 0?Id({getConfig:()=>null},process.env):Id(s,process.env);return o=await
|
|
1733
|
+
`),a.finally(()=>c(1))})})}var JP,XP,GP,ub=E(()=>{"use strict";vd();xd();JP="2025-06-18",XP="lmctl",GP="0.0.1"});var fb={};le(fb,{runMcp:()=>zP});async function zP(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(KP),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
1734
|
+
`),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??YP(),o=1;try{let i=s===void 0?Id({getConfig:()=>null},process.env):Id(s,process.env);return o=await cb({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 YP(){let t=ce(),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&&db(s))ZP(50*r);else if(!db(s))break}}function db(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function ZP(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var KP,mb=E(()=>{"use strict";Pe();xd();ub();Oe();Ve();KP=`usage: lmctl mcp
|
|
1735
1735
|
|
|
1736
1736
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
1737
1737
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
1738
|
-
`});function vs(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var
|
|
1738
|
+
`});function vs(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var pb=E(()=>{"use strict"});function QP(t){return{stale_run_minutes:xs(t,"monitor.stale_run_minutes",Is.stale_run_minutes),old_attention_days:xs(t,"monitor.old_attention_days",Is.old_attention_days),old_issue_days:xs(t,"monitor.old_issue_days",Is.old_issue_days),stuck_job_minutes:xs(t,"monitor.stuck_job_minutes",Is.stuck_job_minutes),dedupe_window_hours:xs(t,"monitor.dedupe_window_hours",Is.dedupe_window_hours)}}function xs(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function hb(t,e={}){let r=e.now??new Date,n=QP(t),s=[];for(let o of e1(t,n,r))s.push(o);for(let o of t1(t,n,r))s.push(o);for(let o of r1(t,n,r))s.push(o);for(let o of n1(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function e1(t,e,r){let n=_b(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
|
|
1739
1739
|
SELECT r.id AS id,
|
|
1740
1740
|
r.job_id AS job_id,
|
|
1741
1741
|
w.name AS workflow_name,
|
|
@@ -1746,12 +1746,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1746
1746
|
WHERE r.terminal_state IS NULL
|
|
1747
1747
|
AND r.paused_at IS NULL
|
|
1748
1748
|
AND r.started_at <= ?
|
|
1749
|
-
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=vs(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(Ea(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function t1(t,e,r){let n=
|
|
1749
|
+
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=vs(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(Ea(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function t1(t,e,r){let n=_b(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
|
|
1750
1750
|
SELECT id, project_id, source, source_ref, status, enqueued_at
|
|
1751
1751
|
FROM job
|
|
1752
1752
|
WHERE status NOT IN ('done', 'failed')
|
|
1753
1753
|
AND enqueued_at <= ?
|
|
1754
|
-
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=vs(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(Ea(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function r1(t,e,r){let n=
|
|
1754
|
+
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=vs(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(Ea(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function r1(t,e,r){let n=gb(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
|
|
1755
1755
|
SELECT project_id,
|
|
1756
1756
|
COUNT(*) AS count,
|
|
1757
1757
|
(SELECT kind FROM attention a2
|
|
@@ -1766,7 +1766,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1766
1766
|
AND kind NOT IN ('attentions_overdue', 'issues_overdue')
|
|
1767
1767
|
AND created_at <= ?
|
|
1768
1768
|
GROUP BY project_id
|
|
1769
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=vs(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(Ea(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function n1(t,e,r){let n=
|
|
1769
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=vs(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(Ea(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function n1(t,e,r){let n=gb(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
|
|
1770
1770
|
SELECT project_id,
|
|
1771
1771
|
COUNT(*) AS count,
|
|
1772
1772
|
(SELECT title FROM project_issue i2
|
|
@@ -1786,18 +1786,18 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1786
1786
|
AND payload LIKE ?
|
|
1787
1787
|
ORDER BY id DESC
|
|
1788
1788
|
LIMIT 1
|
|
1789
|
-
`).get(s,o)??null}function
|
|
1790
|
-
`),0})}catch(o){return fe(e,o)}}function
|
|
1789
|
+
`).get(s,o)??null}function _b(t,e){return new Date(t.getTime()-e*60*1e3)}function o1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function gb(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function i1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Is,wb=E(()=>{"use strict";pb();Is={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Eb={};le(Eb,{renderSummary:()=>yb,runMonitor:()=>l1});async function l1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(a1),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await X(e,o=>{let i=hb(o);return n?W(e,i):s||e.stdout.write(`${yb(i.findings)}
|
|
1790
|
+
`),0})}catch(o){return fe(e,o)}}function yb(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} ${c1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function c1(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 a1,bb=E(()=>{"use strict";xe();wb();a1=`usage: lmctl monitor [--json] [--quiet]
|
|
1791
1791
|
|
|
1792
1792
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
1793
1793
|
issues; emit findings as attentions for the operator/master to handle.
|
|
1794
|
-
`});var
|
|
1794
|
+
`});var Sb={};le(Sb,{runDevice:()=>E1});import{readFileSync as u1}from"node:fs";import{homedir as d1}from"node:os";import{join as f1}from"node:path";import{CognitoIdentityClient as m1,GetIdCommand as p1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as h1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as _1,ListObjectsV2Command as g1,PutObjectCommand as w1,S3Client as y1}from"@aws-sdk/client-s3";async function E1(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(jd),0;if(r==="init"){let n=Ed();return e.stdout.write(`${n.device_id}
|
|
1795
1795
|
`),0}if(r==="id"){let n=Nr();return n===null?(e.stderr.write(`error: no device id initialized at ${fa()}; run 'lmctl device init'
|
|
1796
1796
|
`),1):(e.stdout.write(`${n.device_id}
|
|
1797
1797
|
`),0)}return r==="login"?await b1(t.slice(1),e):r==="prompt"?await T1(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
1798
1798
|
`),1)}async function b1(t,e){let r=S1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1799
1799
|
${jd}`),2;let n=Es();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
1800
|
-
`),1;
|
|
1800
|
+
`),1;Ky({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await sa({region:n.config.region,clientId:n.config.cognitoClientId??da,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}
|
|
1801
1801
|
`),1}let a=gs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
|
|
1802
1802
|
`),1;od({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Nr()??Ed();return e.stdout.write(`logged in as ${r.userId}
|
|
1803
1803
|
device id: ${l.device_id}
|
|
@@ -1805,8 +1805,8 @@ mailbox prefix: ${r.userId}/${l.device_id}/
|
|
|
1805
1805
|
access key stored at ${ws()}
|
|
1806
1806
|
`),0}function S1(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 T1(t,e){let r=k1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1807
1807
|
${jd}`),2;let n=Es();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
1808
|
-
`),1;let s=I1();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 v1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=h1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Nr()?.device_id,u=gs(o)??void 0,d=new jr({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 y1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:g1,GetObjectCommand:_1,PutObjectCommand:w1},selfRole:"browser",onMessage:async()=>{}}),f=
|
|
1809
|
-
`),0}function k1(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 v1(t){let r=await new m1({region:t.region}).send(new p1({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 I1(t=process.env.LMCTL_TOKEN_PATH??f1(d1(),".lmctl","cli-tokens.json")){try{return JSON.parse(u1(t,"utf8"))}catch{return null}}var jd,
|
|
1808
|
+
`),1;let s=I1();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 v1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=h1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Nr()?.device_id,u=gs(o)??void 0,d=new jr({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 y1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:g1,GetObjectCommand:_1,PutObjectCommand:w1},selfRole:"browser",onMessage:async()=>{}}),f=Py({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Dy,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
1809
|
+
`),0}function k1(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 v1(t){let r=await new m1({region:t.region}).send(new p1({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 I1(t=process.env.LMCTL_TOKEN_PATH??f1(d1(),".lmctl","cli-tokens.json")){try{return JSON.parse(u1(t,"utf8"))}catch{return null}}var jd,Tb=E(()=>{"use strict";bd();hd();Bi();td();rd();id();nd();jd=`usage: lmctl device <id|init>
|
|
1810
1810
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
1811
1811
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
1812
1812
|
|
|
@@ -1816,7 +1816,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
1816
1816
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
1817
1817
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
1818
1818
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
1819
|
-
`});var
|
|
1819
|
+
`});var vb={};le(vb,{runTeam:()=>j1});import{join as x1}from"node:path";async function j1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write($1),0;try{return await X(e,async s=>{switch(r){case"create":return A1(n,e,s);case"list":return R1(n,e,s);case"show":return O1(n,e,s);case"add-member":return L1(n,e,s);case"seed":return kb(n,e,s,!1);case"refresh":return kb(n,e,s,!0);case"companion":return M1(n,e,s);case"list-roots":return N1(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function N1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
1820
1820
|
`)+(s.length>0?`
|
|
1821
1821
|
`:"")),0}function A1(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
1822
1822
|
`),0}function R1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
@@ -1824,39 +1824,39 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
|
1824
1824
|
`:""}`),0}function O1(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
1825
1825
|
`);for(let a of i)e.stdout.write(`- ${a.alias} ${ke(a)} ${a.sessionid??"(unseeded)"}
|
|
1826
1826
|
`)}return 0}function L1(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=N(n,"--alias"),a=N(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??x1(ur(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
1827
|
-
`),0}async function
|
|
1827
|
+
`),0}async function kb(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=N(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=C1(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Pg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Do(f,r),Fo(f);let u=[],d=!1;for(let f of l){let m=await Jr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
|
|
1828
1828
|
|
|
1829
1829
|
${Kr}`:Kr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=zr(ke(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
1830
1830
|
${_}
|
|
1831
1831
|
`);try{await ei({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
1832
1832
|
`)}}}return M(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
1833
1833
|
`),d?1:0}function C1(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function M1(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=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 w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
1834
|
-
`),0}var $1,
|
|
1834
|
+
`),0}var $1,Ib=E(()=>{"use strict";Ve();yo();Xn();ac();Pe();Yr();vc();Ri();xe();lc();$1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
|
|
1835
1835
|
|
|
1836
1836
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
1837
1837
|
refresh to create/update native provider sessions for team members.
|
|
1838
1838
|
|
|
1839
1839
|
Root team registry:
|
|
1840
1840
|
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
1841
|
-
`});var
|
|
1842
|
-
`),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=N(r,"--lines"),s=n===void 0?P1:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=N(r,"--watch-interval"),a=i===void 0?F1:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=N(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(N(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await X(e,async m=>B1(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=ar(D1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=Et(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Pt(c.teamfile,m.alias);u={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}}else try{let f=Pt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,m=c.provider;if(m===void 0){let p=await Wo(f);if(p.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(p.length>1)return w(e,`tail: session "${f}" matches multiple providers (${p.join(", ")}); pass --provider`);m=p[0]}u={provider:m,sessionId:f}}let d=await
|
|
1843
|
-
`)}},p=setInterval(()=>{m()},a*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function
|
|
1841
|
+
`});var Ab={};le(Ab,{renderMessage:()=>jb,runTail:()=>W1});async function W1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${U1}
|
|
1842
|
+
`),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=N(r,"--lines"),s=n===void 0?P1:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=N(r,"--watch-interval"),a=i===void 0?F1:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=N(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(N(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await X(e,async m=>B1(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=ar(D1,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=Et(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Pt(c.teamfile,m.alias);u={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}}else try{let f=Pt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,m=c.provider;if(m===void 0){let p=await Wo(f);if(p.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(p.length>1)return w(e,`tail: session "${f}" matches multiple providers (${p.join(", ")}); pass --provider`);m=p[0]}u={provider:m,sessionId:f}}let d=await xb(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await xb(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
|
|
1843
|
+
`)}},p=setInterval(()=>{m()},a*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function xb(t,e,r,n,s){let o;try{o=await kr(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
|
|
1844
1844
|
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
1845
|
-
`),-1;let i=o.messages??[],a=s<0?Math.max(0,i.length-n):s+1;if(a>=i.length)return i.length-1;for(let l=a;l<i.length;l+=1)t.stdout.write(`${
|
|
1846
|
-
`);return i.length-1}function
|
|
1845
|
+
`),-1;let i=o.messages??[],a=s<0?Math.max(0,i.length-n):s+1;if(a>=i.length)return i.length-1;for(let l=a;l<i.length;l+=1)t.stdout.write(`${jb(i[l])}
|
|
1846
|
+
`);return i.length-1}function jb(t){let e=Nb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
|
|
1847
1847
|
`).replace(/\r/g,`
|
|
1848
1848
|
`).split(`
|
|
1849
1849
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
|
|
1850
1850
|
${i.map(a=>` ${a}`).join(`
|
|
1851
|
-
`)}`}async function B1(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${
|
|
1852
|
-
`);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let p=e.listSessionEvents(r,c);for(let h of p)t.stdout.write(`${
|
|
1851
|
+
`)}`}async function B1(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${$b(u)}
|
|
1852
|
+
`);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let p=e.listSessionEvents(r,c);for(let h of p)t.stdout.write(`${$b(h)}
|
|
1853
1853
|
`),c=h.id}catch(p){t.stderr.write(`tail: ${p instanceof Error?p.message:String(p)}
|
|
1854
|
-
`)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function
|
|
1854
|
+
`)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function $b(t){let e=Nb(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 Nb(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 D1,P1,F1,U1,Rb=E(()=>{"use strict";Yr();xe();Ts();Dt();D1={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},P1=20,F1=2,U1=`usage: lmctl tail [target] [alias]
|
|
1855
1855
|
lmctl tail --session <id> [--provider <name>]
|
|
1856
1856
|
lmctl tail --run <id> [--watch] [--watch-interval Ns]
|
|
1857
1857
|
[--lines N] [--watch] [--watch-interval Ns] [--provider <name>]
|
|
1858
1858
|
|
|
1859
|
-
Print or watch provider session messages, or follow a managed run timeline.`});var
|
|
1859
|
+
Print or watch provider session messages, or follow a managed run timeline.`});var Ob={};le(Ob,{runInfo:()=>X1});function J1(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function X1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${H1}
|
|
1860
1860
|
`),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=N(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await X(e,async u=>V1(e,u,c,n))}catch(u){return fe(e,u)}}let o=ar(q1,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:N(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return K1(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Pt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):fe(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Wo(a);if(c.length===0)return w(e,`info: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`info: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return G1(e,i,a,l,n)}async function G1(t,e,r,n,s){let o;try{o=await kr(r,e)}catch(a){return w(t,`info: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`info: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??0,totalOutputTokens:o.totalOutputTokens??0,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
1861
1861
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
1862
1862
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
@@ -1881,31 +1881,32 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
|
|
|
1881
1881
|
`),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
|
|
1882
1882
|
`);for(let u of s){let d=u.lastContext!==void 0?J1(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${String(u.messageCount).padStart(6)} ${d.padStart(12)}
|
|
1883
1883
|
`)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${String(o).padStart(6)}
|
|
1884
|
-
`),0}var q1,H1,
|
|
1884
|
+
`),0}var q1,H1,Lb=E(()=>{"use strict";Yr();xe();Ts();Dt();Nt();q1={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},H1=`usage: lmctl info [target] [alias]
|
|
1885
1885
|
lmctl info <teamfile> # team rollup
|
|
1886
1886
|
lmctl info <sessionid> [--provider <name>]
|
|
1887
1887
|
[--json]
|
|
1888
1888
|
|
|
1889
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var
|
|
1890
|
-
`),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=Y1;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>
|
|
1889
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var Mb={};le(Mb,{runLs:()=>Q1});import{resolve as Nd}from"node:path";function Z1(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 Q1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${z1}
|
|
1890
|
+
`),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=Y1;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Cb)return w(e,`--limit ${_} exceeds maximum (${Cb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await X(e,async _=>eF(e,_,h,g))}catch(_){return fe(e,_)}}let i=tF(n,s);if("error"in i)return w(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 Wl(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Nd(c):Nd(process.cwd());f=f.filter(h=>{let g=Nd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=Z1(f),a==="json")return W(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}.
|
|
1891
1891
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
1892
1892
|
`);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
|
|
1893
1893
|
`);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()}
|
|
1894
1894
|
`)}return 0}async function eF(t,e,r,n){let s=Xr(e,{limit:r});if(n==="json")return W(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.
|
|
1895
1895
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
1896
1896
|
`);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}
|
|
1897
|
-
`)}return 0}function tF(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 z1,Y1,
|
|
1897
|
+
`)}return 0}function tF(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 z1,Y1,Cb,Db=E(()=>{"use strict";jt();xe();Nt();z1=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
1898
1898
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
1899
1899
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
1900
1900
|
|
|
1901
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,Y1=50,
|
|
1902
|
-
`),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=dd(n,Rs(Lr(r))),o=
|
|
1903
|
-
`);for(let i of n.members)
|
|
1904
|
-
`);return await X(e,i=>{
|
|
1901
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,Y1=50,Cb=500});import{existsSync as Fb,readFileSync as Ub}from"node:fs";import{homedir as rF}from"node:os";import{dirname as nF,resolve as Wb}from"node:path";import{fileURLToPath as sF}from"node:url";function Od(t,e={}){let r=[],n=aF(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=dF(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: ${Pb(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}": `+(Sa??"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: ${Pb(i)}`)}return r}function aF(t){if(!t&&$s)return $s;let e=new Map,r,n=t??lF();if(!Fb(n))return r=`${n} not found`,t||Ad(e),t||($s=e),t||(Sa=r),e;let s;try{s=Ub(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Ad(e),t||($s=e),t||(Sa=r),e}for(let[o,i]of Object.entries(oF)){let a=cF(s,i),l=uF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Ad(e),t||($s=e),t||(Sa=r),e}function lF(){let t=nF(sF(import.meta.url));return Wb(t,"..","..","..","durable-memory","model_selection.md")}function Ad(t){for(let[e,r]of Object.entries(iF))t.set(e,r)}function cF(t,e){let n=new RegExp(`^## ${mF(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 uF(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 dF(t){let e=t??Wb(rF(),".config","opencode","opencode.json"),r=hm();if(!Fb(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(Ub(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([...fF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function fF(t){if(!Rd(t))return[];let e=ba(t.provider)??ba(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Rd(s))continue;let o=ba(s.models)??ba(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ba(t){return Rd(t)?t:null}function Rd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pb(t){return t.length>0?t.join(", "):"(none)"}function mF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var oF,iF,$s,Sa,Bb=E(()=>{"use strict";cl();oF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},iF={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"]},$s=null});var Os={};le(Os,{DEPRECATED_CONNECT_WARNING:()=>Kb,GEMINI_PROVIDER_NOTICE:()=>Vb,_setLintSessiondirFsOpsForTests:()=>$F,_setSkillFileOpsForTests:()=>xF,_setTeamfileSeedForTests:()=>IF,buildRootTeamRegistrationRow:()=>Qb,registerRootTeam:()=>eS,runHire:()=>LF,runLint:()=>OF,runRefresh:()=>CF,runSeed:()=>Yb,sha256Text:()=>Zb,skillNameFromSource:()=>Wd,skillNameFromUrl:()=>VF});import{createHash as pF,randomUUID as hF}from"node:crypto";import{accessSync as _F,constants as qb,existsSync as gF,mkdirSync as wF,readFileSync as va,realpathSync as Cd,renameSync as yF,statSync as EF,unlinkSync as bF,writeFileSync as As}from"node:fs";import{basename as SF,dirname as Rs,isAbsolute as Hb,join as Md,resolve as Lr}from"node:path";function IF(t){zb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(jt(),ql)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function xF(t){Ns=t===null?Dd:{...Dd,...t}}function $F(t){Or=t===null?Pd:{...Pd,...t}}function jF(t,e){let r=Rs(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=Lr(i);if(n.has(a))continue;let l=NF(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 NF(t){try{if(Or.existsSync(t)){if(!Or.statSync(t).isDirectory())return"ENOTDIR";Or.accessSync(t,qb.W_OK);return}let e=AF(t);if(e===void 0)return;if(!Or.statSync(e).isDirectory())return"ENOTDIR";Or.accessSync(e,qb.W_OK);return}catch(e){return RF(e)??"permission check failed"}}function AF(t){let e=t;for(;;){try{if(Or.existsSync(e))return e}catch{return}let r=Rs(e);if(r===e)return;e=r}}function RF(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 OF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(kF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
1902
|
+
`),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=dd(n,Rs(Lr(r))),o=Od(n.members);o.push(...jF(n.members,Lr(r))),n.deprecatedConnectLines.length>0&&o.push(Kb.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
|
|
1903
|
+
`);for(let i of n.members)Ud([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<js&&o.push(`${i.alias}: sessionid is shorter than ${js} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
|
|
1904
|
+
`);return await X(e,i=>{WE(r,i,a=>e.stderr.write(`${a}
|
|
1905
1905
|
`))}),s.length>0?1:(e.stdout.write(`ok
|
|
1906
1906
|
`),0)}async function Yb(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(vF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
1907
|
-
`),2;let r=t[0],n=Lr(r),s;try{s=
|
|
1908
|
-
`);return 1}
|
|
1907
|
+
`),2;let r=t[0],n=Lr(r),s;try{s=Cd(n)}catch(S){return Be(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let o=Rs(n),i;try{i=Ne(n)}catch(S){return Be(e,`${r}: ${S instanceof Error?S.message:String(S)}`)}let a=dd(i,o);if(a.length>0){Ud(i.members,e);for(let S of a)e.stderr.write(`error: ${S.field}: ${S.message}
|
|
1908
|
+
`);return 1}Ud(i.members,e);for(let S of Od(i.members))e.stderr.write(`warning: ${S}
|
|
1909
|
+
`);let l=i.members.find(S=>S.teamfile===void 0&&S.session!==void 0&&S.session.length>0&&S.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.
|
|
1909
1910
|
`),1;let c=await HF(i.skillUrls,o,e);if(c!==0)return c;let u=va(n,"utf8"),d=u.split(`
|
|
1910
1911
|
`),f=DF(d),m=0,p=i.members.filter(S=>S.teamfile!==void 0?!1:S.session===void 0||S.session.length<js);for(let S of p)if(!rS(S.provider))return e.stderr.write(`error: ${S.alias}: invalid provider "${S.provider}"
|
|
1911
1912
|
`),1;let h=i.members.find(S=>S.alias.toLowerCase()==="lead");if(h!==void 0){Ur("lmctl","lmctl_chat",{warn:x=>e.stderr.write(`${x}
|
|
@@ -1918,15 +1919,15 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
1918
1919
|
`),1;let R=Xb(d[k],"sessionid",x.sessionId);S.sessiondir===void 0&&(R=Xb(R,"sessiondir",o)),d[k]=R,m+=1,As(n,d.join(`
|
|
1919
1920
|
`),"utf8"),e.stdout.write(`${S.alias}: seeded ${x.sessionId}
|
|
1920
1921
|
`)}let g=d.join(`
|
|
1921
|
-
`),_=qF(g,
|
|
1922
|
-
`);let T=new Date().toISOString();return await X(e,S=>{eS(S,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function LF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ka),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return
|
|
1922
|
+
`),_=qF(g,Cd(n));_!==g&&As(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
|
|
1923
|
+
`);let T=new Date().toISOString();return await X(e,S=>{eS(S,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function LF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ka),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Ld(e,r.error,ka);if(r.positionals.length!==2)return Ld(e,"expected <teamfile.lmctl> and <alias>",ka);let[n,s]=r.positionals;if(!UF(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 Ld(e,"missing value for --provider",ka);if(!rS(o))return Be(e,`invalid provider "${o}"`);let i=Lr(n),a;try{a=va(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(FF(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=N(r,"--sessiondir"),c=[`_MEMBER_ alias=${Fd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Fd(l)}`]].join(" "),u=BF(a,c);return As(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
1923
1924
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
1924
1925
|
`),0}async function CF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Jb),0;if(t.length!==2)return e.stderr.write(Jb),2;let[r,n]=t;if(n.toLowerCase()==="lead")return Be(e,"refresh only applies to non-Lead members");let s=Lr(r),o;try{o=va(s,"utf8")}catch(c){return Be(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=o.split(`
|
|
1925
1926
|
`),a=PF(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];return Ia(l,"teamfile")!==void 0?Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`):(i[a]=WF(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),As(s,i.join(`
|
|
1926
1927
|
`),"utf8"),Yb([s],e))}function Zb(t){return pF("sha256").update(t).digest("hex")}function Qb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Zb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function eS(t,e){let r=Qb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function MF(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(`
|
|
1927
1928
|
`):"- (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.","","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")`),"","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(`
|
|
1928
1929
|
`)}function DF(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=Ia(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function PF(t,e){for(let r=0;r<t.length;r+=1){let n=t[r];if(/^\s*_MEMBER_\s+\S/u.test(n)&&Ia(n,"alias")===e)return r}}function FF(t,e){for(let r of t.split(`
|
|
1929
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Ia(r,"alias")===e)return!0;return!1}function UF(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Ia(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function Xb(t,e,r){let n=`${e}=${
|
|
1930
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Ia(r,"alias")===e)return!0;return!1}function UF(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Ia(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function Xb(t,e,r){let n=`${e}=${Fd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function WF(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Fd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function BF(t,e){let r=t.split(`
|
|
1930
1931
|
`),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(`
|
|
1931
1932
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
1932
1933
|
`),i=r.slice(s).join(`
|
|
@@ -1939,16 +1940,16 @@ ${i}`:`
|
|
|
1939
1940
|
${o}`:`${r}
|
|
1940
1941
|
`:t.length>0?`${r}
|
|
1941
1942
|
${t}`:`${r}
|
|
1942
|
-
`}async function HF(t,e,r){if(t.length===0)return 0;let n=
|
|
1943
|
+
`}async function HF(t,e,r){if(t.length===0)return 0;let n=Md(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await tS(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}
|
|
1943
1944
|
`);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
|
|
1944
1945
|
${i.body}${i.body.endsWith(`
|
|
1945
1946
|
`)?"":`
|
|
1946
1947
|
`}`;try{Ns.mkdirSync(n,{recursive:!0}),GF(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
|
|
1947
|
-
`)}return 0}async function tS(t,e,r,n,s){if(s>Ta)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ta}`);let o=await JF(t,e),i=XF(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:
|
|
1948
|
-
`),1}function
|
|
1949
|
-
${r}`),2}function
|
|
1948
|
+
`)}return 0}async function tS(t,e,r,n,s){if(s>Ta)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${Ta}`);let o=await JF(t,e),i=XF(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:Wd(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>=Ta)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${Ta}`);for(let a of i)await tS(a,o.base,r,n,s+1)}async function JF(t,e){if(e.kind==="https"){if(Bt(t)||!Hb(t)){let o=Gb(t,e),i;try{i=await pr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:Sn(o),source:Sn(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(Bt(t)){let o=Gb(t,e),i;try{i=await pr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:Sn(o),source:Sn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=Hb(t)?t:Lr(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Cd(r),s=va(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:Rs(n)},text:s}}function Gb(t,e){if(Bt(t)){if(!mt(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return Sn(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(!mt(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return Sn(r)}function XF(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(Bt(l)&&!mt(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 Sn(t){return new URL(t).href}function GF(t,e,r){let n=Md(t,`${e}.md`),s=Md(t,`${e}.${process.pid}.${hF().slice(0,8)}.tmp`);try{Ns.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ns.renameSync(s,n)}catch(o){try{Ns.unlinkSync(s)}catch{}throw o}}function VF(t){return Wd(t)}function Wd(t){let e=mt(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(SF(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,TF).replace(/-+$/gu,"")||"skill"}function rS(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}
|
|
1949
|
+
`),1}function Ld(t,e,r){return t.stderr.write(`error: ${e}
|
|
1950
|
+
${r}`),2}function Ud(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_
|
|
1950
1951
|
`),r.provider==="gemini"&&e.stderr.write(`${Vb.replace("%s",r.alias)}
|
|
1951
|
-
`)}var js,TF,Ta,kF,vF,ka,Jb,Vb,Kb,
|
|
1952
|
+
`)}var js,TF,Ta,kF,vF,ka,Jb,Vb,Kb,Dd,Pd,zb,Ns,Or,Ls=E(()=>{"use strict";Dt();Bb();Qs();xe();ha();Bs();Yn();js=5,TF=80,Ta=16,kF=`usage: lmctl lint <teamfile.lmctl>
|
|
1952
1953
|
|
|
1953
1954
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
1954
1955
|
`,vF=`usage: lmctl seed <teamfile.lmctl>
|
|
@@ -1963,14 +1964,14 @@ after editing to create the provider session.
|
|
|
1963
1964
|
|
|
1964
1965
|
Replace a non-Lead member's provider session by clearing its sessionid and
|
|
1965
1966
|
running lmctl seed for the teamfile.
|
|
1966
|
-
`,Vb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Kb="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",
|
|
1967
|
-
`),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=sS(r);if(!
|
|
1968
|
-
`),1}let i=sS(n),a=sU(i,o,n);if(
|
|
1967
|
+
`,Vb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Kb="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",Dd={mkdirSync:wF,writeFileSync:As,renameSync:yF,unlinkSync:bF},Pd={existsSync:gF,statSync:EF,accessSync:_F},zb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(jt(),ql)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ns=Dd,Or=Pd});var aS={};le(aS,{runClone:()=>rU});import{existsSync as Bd,mkdirSync as KF,readFileSync as zF,readdirSync as YF,statSync as oS,writeFileSync as ZF}from"node:fs";import{basename as nS,dirname as QF,extname as eU,join as iS,resolve as sS}from"node:path";async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(tU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
1968
|
+
`),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=sS(r);if(!Bd(c))throw new Error(`source not found: ${r}`);let d=oS(c).isDirectory()?nU(c):c;s=zF(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
1969
|
+
`),1}let i=sS(n),a=sU(i,o,n);if(Bd(a))return e.stderr.write(`error: ${a} already exists.
|
|
1969
1970
|
`),1;let l=iU(oU(s));return KF(QF(a),{recursive:!0}),ZF(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
1970
1971
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
1971
1972
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
1972
1973
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
1973
|
-
`),0}function nU(t){let e=YF(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 iS(t,e[0])}function sU(t,e,r){if(r.endsWith("/")||
|
|
1974
|
+
`),0}function nU(t){let e=YF(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 iS(t,e[0])}function sU(t,e,r){if(r.endsWith("/")||Bd(t)&&oS(t).isDirectory()){let n=nS(e).endsWith(".lmctl")?nS(e):"team.lmctl";return iS(t,n)}return eU(t)?t:`${t}.lmctl`}function oU(t){return t.split(`
|
|
1974
1975
|
`).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(`
|
|
1975
1976
|
`)}function iU(t){return t.split(`
|
|
1976
1977
|
`).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(`
|
|
@@ -2035,7 +2036,7 @@ Examples:
|
|
|
2035
2036
|
|
|
2036
2037
|
# Same shape, codex for the Lead and Reviewer2
|
|
2037
2038
|
lmctl plan ./backend --provider codex
|
|
2038
|
-
`});var hS={};le(hS,{SIZE_WARN_EST_TOKENS:()=>Cs,estimateTokens:()=>pS,runTerminal:()=>EU});import{spawn as gU}from"node:child_process";import{statSync as wU}from"node:fs";async function EU(t,e){if(t.includes("--help")||t.includes("-h"))return vU(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(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 w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):N(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await X(e,async i=>{let a=N(r,"--alias"),l=
|
|
2039
|
+
`});var hS={};le(hS,{SIZE_WARN_EST_TOKENS:()=>Cs,estimateTokens:()=>pS,runTerminal:()=>EU});import{spawn as gU}from"node:child_process";import{statSync as wU}from"node:fs";async function EU(t,e){if(t.includes("--help")||t.includes("-h"))return vU(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(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 w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):N(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await X(e,async i=>{let a=N(r,"--alias"),l=Pw(i,s,a);return"err"in l?w(e,l.err):qd(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(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 w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=ar(yU,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await X(e,l=>bU(e,a.teamfile,a.alias,l))}try{return await X(e,async s=>{let o=SU(e,s,r);if(typeof o=="number")return o;let i=N(r,"--alias");return M(r,"--size")?kU(e,s,o,i,M(r,"--json")):TU(e,s,o,i)})}catch(s){return fe(e,s)}}async function bU(t,e,r,n){let s;try{s=Pt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}Ko(t,s.isLead,s.alias,s.provider,s.sessiondir);try{zo(t,Ne(e),e)}catch{}return qd(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function qd(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Uo(r))return w(t,`no resume incantation for provider "${r}"`);if(!Yp.test(n))return w(t,"refusing to resume: malformed sessionid");let o=dc(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=gU(i,a,{stdio:"inherit",cwd:s});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function SU(t,e,r){let n=N(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=ti(t,e,N(r,"--project"));return typeof s=="number"?s:ri(t,e,s,void 0)}async function TU(t,e,r,n){let s=ni(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):qd(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function pS(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=wU(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 kU(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ke(a),u=null;Uo(c)&&(u=await kr(l,c));let d=pS(u),f=d.est>Cs;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?zr(c,l):null})}if(s)return W(t,{estimate:!0,legend:mS,guide_tokens:Cs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2039
2040
|
`),t.stdout.write(`${mS}
|
|
2040
2041
|
`);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)
|
|
2041
2042
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2073,14 +2074,14 @@ Examples:
|
|
|
2073
2074
|
tokens it surfaces the resume incantation so YOU can
|
|
2074
2075
|
open & self-compact. Nothing is ever changed
|
|
2075
2076
|
automatically; ${Cs} is a guide, not a gate.
|
|
2076
|
-
`),0}var yU,Cs,mS,_S=E(()=>{"use strict";Pe();Yr();xe();$c();Ts();Dt();Yn();Ki();yU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Cs=2e5,mS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as
|
|
2077
|
+
`),0}var yU,Cs,mS,_S=E(()=>{"use strict";Pe();Yr();xe();$c();Ts();Dt();Yn();Ki();yU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Cs=2e5,mS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Hd,dirname as ES}from"node:path";function Jd(t,e){let r=Hd(t);for(;;){let n=IU(e,r);if(n!==null)return n;let s=ES(r);if(s===r)return null;r=s}}function IU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function xa(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function $a(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function Xd(t){if(t.io.dal!==void 0){let o=gS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new tt(wS(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(xa()||$a()){let o=ce(),i=pe({path:o}),a=gS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new tt(wS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:$a()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:xa()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?SS(t.cwd):xU(t.projectName),r=TS(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 tt(`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 bS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(xa()||$a()){let n=ce();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:$a()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:xa()?"explicit-db":"explicit-workspace"}}let e;try{e=SS(t.cwd)}catch{throw new tt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=TS(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 gS(t,e,r){return r!==void 0?t.findProjectByName(r):Jd(e,t)}function wS(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 xU(t){let e=[];for(let r of Ma())for(let n of kS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new tt(`project not found in any workspace DB: ${t}`);return e}function SS(t){let e=$U(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Ma())for(let o of kS(s)){let i=Hd(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 tt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function TS(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 tt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2077
2078
|
${yS(n)}`):new tt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2078
2079
|
${yS(n)}`)}function yS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2079
|
-
`)}function $U(t){let e=[],r=
|
|
2080
|
-
`),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return lr(e,r.error);if(r.positionals.length>1)return lr(e,ja);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 lr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Bt(c))return lr(e,ja);if(Zt(c))return vS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Nn(c,"remote workflow URLs");return m!==null?w(e,m):vS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return lr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return lr(e,ja);if(i!==void 0&&(o!==void 0||a!==void 0))return lr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=HU(i);if(m===null)return lr(e,`invalid --job: ${i}`);let p=bS({cwd:process.cwd(),io:e});try{let h=await fs({dal:p.dal,job_id:m,worker_id:
|
|
2080
|
+
`)}function $U(t){let e=[],r=Hd(t);for(;;){e.push(r);let n=ES(r);if(n===r)return e;r=n}}function kS(t){let e=null;try{e=new qs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>za)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 tt,Gd=E(()=>{"use strict";Ka();Za();Pe();Ve();tt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Qd={};le(Qd,{assertNoCrossWorkflowSubflowCycle:()=>AS,firstUnregisteredArchetype:()=>Zd,runWorkflow:()=>BU});import{createHash as zd,randomUUID as jU}from"node:crypto";import{existsSync as NU,readFileSync as Aa,readdirSync as AU,writeFileSync as RU}from"node:fs";import{basename as OU,join as LU,resolve as CU}from"node:path";import{pathToFileURL as MU}from"node:url";function Yd(t,e){return{source_uri:MU(CU(t)).href,source_sha256:zd("sha256").update(e).digest("hex")}}function xS(t){return zd("sha256").update(t).digest("hex")}async function UU(t){let e=await pr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:xS(e),remote:!0}}async function Na(t){if(Zt(t)){let n=await Vn(t),s=Aa(n,"utf8");return{definition:s,source_uri:t,source_sha256:xS(s),remote:!1}}let e=Nn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(mt(t))return UU(t);let r=Aa(t,"utf8");return{definition:r,...Yd(t,r),remote:!1}}function $S(t){return Ce(t.definition)}function jS(t){if(t.definition_schema_version!==3)return null;let e=Zd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function WU(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 BU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(FU),0;try{return r==="run"?await qU(n,e):await X(e,s=>{switch(r){case"load":return GU(n,e,s);case"author":return VU(n,e,s);case"list":return KU(n,e,s);case"sync":return zU(n,e,s);case"export":return YU(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof tt?w(e,s.message):fe(e,s)}}async function qU(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${ja}
|
|
2081
|
+
`),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return lr(e,r.error);if(r.positionals.length>1)return lr(e,ja);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 lr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Bt(c))return lr(e,ja);if(Zt(c))return vS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Nn(c,"remote workflow URLs");return m!==null?w(e,m):vS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return lr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return lr(e,ja);if(i!==void 0&&(o!==void 0||a!==void 0))return lr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=HU(i);if(m===null)return lr(e,`invalid --job: ${i}`);let p=bS({cwd:process.cwd(),io:e});try{let h=await fs({dal:p.dal,job_id:m,worker_id:Vd()});return Kd(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=NS(a,e);if(d===Ra)return 2;let f=Xd({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await fs({dal:f.dal,job_id:p.id,worker_id:Vd()});return Kd(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 vS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=NS(o,r);if(l===Ra)return 2;let c,u;try{c=await Na(t),u=$S(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=jS(u);if(d!==null)return w(r,d);if(c.remote&&!await JU(r,c,u,a))return 1;let f=Xd({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 fs({dal:f.dal,job_id:p.id,worker_id:Vd()});return Kd(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 lr(t,e){return t.stderr.write(`error: ${e}
|
|
2081
2082
|
`),2}function NS(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
|
|
2082
2083
|
`),Ra}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2083
|
-
`),Ra):r}function HU(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function
|
|
2084
|
+
`),Ra):r}function HU(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Vd(){return`cli-${process.pid}-${jU().slice(0,8)}`}function Kd(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?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2084
2085
|
`),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?W(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2085
2086
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2086
2087
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
@@ -2091,45 +2092,45 @@ ${yS(n)}`)}function yS(t){return t.map(e=>` workspace ${e.candidate.workspace_n
|
|
|
2091
2092
|
`),a}function XU(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 GU(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(Zt(s))try{o=await Na(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(mt(s))try{o=await Na(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Nn(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Na(s)}let i;try{i=$S(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?jS(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
|
|
2092
2093
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2093
2094
|
sha256: ${o.source_sha256}
|
|
2094
|
-
`),0}function
|
|
2095
|
+
`),0}function Zd(t){let e=ji();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function IS(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 AS(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 VU(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Aa(s,"utf8"),a;try{a=Ce(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=Zd(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{AS(u,IS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return IS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Yd(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:zd("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)
|
|
2095
2096
|
`),0}function KU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2096
2097
|
`)}${s.length>0?`
|
|
2097
|
-
`:""}`),0}function zU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Jo({swallow:!0});let s=
|
|
2098
|
+
`:""}`),0}function zU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Jo({swallow:!0});let s=rh(),o=[];try{o=NU(s)?AU(s).filter(c=>DU.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=LU(s,c),d=Aa(u,"utf8"),f;try{f=Ce(d)}catch(x){return w(e,`compile failed for ${c}: ${x instanceof Error?x.message:String(x)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:OU(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=Yd(u,d),S=r.getWorkflowByName(p);if(S!==null&&S.source_sha256===T.source_sha256){l+=1;continue}let v=S===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),v?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2098
2099
|
`),0}function YU(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:PU,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)}
|
|
2099
2100
|
`,c=N(n,"--out");return c!==void 0?(RU(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2100
|
-
`)):e.stdout.write(l),0}var DU,PU,FU,ja,Ra,
|
|
2101
|
+
`)):e.stdout.write(l),0}var DU,PU,FU,ja,Ra,ef=E(()=>{"use strict";mu();an();Go();_c();xe();Gd();Bs();ms();DU=[".compound.json",".lmctl"],PU="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",FU=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2101
2102
|
|
|
2102
2103
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2103
2104
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2104
2105
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2105
2106
|
remote https:// workflow after a trust prompt.
|
|
2106
|
-
`,ja="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ra=Symbol("inputs-error")});function
|
|
2107
|
-
`)}return 0}function aW(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Tt(n);if(De(s))return w(e,`workspace already exists: ${n} (${s})`);let o=N(r,"--docroot")??Da(n);cr(s,{recursive:!0}),cr(o,{recursive:!0});let i=Ft(n);cr(
|
|
2108
|
-
`),0}function lW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(n!==fr.default&&!De(Tt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Ds();return cr(
|
|
2107
|
+
`,ja="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ra=Symbol("inputs-error")});function tf(t,e){let r=ZU[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 ZU,RS=E(()=>{"use strict";ZU={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 FS={};le(FS,{initWorkspace:()=>DS,runWorkspace:()=>oW,setWorkspaceProvider:()=>PS});import{copyFileSync as QU,cpSync as eW,existsSync as De,mkdirSync as cr,readdirSync as nf,renameSync as tW,rmSync as Oa,statSync as La,writeFileSync as rW}from"node:fs";import{spawnSync as nW}from"node:child_process";import{homedir as OS}from"node:os";import{dirname as sf,join as Ms}from"node:path";async function oW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(sW),0;switch(r){case"list":return iW(n,e);case"create":return aW(n,e);case"use":return lW(n,e);case"show":return cW(n,e);case"delete":return uW(n,e);case"migrate":return dW(n,e);case"init":return DS(n,e);case"set-provider":return PS(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function CS(){let t=Ps(),e=[],r=new Set,n=fr.default,s=De(vn()),o=De(Tt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Ft(n):vn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(dr())){let i;try{i=nf(dr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=La(Tt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Ft(a),active:t===a,legacy:!1}),r.add(a))}}return e}function iW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=CS();if(M(r,"--json"))return W(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}
|
|
2108
|
+
`)}return 0}function aW(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Tt(n);if(De(s))return w(e,`workspace already exists: ${n} (${s})`);let o=N(r,"--docroot")??Da(n);cr(s,{recursive:!0}),cr(o,{recursive:!0});let i=Ft(n);cr(sf(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")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2109
|
+
`),0}function lW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(n!==fr.default&&!De(Tt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Ds();return cr(sf(s),{recursive:!0}),rW(s,`${n}
|
|
2109
2110
|
`),M(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2110
2111
|
`),0}function cW(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);let s=CS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?La(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")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2111
2112
|
`),0}function uW(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===fr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Ps()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=Tt(n);return De(o)?(Oa(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2112
|
-
`),0):w(e,`workspace not found: ${n}`)}function
|
|
2113
|
+
`),0):w(e,`workspace not found: ${n}`)}function rf(t,e,r){try{tW(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
|
|
2113
2114
|
`),La(t).isDirectory()?eW(t,e,{recursive:!0}):QU(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Oa(t,{recursive:!0,force:!0})}function dW(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Pa(),o=dr(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2114
2115
|
`);e.stdout.write(f?`migration complete
|
|
2115
2116
|
`:`${m??"nothing to migrate"}
|
|
2116
|
-
`)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=
|
|
2117
|
+
`)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=nf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return La(Ms(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Oa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))rf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(Ms(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);cr(o,{recursive:!0});for(let m of c)rf(Ms(s,m),Ms(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{nf(s).length===0&&(Oa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=yf(),d=Ds();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(rf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function MS(t,e){return nW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function pW(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 LS(t){return t==="~"?OS():t.startsWith("~/")?Ms(OS(),t.slice(2)):t}async function DS(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: ${Tn.join(", ")}.`].join(`
|
|
2117
2118
|
`)+`
|
|
2118
|
-
`),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??MS,a=Tn.map(k=>
|
|
2119
|
+
`),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??MS,a=Tn.map(k=>tf(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Tn.join("|")} first
|
|
2119
2120
|
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??pW,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2120
2121
|
`),2),f,m=N(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2121
2122
|
`),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),R=k.length===0?"default":k;if(qe(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
|
|
2122
2123
|
`)}}let p=Tt(f);if(De(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2123
2124
|
`),2;let h,g=N(s,"--basedir"),_=Da(f);if(g!==void 0)h=LS(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:LS(k)}let T={};for(let k of["provider1","provider2","provider3"]){let R=N(s,`--${k}`),C=fW[k],q=a.includes(C)?C:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
|
|
2124
2125
|
`),2;T[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let te=(await c(`${k} (${mW[k]}) [${q}]: `)).trim(),j=te.length===0?q:te;if(a.includes(j)){T[k]=j;break}e.stderr.write(`not an available provider: ${j} (available: ${a.join(", ")})
|
|
2125
|
-
`)}}cr(p,{recursive:!0}),cr(h,{recursive:!0});let S=Ft(f);cr(
|
|
2126
|
+
`)}}cr(p,{recursive:!0}),cr(h,{recursive:!0});let S=Ft(f);cr(sf(S),{recursive:!0});let v=pe({path:S});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",T.provider1),v.setConfig("workspace.provider2",T.provider2),v.setConfig("workspace.provider3",T.provider3)}finally{v.close()}let x={name:f,dir:p,db_path:S,basedir:h,providers:{...T}};return M(s,"--json")?W(e,x):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2126
2127
|
`),e.stdout.write(` basedir: ${h}
|
|
2127
2128
|
`),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
|
|
2128
2129
|
`),e.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
2129
2130
|
`)),0}async function PS(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: ${Tn.join(", ")}.`].join(`
|
|
2130
2131
|
`)+`
|
|
2131
2132
|
`),0;let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(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)
|
|
2132
|
-
`),2;let c=r.spawn??MS,u=Tn.map(p=>
|
|
2133
|
+
`),2;let c=r.spawn??MS,u=Tn.map(p=>tf(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 ${Tn.join("|")} first
|
|
2133
2134
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2134
2135
|
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ce()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=In()??fr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2135
2136
|
`),0}var sW,Tn,fW,mW,US=E(()=>{"use strict";Pe();RS();xe();Ve();sW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
|
|
@@ -2139,10 +2140,10 @@ legacy profile migration, and configured provider slots.
|
|
|
2139
2140
|
`;Tn=["claude","codex","gemini","qwen"],fW={provider1:"claude",provider2:"codex",provider3:"gemini"},mW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var qS={};le(qS,{runProject:()=>wW});import{existsSync as hW,statSync as _W}from"node:fs";import{join as BS}from"node:path";async function wW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(gW),0;try{return await X(e,s=>{switch(r){case"create":return xW(n,e,s);case"list":return $W(n,e,s);case"show":return vW(n,e,s);case"status":return IW(n,e,s);case"workflow":return yW(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function yW(t,e,r){let[n,...s]=t;switch(n){case"add":return EW(s,e,r);case"list":return bW(s,e,r);case"show":return SW(s,e,r);case"remove":return TW(s,e,r);case"enable":return WS(s,e,r,!0);case"disable":return WS(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function EW(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=N(n,"--condition")??null;if(l!==null)try{tr(l)}catch{return w(e,"invalid --condition JEXL")}let c=kW(N(n,"--params"));if(typeof c=="string")return w(e,c);let u=N(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2140
2141
|
`),0}function bW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2141
2142
|
`)}${i.length>0?`
|
|
2142
|
-
`:""}`),0}function SW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=
|
|
2143
|
-
`),0)}function TW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=
|
|
2144
|
-
`),0):w(e,`project workflow not found: ${s}`)}function WS(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=
|
|
2145
|
-
`),0)}function kW(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
|
|
2143
|
+
`:""}`),0}function SW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=of(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2144
|
+
`),0)}function TW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=of(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
|
|
2145
|
+
`),0):w(e,`project workflow not found: ${s}`)}function WS(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=of(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2146
|
+
`),0)}function kW(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 of(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function vW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2146
2147
|
`),0}function IW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2147
2148
|
`),0}function xW(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=N(n,"--owner"),i=N(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=N(n,"--local-path")??(l!==null?BS(l,u):void 0),f=N(n,"--workflow"),m=N(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=N(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every(x=>typeof x=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=N(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:jW(d)||Jn(d)?"folder":"db",S=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")?W(e,S):e.stdout.write(`created project ${S.name}
|
|
2148
2149
|
`),0}function $W(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
@@ -2151,7 +2152,7 @@ legacy profile migration, and configured provider slots.
|
|
|
2151
2152
|
|
|
2152
2153
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2153
2154
|
per-project workflow bindings and routing conditions.
|
|
2154
|
-
`});import{createHash as NW,randomBytes as AW}from"node:crypto";import{readFile as RW}from"node:fs/promises";function JS(t=new Date,e=AW(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 OW(t){return NW("sha256").update(t).digest("hex")}async function XS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await RW(n);return{path:r,sha256:OW(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function GS(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
|
|
2155
|
+
`});import{createHash as NW,randomBytes as AW}from"node:crypto";import{readFile as RW}from"node:fs/promises";function JS(t=new Date,e=AW(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 OW(t){return NW("sha256").update(t).digest("hex")}async function XS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await RW(n);return{path:r,sha256:OW(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function GS(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var af=E(()=>{"use strict"});import{spawnSync as VS}from"node:child_process";import{mkdir as lf,writeFile as KS,readFile as LW,rm as zS}from"node:fs/promises";import{tmpdir as CW}from"node:os";import{dirname as YS,join as cf}from"node:path";async function ZS(t){let e=t.stagingDir??cf(CW(),`lmctl-diag-${t.ticketId}`),r=cf(e,`diagnostic-${t.ticketId}`);await lf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=cf(r,d);if(await lf(YS(m),{recursive:!0}),typeof f=="string")await KS(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await KS(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2155
2156
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2156
2157
|
`:`${d.pid}
|
|
2157
2158
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2169,29 +2170,29 @@ per-project workflow bindings and routing conditions.
|
|
|
2169
2170
|
`:`# source=${f}
|
|
2170
2171
|
# tail_lines=${d.tail_lines}
|
|
2171
2172
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2172
|
-
`:""}`)}if(await s("README.md",MW(t)),t.sanitized)for(let d of n){let f=await LW(d.absPath);try{
|
|
2173
|
-
`)}var QS=E(()=>{"use strict";
|
|
2173
|
+
`:""}`)}if(await s("README.md",MW(t)),t.sanitized)for(let d of n){let f=await LW(d.absPath);try{kf(d.bundlePath,f.toString("utf8"))}catch(m){throw await zS(e,{recursive:!0,force:!0}),m instanceof mr,m}}let i=await XS(n),a=GS({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 lf(YS(t.outputPath),{recursive:!0});let l=VS("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=VS("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await zS(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function MW(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(`
|
|
2174
|
+
`)}var QS=E(()=>{"use strict";af();Fs()});import{spawnSync as DW}from"node:child_process";import{stat as PW}from"node:fs/promises";async function eT(t){try{if(!(await PW(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 FW(t);case"hq":return UW(t)}}function FW(t){let r=DW("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 UW(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 tT=E(()=>{"use strict"});var nT={};le(nT,{parseDiagnoseArgs:()=>rT,runDiagnose:()=>qW});import{tmpdir as WW}from"node:os";import{join as BW}from"node:path";async function qW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${XW()}
|
|
2174
2175
|
`),0;let r=rT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2175
2176
|
`),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)
|
|
2176
2177
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2177
|
-
`),2;let n=JS(),s=r.outputPath??JW(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await X(e,async i=>{let a=await
|
|
2178
|
+
`),2;let n=JS(),s=r.outputPath??JW(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await X(e,async i=>{let a=await If({dal:i,include:r.include,dbPath:ce(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await ZS({ticketId:n,data:a,outputPath:s,lmctlNextVersion:nt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof mr)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2178
2179
|
`),2;throw d}let c=await eT({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)}
|
|
2179
2180
|
`):(e.stdout.write(`ticket: ${n}
|
|
2180
2181
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2181
2182
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2182
2183
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2183
2184
|
`),1}}function rT(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(!HW(o))return`unknown section: ${o} (expected one of ${Us.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 HW(t){return Us.includes(t)}function JW(t){return BW(WW(),`lmctl-diag-${t}.tar.gz`)}function XW(){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(`
|
|
2184
|
-
`)}var sT=E(()=>{"use strict";jn();QS();
|
|
2185
|
+
`)}var sT=E(()=>{"use strict";jn();QS();af();Fs();tT();Ve();xe()});var dT={};le(dT,{ATTENTION_STATES:()=>df,DAEMON_INTERVAL_FAST_MS:()=>uf,REQUIRED_TEAM_ALIASES:()=>iT,chooseDiagnoses:()=>cT,collectEvidence:()=>lT,diagnose:()=>aT,renderReport:()=>uT,runDiagnosePrompt:()=>KW});function aT(t,e){let r=lT(t,e),n=cT(r);return uT(r,n)}function lT(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:hs(),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=VW(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=iT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function cT(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>uf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${uf}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=>df.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 uT(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: ${GW(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=>df.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(`
|
|
2185
2186
|
`)+`
|
|
2186
2187
|
`}function GW(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 VW(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function KW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${oT()}
|
|
2187
2188
|
`),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2188
2189
|
`),e.stderr.write(`${oT()}
|
|
2189
2190
|
`),2;let n=r[0];try{return await X(e,s=>(e.stdout.write(aT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2190
2191
|
`),1}}function oT(){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(`
|
|
2191
|
-
`)}var iT,
|
|
2192
|
+
`)}var iT,uf,df,fT=E(()=>{"use strict";Wu();xe();iT=["Coder","Reviewer1","Polisher"],uf=3e4,df=new Set(["attention_needed","paused","escalation"])});var _T={};le(_T,{appendIntent:()=>hT,resolveIntentLogPath:()=>pT,runStatus:()=>sB});import{appendFileSync as zW,mkdirSync as YW}from"node:fs";import{homedir as ZW}from"node:os";import{dirname as QW,join as eB}from"node:path";function pT(){return process.env.LMCTL_INTENT_LOG??eB(ZW(),".lmctl","recent-intents.log")}function hT(t){try{let e=pT();YW(QW(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});zW(e,`${r}
|
|
2192
2193
|
`)}catch{}}async function sB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(nB),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=N(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):X(e,i=>{let a=oB(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.
|
|
2193
2194
|
`),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.
|
|
2194
|
-
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=iB(i,l,a.source);return o?W(e,c):e.stdout.write(dB(c)),hT({verb:"status",args:t}),0})}function oB(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=
|
|
2195
|
+
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=iB(i,l,a.source);return o?W(e,c):e.stdout.write(dB(c)),hT({verb:"status",args:t}),0})}function oB(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=Jd(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function iB(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=aB(t,e.id,rB),a=lB(t,e.id),l=cB(t,e.id,tB);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:uB(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 aB(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 lB(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 cB(t,e,r){return t.db.prepare(`
|
|
2195
2196
|
SELECT r.*, w.name AS workflow_name
|
|
2196
2197
|
FROM run r
|
|
2197
2198
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2200,15 +2201,15 @@ per-project workflow bindings and routing conditions.
|
|
|
2200
2201
|
ORDER BY r.id DESC
|
|
2201
2202
|
LIMIT ?
|
|
2202
2203
|
`).all(e,r)}function uB(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 mT(o,100)}}}catch{}return mT(t,100)}function mT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function dB(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(`
|
|
2203
|
-
`)}var tB,rB,nB,gT=E(()=>{"use strict";xe();
|
|
2204
|
+
`)}var tB,rB,nB,gT=E(()=>{"use strict";xe();Gd();tB=5,rB=10,nB=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2204
2205
|
|
|
2205
2206
|
Show the current project context, active run, unacked attentions, and recent
|
|
2206
2207
|
runs. Defaults to resolving the project from the current working directory;
|
|
2207
2208
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2208
2209
|
`});Ve();jn();Oe();import{pathToFileURL as fB}from"node:url";Bs();jn();import{mkdirSync as ck,readFileSync as uk,renameSync as dk,writeFileSync as fk}from"node:fs";import{homedir as mk}from"node:os";import{dirname as pk,join as hk}from"node:path";var _k="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",gk=60*60*1e3,wk=1500;function yk(){let t=process.env.HOME??mk();return hk(t,".lmctl",".update-check.json")}function Ek(t){return t.isTTY===!0}function bk(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 qa(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Ek(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Sk(t,e){try{let r=JSON.parse(uk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<gk)return r.latest}catch{}return null}function Tk(t,e){ck(pk(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;fk(r,`${JSON.stringify(e)}
|
|
2209
|
-
`,"utf8"),dk(r,t)}async function kk(){let t=await pr(_k,{description:"lmctl npm metadata",timeoutMs:wk}),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
|
|
2210
|
-
`)}catch{}}var
|
|
2211
|
-
`,
|
|
2210
|
+
`,"utf8"),dk(r,t)}async function kk(){let t=await pr(_k,{description:"lmctl npm metadata",timeoutMs:wk}),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 Of(t,e=[],r={}){try{if(qa(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??yk();if(Sk(s,n)!==null)return;let i=await(r.fetchLatest??kk)();try{Tk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??nt();bk(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2211
|
+
`)}catch{}}var pf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2212
|
+
`,ff=`${pf}
|
|
2212
2213
|
Setup & status:
|
|
2213
2214
|
status Show current project context, active run, attentions, and recent runs.
|
|
2214
2215
|
diagnose Collect a sanitized troubleshooting bundle, with optional upload.
|
|
@@ -2253,14 +2254,14 @@ Global flags:
|
|
|
2253
2254
|
chain and context.
|
|
2254
2255
|
|
|
2255
2256
|
Run 'lmctl help <command>' for command-specific help.
|
|
2256
|
-
`,wT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","info","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function
|
|
2257
|
-
${
|
|
2257
|
+
`,wT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","info","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function mf(t,e){return t.stderr.write(`error: ${e}
|
|
2258
|
+
${pf}Run 'lmctl help' for usage.
|
|
2258
2259
|
`),2}function ET(t,e){return t.stderr.write(`error: unknown command: ${e}
|
|
2259
|
-
${
|
|
2260
|
-
`),1}async function mB(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
|
|
2261
|
-
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(
|
|
2260
|
+
${pf}Run 'lmctl help' for usage.
|
|
2261
|
+
`),1}async function mB(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 mf(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 mf(e,"missing value for --workspace");if(!qe(l))return mf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Af();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${nt()}
|
|
2262
|
+
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(ff),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(ff),0):wT.has(i)?yT(i,[...a,"--help"],e):ET(e,i)}wf(ce(),e.stderr),Ef(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(ff),0;Re()&&e.stderr.write(`[debug] lmctl ${nt()} | node ${process.version} | cmd ${s} ${o.join(" ")}
|
|
2262
2263
|
[debug] cwd ${process.cwd()} | db ${ce()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
|
|
2263
|
-
`);try{let i=await yT(s,o,e);return wT.has(s)&&!qa(r,e)&&await
|
|
2264
|
+
`);try{let i=await yT(s,o,e);return wT.has(s)&&!qa(r,e)&&await Of(e,r),i}catch(i){return pB(i,s,o,e)}}function pB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Re())return n.stderr.write(`error: ${s.message}
|
|
2264
2265
|
`),n.stderr.write(`(re-run with --debug for the full stack trace and context)
|
|
2265
2266
|
`),1;n.stderr.write(`error: ${s.message}
|
|
2266
2267
|
`),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
|
|
@@ -2268,7 +2269,7 @@ ${mf}Run 'lmctl help' for usage.
|
|
|
2268
2269
|
`),s.stack&&n.stderr.write(`${s.stack}
|
|
2269
2270
|
`);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}
|
|
2270
2271
|
`),a.stack&&n.stderr.write(`${a.stack}
|
|
2271
|
-
`),o=a.cause,i+=1}return 1}async function yT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(oc(),
|
|
2272
|
+
`),o=a.cause,i+=1}return 1}async function yT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(oc(),Jp));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>($c(),Ih));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(LE(),OE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(ME(),CE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(mb(),fb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(bb(),Eb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Tb(),Sb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Ib(),vb));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Rb(),Ab));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(Lb(),Ob));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ls(),Os));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ls(),Os));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ls(),Os));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ls(),Os));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(lS(),aS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(fS(),dS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(_S(),hS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(ef(),Qd));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(ef(),Qd));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(US(),FS));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(HS(),qS));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(sT(),nT));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(fT(),dT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(gT(),_T));return n(e,r)}case"db":return hB(e,r);default:return ET(r,t)}}function hB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2272
2273
|
|
|
2273
2274
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2274
2275
|
restore from backup for rollback and use normal migrations for forward changes.
|