@lmctl-ai/lmctl 0.1.217 → 0.1.219
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/cli/index.js +175 -174
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{for(var r in e)CN(t,r,{get:e[r],enumerable:!0})};var tp={};he(tp,{defaultDbPath:()=>Qm,describeStateLocation:()=>fs,isSlowWslMount:()=>ep,lmctlNextHome:()=>Ri,resolveDbPath:()=>ne,warnIfSlowDbPath:()=>Dl});import{platform as zm}from"node:os";import{homedir as $N}from"node:os";import{join as Zm}from"node:path";function Ri(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Zm($N(),MN)}function Qm(){return Zm(Ri(),DN)}function ne(t){return t!==void 0&&t.length>0?t:process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?process.env.LMCTL_DB:Qm()}function fs(t){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function ep(t,e=zm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Dl(t,e=process.stderr,r=zm()){ep(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
2
|
`)}var MN,DN,ze=T(()=>{"use strict";MN=".lmctl",DN="state.db"});function UN(t){for(let e of FN)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 WN(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function HN(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 ms(t){let e=t;for(let{re:r,replacement:n}of PN)e=e.replace(r,n);return e=e.replace(qN,r=>!HN(r)||UN(r)?r:rp),e=e.replace(BN,r=>WN(r)?r:rp),e}function ps(t){return t.split(`
|
|
3
3
|
`).map(e=>ms(e)).join(`
|
|
4
|
-
`)}function sp(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:pt}:{key:t,value:ms(e)}}function
|
|
4
|
+
`)}function sp(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:pt}:{key:t,value:ms(e)}}function yr(t){if(typeof t=="string")return ms(t);if(Array.isArray(t))return t.map(e=>yr(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"?pt:yr(n):e[r]=yr(n)}return e}return t}function ip(t,e){for(let{name:r,re:n}of XN){let s=e.match(n);if(s!==null&&!s[0].includes(pt))throw new Hr(t,r)}}var pt,jN,rp,np,PN,FN,qN,BN,XN,Hr,Li=T(()=>{"use strict";pt="[REDACTED]",jN="[REDACTED_EMAIL]",rp="[REDACTED_IP]",np="[USER]",PN=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${pt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${pt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${pt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:pt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:pt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:pt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:pt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${pt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${np}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${np}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:jN}],FN=["127.","10.","192.168.","0.0.0.0"];qN=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,BN=/\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;XN=[{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"'`]+/}],Hr=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 jl}from"node:child_process";import{readFileSync as JN}from"node:fs";import{readFile as Fl,stat as op}from"node:fs/promises";import{homedir as GN}from"node:os";import{join as KN}from"node:path";import{fileURLToPath as VN}from"node:url";function xt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(JN(VN(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function ap(t){let e=new Set(t.include??Oi),r={};return e.has("serve")&&(r.serve=await zN(t)),e.has("db")&&(r.db=ZN(t)),e.has("runs")&&(r.runs=QN(t)),e.has("jobs")&&(r.jobs=eA(t)),e.has("attentions")&&(r.attentions=tA(t)),e.has("env")&&(r.env=await rA(t)),e.has("intents")&&(r.intents=await sA(t)),r}async function zN(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let c=(await Fl(e,"utf8")).trim(),u=Number.parseInt(c,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,d=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await Fl(r,"utf8")).split(`
|
|
5
5
|
`),f=u.slice(Math.max(0,u.length-n));d=f.length,a=ps(f.join(`
|
|
6
6
|
`))}catch(c){l=`serve log unreadable: ${c instanceof Error?c.message:String(c)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:d,log_tail:a,log_note:l}}function ZN(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
|
|
7
7
|
`)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function QN(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=e.query(`SELECT ${Pl} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${Pl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Pl} FROM run
|
|
8
8
|
WHERE terminal_state IS NULL
|
|
9
9
|
AND started_at < ?
|
|
10
|
-
ORDER BY started_at ASC LIMIT 50`,s);return{last_50:
|
|
11
|
-
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:
|
|
10
|
+
ORDER BY started_at ASC LIMIT 50`,s);return{last_50:yr(i),stale:yr(a),paused:yr(o)}}function eA(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:o,c:a}of r)o==="queued"?n.pending+=a:o==="running"?n.running+=a:o==="done"||o==="succeeded"?n.done+=a:o==="failed"?n.failed+=a:o==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),i=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(o=>o.id),running_ids:i.map(o=>o.id)}}function tA(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
|
|
11
|
+
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:yr(r)}}async function rA(t){let e=xt(),r=process.version,n=jl("uname",["-a"],{encoding:"utf8"}),s=ps((n.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await op(o);let c=jl("du",["-sh",o],{encoding:"utf8"});c.status===0&&i.push(c.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await op(a);let c=jl("du",["-sh",a],{encoding:"utf8"});c.status===0&&i.push(c.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":ps(i.join(`
|
|
12
12
|
`)),d=[];for(let c of YN){let u=process.env[c];if(u===void 0){d.push({key:c,value:"(unset)"});continue}d.push(sp(c,u))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:d}}function nA(){return process.env.LMCTL_INTENT_LOG??KN(GN(),".lmctl","recent-intents.log")}async function sA(t){let e=t.intentLog??nA(),r=t.intentLogTailLines??500;try{let s=(await Fl(e,"utf8")).split(`
|
|
13
13
|
`).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:i.length,tail:ps(i.join(`
|
|
14
|
-
`)),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 Oi,YN,Pl,_s=T(()=>{"use strict";Li();Oi=["serve","db","runs","jobs","attentions","env","intents"];YN=["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"];Pl=["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 cp,appendFileSync as iA,mkdirSync as oA,existsSync as NG,readdirSync as AG,unlinkSync as xG}from"node:fs";import{join as $i,dirname as aA}from"node:path";import{homedir as lA}from"node:os";function Ul(){return $i(lA(),".lmctl")}function up(){
|
|
15
|
-
`)}catch{}}function uA(){if(!Ci){let e=cA().slice(0,13).replace("T","-");Ci=$i(Ul(),`debug-${e}.log`)}oA(aA(Ci),{recursive:!0})}function
|
|
16
|
-
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function pA(){try{let t=cp($i(Ul(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var
|
|
14
|
+
`)),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 Oi,YN,Pl,_s=T(()=>{"use strict";Li();Oi=["serve","db","runs","jobs","attentions","env","intents"];YN=["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"];Pl=["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 cp,appendFileSync as iA,mkdirSync as oA,existsSync as NG,readdirSync as AG,unlinkSync as xG}from"node:fs";import{join as $i,dirname as aA}from"node:path";import{homedir as lA}from"node:os";function Ul(){return $i(lA(),".lmctl")}function up(){pn=!0,process.env.LMCTL_DEBUG="1"}function fp(){return{cliDebug:pn,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function mp(t){pn=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(pn||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-dp>=dA&&(lp=fA(),dp=t),lp}function pp(){return pn||process.env.LMCTL_DEBUG==="1"}function cA(){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 De(t,e){if(e?.verbose){if(!pn)return}else if(!e?.always&&!ue())return;try{uA();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};iA(Ci,JSON.stringify(r)+`
|
|
15
|
+
`)}catch{}}function uA(){if(!Ci){let e=cA().slice(0,13).replace("T","-");Ci=$i(Ul(),`debug-${e}.log`)}oA(aA(Ci),{recursive:!0})}function je(...t){De({event:"legacy",msg:t.join(" ")})}function Ze(...t){De({event:"legacy",msg:t.join(" ")},{verbose:!0})}function M(t){De(t,{always:!0})}function fA(){return mA()||pA()}function mA(){try{let t=cp($i(Ul(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
16
|
+
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function pA(){try{let t=cp($i(Ul(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var pn,lp,dp,dA,Ci,pe=T(()=>{"use strict";pn=!1,lp=!1,dp=0,dA=5e3;Ci=null});import{existsSync as CA}from"node:fs";import{createRequire as $A}from"node:module";function MA(){return ql===null&&(ql=$A(import.meta.url)("node:sqlite").DatabaseSync),ql}function Bl(t){return t.length===1&&DA(t[0])?[t[0]]:t}function DA(t){if(!Jl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Jl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ql,Hl,Ep,Xl,wp=T(()=>{"use strict";ql=null;Hl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!CA(e))throw new Error("unable to open database file");this.name=e,this.handle=new(MA())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Xl(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)}}},Ep=Hl,Xl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Bl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Bl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Bl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Jl(e)?Object.values(e):Jl(e)?{...e}:e}}});var xp={};he(xp,{CURRENT_USER_VERSION:()=>Np,migrate:()=>Mi});import{existsSync as jA,mkdirSync as PA,readFileSync as vp}from"node:fs";import{homedir as FA}from"node:os";import{dirname as bp,join as UA,resolve as Sp}from"node:path";import{fileURLToPath as WA,pathToFileURL as qA}from"node:url";function Mi(t){t.dbPath!==":memory:"&&PA(bp(t.dbPath),{recursive:!0});let e=new Ep(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Ap(e);return r===0&&(e.exec(vp(Ip,"utf8")),e.pragma(`user_version = ${Np}`)),HA(e,r),e}function HA(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
|
|
17
17
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
18
18
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
19
19
|
team_name TEXT NOT NULL,
|
|
@@ -1037,21 +1037,21 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1037
1037
|
`),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function gs(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(Mp,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${Mp}`}var Mp,Di=T(()=>{"use strict";Mp=`
|
|
1038
1038
|
...[truncated]`});function ws(t,e){return JSON.stringify([t,e])}function jp(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var ys,Es,Pp=T(()=>{"use strict";ys="terminal_lock",Es="member"});import{readFileSync as Fp}from"node:fs";function He(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function Kl(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=JA();if(e===null)return null;try{let r=Fp(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(")");if(n<0)return null;let i=r.slice(n+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function JA(){try{let t=Fp("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function GA(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function Up(t,e){if(!He(t))return"gone";if(!GA(e))return"unverified";let r=Kl(t);return r===null?"unverified":r===e?"same":"different"}var Jr=T(()=>{"use strict"});import{createHash as KA}from"node:crypto";function VA(t,e,r){return KA("sha256").update(`${t}\0${e}\0${r}`).digest("hex")}function Ie(t,e,r){let n=VA(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
|
|
1039
1039
|
VALUES (?, ?, ?, ?, ?)
|
|
1040
|
-
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(n,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(n).seq,event_id:n};let l=Number(a.lastInsertRowid);return r(l),{appended:!0,seq:l,event_id:n}})()}var ji=T(()=>{"use strict"});import{hostname as
|
|
1040
|
+
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(n,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(n).seq,event_id:n};let l=Number(a.lastInsertRowid);return r(l),{appended:!0,seq:l,event_id:n}})()}var ji=T(()=>{"use strict"});import{hostname as _n}from"node:os";function hn(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return Vl;let r=Number(e);return!Number.isFinite(r)||r<=0?Vl:Math.max(1,Math.trunc(r))}function Er(t,e={}){let r=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(n=>{n||clearInterval(r)}).catch(n=>e.onError?.(n))},e.intervalMs??Vl);return r.unref?.(),r}function Rt(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).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},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let d=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,leaseId:a.lease_id,previous:i,reclaimReason:d}}if(!Fi(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid},reclaim_reason:"dead-pid"});return l.acquired?{acquired:!0,lease:l.current??s,leaseId:l.lease_id,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Pi(t){return t.status!=="running"?null:t.holder_host===_n()&&t.holder_pid!==null&&t.holder_pid>0?He(t.holder_pid)?"live":"dead":"unknown"}function _t(t,e,r){let n,s=t.getTerminalLock(e,r);if(s!==null){if(YA(s))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:s};n??={source:"terminal-lock",holder_pid:s.holder_pid,holder_host:s.holder_host,reason:s.holder_host===_n()?"dead-pid":"stale"}}let i=zA(t,e,r);if(i!==null){if(ZA(i))return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:i};n??={source:"terminal-invocation",holder_pid:i.holder_pid,holder_host:i.holder_host,reason:i.holder_pid!==null&&(i.holder_host===null||i.holder_host===_n())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,r);if(o!==null){let a=new Date(Date.now()-gn()).toISOString();if(!Fi(o,a))return{busy:!0,reason:"in-flight",inFlight:o};n??={source:"in-flight",holder_pid:o.holder_pid,holder_host:o.holder_pid===null?null:_n(),reason:o.holder_pid===null?"stale":"dead-pid"}}return n===void 0?{busy:!1}:{busy:!1,reclaimable:n}}function YA(t){if(t.holder_host===_n())return He(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=ex():!1}function zA(t,e,r){return t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
|
|
1041
1041
|
FROM tracked_invocation
|
|
1042
1042
|
WHERE target_teamfile = ?
|
|
1043
1043
|
AND target_alias = ?
|
|
1044
1044
|
AND status = 'running'
|
|
1045
1045
|
AND launch_source = 'terminal'
|
|
1046
1046
|
ORDER BY started_at DESC, id DESC
|
|
1047
|
-
LIMIT 1`,e,r)[0]??null}function ZA(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===
|
|
1047
|
+
LIMIT 1`,e,r)[0]??null}function ZA(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===_n())?He(t.holder_pid):QA(t)}function QA(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=gn():!1}function Fi(t,e){return t.holder_pid===null?t.started_at<e:!He(t.holder_pid)}function gn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Wp;let r=Number(e);return!Number.isFinite(r)||r<=0?Wp:r}function ex(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return qp;let r=Number(e);return!Number.isFinite(r)||r<=0?qp:r}var Wp,qp,Vl,Lt=T(()=>{"use strict";Jr();Wp=8*60*60*1e3,qp=12e4,Vl=3e4});import{randomUUID as Hp}from"node:crypto";import{hostname as tx}from"node:os";function Qt(t,e){return{teamfile:t,alias:e}}function Ui(t,e,r={}){return{teamfile:t,alias:e,...r.provider===void 0||r.provider===null?{}:{provider:r.provider},...r.sessionId===void 0||r.sessionId===null?{}:{session_id:r.sessionId}}}function Wi(t,e){return t===null?null:Qt(t,e??"")}function We(t){return`msg_mbx_${t}`}function Tn(t){return`inv_${t}`}function En(t,e,r){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
|
|
1048
1048
|
holder_pid, holder_host, started_at, terminal_lock_id,
|
|
1049
1049
|
terminal_invocation_id, currently_handling_message_id,
|
|
1050
1050
|
currently_handling_since, last_seq
|
|
1051
1051
|
FROM agent_state
|
|
1052
1052
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,r)??null}function nx(t,e,r){if(e===null||r===null)return null;let n=t.prepare(`SELECT currently_handling_message_id, currently_handling_since
|
|
1053
1053
|
FROM agent_state
|
|
1054
|
-
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,r);if(n?.currently_handling_message_id===null||n?.currently_handling_message_id===void 0||n.currently_handling_since===null)return null;let s=Date.parse(n.currently_handling_since);return!Number.isFinite(s)||Date.now()-s>rx?null:n.currently_handling_message_id}function Xp(t,e,r){let n=nx(t,e,r);return n===null?{}:{causation:{request_message_id:n}}}function
|
|
1054
|
+
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,r);if(n?.currently_handling_message_id===null||n?.currently_handling_message_id===void 0||n.currently_handling_since===null)return null;let s=Date.parse(n.currently_handling_since);return!Number.isFinite(s)||Date.now()-s>rx?null:n.currently_handling_message_id}function Xp(t,e,r){let n=nx(t,e,r);return n===null?{}:{causation:{request_message_id:n}}}function wn(t,e,r,n,s=new Date().toISOString()){t.prepare(`INSERT INTO agent_state
|
|
1055
1055
|
(receiver_teamfile, receiver_alias, currently_handling_message_id,
|
|
1056
1056
|
currently_handling_since, last_seq)
|
|
1057
1057
|
VALUES (?, ?, ?, ?, 0)
|
|
@@ -1061,7 +1061,7 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1061
1061
|
SET currently_handling_message_id = NULL,
|
|
1062
1062
|
currently_handling_since = NULL
|
|
1063
1063
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1064
|
-
AND currently_handling_message_id = ?`).run(e,r,n).changes===1}function sx(t,e){let r=e??new Date(Date.now()-
|
|
1064
|
+
AND currently_handling_message_id = ?`).run(e,r,n).changes===1}function sx(t,e){let r=e??new Date(Date.now()-gn()).toISOString();return Fi({holder_pid:t.holder_pid,started_at:t.started_at??""},r)}function ix(t,e,r){return e==="force"||e==="session-idle"?e:r?"force":t.holder_pid!==null&&!He(t.holder_pid)?"dead-pid":"stale"}function ox(t){return{sender:Wi(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function yn(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
|
|
1065
1065
|
FROM message_pending WHERE message_id = ?`).get(e)??null}function er(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Yl(t,e={},r={}){return{message_id:We(t.id),message_type:t.message_type,sender:t.sender_teamfile===null?null:Ui(t.sender_teamfile,t.sender_alias??"",r),receiver:Ui(t.receiver_teamfile,t.receiver_alias,e),root_teamfile:t.root_teamfile,legacy:{table:"agent_mailbox",id:t.id}}}function zl(t,e,r={},n={},s=[]){let i=We(e.id),o=e.message_type==="response",a=o&&e.request_mailbox_id!==null?ax(t,e.request_mailbox_id):{},l={provider:a.provider??r.provider,sessionId:a.sessionId??r.sessionId},d=e.request_mailbox_id===null?null:We(e.request_mailbox_id),c=Yl(e,l,n);Ie(t,{stream_id:i,event_type:o?"RESPONSE_CREATE":"CREATE",observedLastSeq:0,ts:e.created_at,payload:{...c,content:e.payload,...o?{}:Xp(t,e.sender_teamfile,e.sender_alias),...o?{in_reply_to_message_id:d,...s.length>0?{batched_request_message_ids:s}:{}}:{}}},()=>{}),Ie(t,{stream_id:i,event_type:o?"RESPONSE_ENQUEUE":"ENQUEUE",observedLastSeq:0,ts:e.created_at,payload:{...c,...o?{in_reply_to_message_id:d}:{}}},u=>{t.prepare(`INSERT INTO message_pending
|
|
1066
1066
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
1067
1067
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
@@ -1073,23 +1073,23 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1073
1073
|
WHERE stream_id = ? AND event_type = 'CREATE'
|
|
1074
1074
|
ORDER BY seq ASC
|
|
1075
1075
|
LIMIT 1
|
|
1076
|
-
`).get(We(e));return{provider:typeof r?.provider=="string"?r.provider:null,sessionId:typeof r?.session_id=="string"?r.session_id:null}}function Zl(t,e,r){let n=`msg_tcl_${e}`,s=Wi(r.sender_teamfile,r.sender_alias),i=Ui(r.receiver_teamfile,r.receiver_alias,{provider:r.receiver_provider,sessionId:r.receiver_session_id}),o={message_id:n,message_type:"request",sender:s,receiver:i,root_teamfile:r.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Ie(t,{stream_id:n,event_type:"CREATE",observedLastSeq:0,ts:r.created_at,payload:{...o,content:r.message,provider_prompt:r.provider_prompt??r.message,origin:r.origin,...Xp(t,r.sender_teamfile,r.sender_alias)}},()=>{
|
|
1076
|
+
`).get(We(e));return{provider:typeof r?.provider=="string"?r.provider:null,sessionId:typeof r?.session_id=="string"?r.session_id:null}}function Zl(t,e,r){let n=`msg_tcl_${e}`,s=Wi(r.sender_teamfile,r.sender_alias),i=Ui(r.receiver_teamfile,r.receiver_alias,{provider:r.receiver_provider,sessionId:r.receiver_session_id}),o={message_id:n,message_type:"request",sender:s,receiver:i,root_teamfile:r.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Ie(t,{stream_id:n,event_type:"CREATE",observedLastSeq:0,ts:r.created_at,payload:{...o,content:r.message,provider_prompt:r.provider_prompt??r.message,origin:r.origin,...Xp(t,r.sender_teamfile,r.sender_alias)}},()=>{wn(t,r.receiver_teamfile,r.receiver_alias,n,r.created_at)}),n}function Ql(t,e,r){let n=`msg_tcl_${e}`,s={message_id:n,message_type:"request",sender:Wi(r.sender_teamfile,r.sender_alias),receiver:Ui(r.receiver_teamfile,r.receiver_alias,{provider:r.receiver_provider,sessionId:r.receiver_session_id}),root_teamfile:r.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Ie(t,{stream_id:n,event_type:"HANDLED",observedLastSeq:1,ts:r.created_at,payload:{...s,outcome:r.status,receipt:r.response,error:r.error_detail,truncated:r.truncated===1}},()=>{qi(t,r.receiver_teamfile,r.receiver_alias,n)}),n}function Jp(t,e,r,n,s){let i=We(e.id),o=yn(t,i);if(o===null||o.lifecycle_state!=="queued")return;let a=`delivery_${Hp()}`;Ie(t,{stream_id:i,event_type:"DELIVER_CLAIM",observedLastSeq:o.last_seq,ts:r,payload:{...Yl(e),lease_id:a,pid:n,host:s}},l=>{let d=t.prepare(`UPDATE message_pending
|
|
1077
1077
|
SET lifecycle_state = 'claimed',
|
|
1078
1078
|
delivery_lease_id = ?,
|
|
1079
1079
|
delivery_holder_pid = ?,
|
|
1080
1080
|
last_seq = ?
|
|
1081
|
-
WHERE message_id = ? AND lifecycle_state = 'queued' AND last_seq = ?`).run(a,n,l,i,o.last_seq);er(d.changes,"DELIVER_CLAIM")})}function ed(t,e,r,n=new Date().toISOString()){let s=We(e.id),i=
|
|
1081
|
+
WHERE message_id = ? AND lifecycle_state = 'queued' AND last_seq = ?`).run(a,n,l,i,o.last_seq);er(d.changes,"DELIVER_CLAIM")})}function ed(t,e,r,n=new Date().toISOString()){let s=We(e.id),i=yn(t,s);if(i===null||i.lifecycle_state!=="claimed")return;let o={message_id:s,message_type:e.message_type,sender:Wi(e.sender_teamfile,e.sender_alias),receiver:Qt(e.receiver_teamfile,e.receiver_alias),root_teamfile:e.root_teamfile,legacy:{table:"agent_mailbox",id:e.id}};Ie(t,{stream_id:s,event_type:"DELIVER_CLAIM_RELEASE",observedLastSeq:i.last_seq,ts:n,payload:{...o,reason:r,delivery_lease_id:i.delivery_lease_id,previous_holder:{pid:e.delivery_holder_pid,host:e.delivery_holder_host}}},a=>{let l=t.prepare(`UPDATE message_pending
|
|
1082
1082
|
SET lifecycle_state = 'queued',
|
|
1083
1083
|
delivery_lease_id = NULL,
|
|
1084
1084
|
delivery_holder_pid = NULL,
|
|
1085
1085
|
last_seq = ?
|
|
1086
1086
|
WHERE message_id = ? AND lifecycle_state = 'claimed'
|
|
1087
|
-
AND delivery_lease_id IS ? AND last_seq = ?`).run(a,s,i.delivery_lease_id,i.last_seq);er(l.changes,"DELIVER_CLAIM_RELEASE")})}function Ts(t,e,r,n,s=null,i=null){let o=We(e.id),a=
|
|
1087
|
+
AND delivery_lease_id IS ? AND last_seq = ?`).run(a,s,i.delivery_lease_id,i.last_seq);er(l.changes,"DELIVER_CLAIM_RELEASE")})}function Ts(t,e,r,n,s=null,i=null){let o=We(e.id),a=yn(t,o);a!==null&&Ie(t,{stream_id:o,event_type:e.message_type==="response"?"RESPONSE_DELIVERED":"DELIVERED",observedLastSeq:a.last_seq,ts:n,payload:{...Yl(e),receipt:r,...s===null?{}:{batch_response_message_id:s}}},()=>{let l=t.prepare("DELETE FROM message_pending WHERE message_id = ? AND last_seq = ?").run(o,a.last_seq);er(l.changes,"DELIVERED"),i?.action==="set"?wn(t,e.receiver_teamfile,e.receiver_alias,i.messageId,n):i?.action==="clear"&&qi(t,e.receiver_teamfile,e.receiver_alias,i.messageId)})}function lx(t){return{sender:Qt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function Gp(t,e,r,n){let s=t.prepare(`UPDATE agent_state
|
|
1088
1088
|
SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
|
|
1089
1089
|
holder_pid = NULL, holder_host = NULL, started_at = NULL,
|
|
1090
1090
|
last_heartbeat_at = NULL, last_seq = ?
|
|
1091
1091
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1092
|
-
AND lease_id IS ? AND last_seq = ?`).run(r,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);er(s.changes,n)}function Kp(t,e,r,n,s=null,i=!1){let o=tx();if(r!==null&&n===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=
|
|
1092
|
+
AND lease_id IS ? AND last_seq = ?`).run(r,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);er(s.changes,n)}function Kp(t,e,r,n,s=null,i=!1){let o=tx();if(r!==null&&n===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=En(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||sx(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let u=ix(a,n,i),f=ox(a),m=a.lease_id;Ie(t,{stream_id:m,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:Qt(e.receiver_teamfile,e.receiver_alias),reason:u,previous_holder:f}},p=>Gp(t,a,p,"INFLIGHT_RECLAIM")),a=En(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,d=`lease_${Hp()}`;return Ie(t,{stream_id:d,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:d,receiver:Qt(e.receiver_teamfile,e.receiver_alias),sender:Qt(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},c=>{if(a===null){t.prepare(`INSERT INTO agent_state
|
|
1093
1093
|
(receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
|
|
1094
1094
|
sender_alias, holder_pid, holder_host, started_at,
|
|
1095
1095
|
last_heartbeat_at, last_seq)
|
|
@@ -1103,13 +1103,13 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1103
1103
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1104
1104
|
AND lease_id = ?
|
|
1105
1105
|
AND sender_teamfile = ? AND sender_alias = ?
|
|
1106
|
-
AND started_at = ? AND holder_pid IS ?`).run(n,e.receiver_teamfile,e.receiver_alias,r,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function vs(t,e,r,n){let s=
|
|
1106
|
+
AND started_at = ? AND holder_pid IS ?`).run(n,e.receiver_teamfile,e.receiver_alias,r,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function vs(t,e,r,n){let s=En(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||Ie(t,{stream_id:s.lease_id,event_type:r,observedLastSeq:s.last_seq,payload:{receiver:Qt(e.receiver_teamfile,e.receiver_alias),...r==="INFLIGHT_RECLAIM"?{reason:n??"stale",previous_holder:lx(e)}:{lease_id:s.lease_id}}},i=>Gp(t,s,i,r))}function Yp(t,e){let r=En(t,e.teamfile,e.alias),n=r?.last_seq??0;Ie(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:n,ts:e.started_at,payload:{receiver:Qt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(r===null){t.prepare(`INSERT INTO agent_state
|
|
1107
1107
|
(receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
|
|
1108
1108
|
VALUES (?, ?, ?, ?)`).run(e.teamfile,e.alias,e.lock_id,s);return}let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = ?, last_seq = ?
|
|
1109
1109
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1110
|
-
AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,r.last_seq);er(i.changes,"TERMINAL_LOCK_TAKE")})}function td(t,e,r=!1){let n=
|
|
1110
|
+
AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,r.last_seq);er(i.changes,"TERMINAL_LOCK_TAKE")})}function td(t,e,r=!1){let n=En(t,e.teamfile,e.alias);n===null||n.terminal_lock_id!==e.lock_id||Ie(t,{stream_id:e.lock_id,event_type:r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:n.last_seq,payload:{receiver:Qt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
|
|
1111
1111
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1112
|
-
AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,n.last_seq);er(i.changes,r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function zp(t,e,r){let n=
|
|
1112
|
+
AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,n.last_seq);er(i.changes,r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function zp(t,e,r){let n=En(t,r.targetTeamfile,r.targetAlias);if(n===null){t.prepare(`INSERT INTO agent_state
|
|
1113
1113
|
(receiver_teamfile, receiver_alias, terminal_invocation_id,
|
|
1114
1114
|
terminal_invocation_pid, terminal_invocation_host,
|
|
1115
1115
|
terminal_invocation_heartbeat_at, last_seq)
|
|
@@ -1130,19 +1130,19 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1130
1130
|
AND terminal_invocation_id = ? AND last_seq = ?`).run(e,n.receiver_teamfile,n.receiver_alias,r,n.last_seq);er(s.changes,"terminal INVOCATION_FINISH")}function e_(t,e){let r=e.ts??new Date().toISOString();return t.transaction(()=>{let n=t.prepare(`SELECT seq FROM message_event
|
|
1131
1131
|
WHERE stream_id = ? AND event_type = 'MESSAGE_HANDLING_STARTED'
|
|
1132
1132
|
AND json_extract(payload, '$.handling_by') = ?
|
|
1133
|
-
ORDER BY seq LIMIT 1`).get(e.messageId,e.handlingBy);if(n!==void 0)return
|
|
1133
|
+
ORDER BY seq LIMIT 1`).get(e.messageId,e.handlingBy);if(n!==void 0)return wn(t,e.handlingTeamfile,e.handlingAlias,e.messageId,r),{appended:!1,seq:n.seq,handling_at:r};let s=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,i=Ie(t,{stream_id:e.messageId,event_type:"MESSAGE_HANDLING_STARTED",intentKey:`MESSAGE_HANDLING_STARTED:${e.handlingBy}`,observedLastSeq:s,ts:r,payload:{handling_by:e.handlingBy,handling_at:r}},()=>{wn(t,e.handlingTeamfile,e.handlingAlias,e.messageId,r)});return{appended:i.appended,seq:i.seq,handling_at:r}})()}function t_(t,e){let r=t.prepare(`SELECT seq FROM message_event
|
|
1134
1134
|
WHERE stream_id = ? AND event_type = 'MESSAGE_ACKNOWLEDGED'
|
|
1135
1135
|
AND json_extract(payload, '$.acked_by') = ?
|
|
1136
|
-
ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),n=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(Bp(t,e.messageId,e.ackedBy,e.ts),"removed"):
|
|
1136
|
+
ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),n=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(Bp(t,e.messageId,e.ackedBy,e.ts),"removed"):yn(t,e.messageId)===null?"not-pending":"claimed";if(r!==void 0)return{appended:!1,seq:r.seq,pending_outcome:n?s():"record-only"};let i=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,o=yn(t,e.messageId),a=n?"not-pending":"record-only",l=Ie(t,{stream_id:e.messageId,event_type:"MESSAGE_ACKNOWLEDGED",intentKey:`MESSAGE_ACKNOWLEDGED:${e.ackedBy}`,observedLastSeq:i,...e.ts!==void 0?{ts:e.ts}:{},payload:{acked_by:e.ackedBy,acked_at:e.ts??new Date().toISOString(),...e.note!==void 0?{note:e.note}:{},pid:e.holderPid??null,host:e.holderHost??null}},()=>{if(!n)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(a="removed",Bp(t,e.messageId,e.ackedBy,e.ts)):o!==null&&(a="claimed")});if(!l.appended){let d=yn(t,e.messageId);a=n?d===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}function Bp(t,e,r,n){let s=/^msg_mbx_(\d+)$/.exec(e);s!==null&&t.prepare(`UPDATE agent_mailbox
|
|
1137
1137
|
SET delivered_at = ?, receipt = ?
|
|
1138
|
-
WHERE id = ? AND delivered_at IS NULL`).run(n??new Date().toISOString(),`[acknowledged by ${r}]`,Number(s[1]))}var rx,bs=T(()=>{"use strict";ji();Lt();Jr();rx=60*60*1e3});function r_(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function rd(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function n_(t,e){let r=
|
|
1138
|
+
WHERE id = ? AND delivered_at IS NULL`).run(n??new Date().toISOString(),`[acknowledged by ${r}]`,Number(s[1]))}var rx,bs=T(()=>{"use strict";ji();Lt();Jr();rx=60*60*1e3});function r_(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function rd(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function n_(t,e){let r=Tn(e.id),n=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;Ie(t,{stream_id:r,event_type:dx,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:r,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:n,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
|
|
1139
1139
|
(invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
|
|
1140
1140
|
root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
|
|
1141
1141
|
status, started_at, last_heartbeat_at, last_seq)
|
|
1142
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(r,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),rd(e)&&zp(t,i,{invocationId:r,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function nd(t,e){let r=
|
|
1142
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(r,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),rd(e)&&zp(t,i,{invocationId:r,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function nd(t,e){let r=Tn(e.id),n=r_(t,r);return n===null?!1:(Ie(t,{stream_id:r,event_type:cx,observedLastSeq:n.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:r,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
|
|
1143
1143
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1144
|
-
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,r,n.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${r}`);rd(e)&&Qp(t,s,r)}),!0)}function s_(t,e,r,n){let s=
|
|
1145
|
-
`)}var l_,Bi,fx,Ss,d_,sd,Hi,ks=T(()=>{"use strict";l_="other",Bi=["not_enough_information","dont_know","other_work"],fx=new Set([l_,...Bi]),Ss="@abort",d_="invalid_decision",sd="escalation_aborted",Hi="workflow_escalation"});import{randomUUID as u_}from"node:crypto";import{hostname as Is}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function qe(t){return new id(Mi({dbPath:t.path}))}function f_(t,e,r){let n=m_(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let d=r(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return m_(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let c of o(l))a(c)}finally{i.pop()}s.add(l)}};a(t)}function m_(t){let e=mx(t),r=e===null?null:px(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Xi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function mx(t){try{let e=JSON.parse(t);return Xi(e)?e:null}catch{return null}}function px(t,e){let r=t[e];return Xi(r)?r:null}function Xi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function _x(t){try{let e=JSON.parse(t);return!Xi(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function hx(t,e){return t===null?!0:t.holder_host===Is()?!He(t.holder_pid):t.last_heartbeat<e}function gx(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===Is()&&yx(t.delivery_holder_pid)){let n=He(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function
|
|
1144
|
+
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,r,n.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${r}`);rd(e)&&Qp(t,s,r)}),!0)}function s_(t,e,r,n){let s=Tn(e.id),i=r_(t,s);return i===null?!1:(Ie(t,{stream_id:s,event_type:ux,observedLastSeq:i.last_seq,ts:n,payload:{invocation_id:s,notified_by:r,notified_at:n,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(r,n,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function i_(t,e,r){let n=Tn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(r,n),rd(e)&&Zp(t,n,r)}function o_(t,e,r){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(r,Tn(e))}var dx,cx,ux,a_=T(()=>{"use strict";ji();bs();dx="INVOCATION_START",cx="INVOCATION_FINISH",ux="INVOCATION_NOTIFY_CLAIM"});function vn(t){return typeof t=="string"&&fx.has(t)}function c_(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: ${Bi[0]}`,` STANCE: ${Bi[1]}`,` STANCE: ${Bi[2]}`,` STANCE: ${l_}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
1145
|
+
`)}var l_,Bi,fx,Ss,d_,sd,Hi,ks=T(()=>{"use strict";l_="other",Bi=["not_enough_information","dont_know","other_work"],fx=new Set([l_,...Bi]),Ss="@abort",d_="invalid_decision",sd="escalation_aborted",Hi="workflow_escalation"});import{randomUUID as u_}from"node:crypto";import{hostname as Is}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function qe(t){return new id(Mi({dbPath:t.path}))}function f_(t,e,r){let n=m_(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let d=r(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return m_(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let c of o(l))a(c)}finally{i.pop()}s.add(l)}};a(t)}function m_(t){let e=mx(t),r=e===null?null:px(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Xi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function mx(t){try{let e=JSON.parse(t);return Xi(e)?e:null}catch{return null}}function px(t,e){let r=t[e];return Xi(r)?r:null}function Xi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function _x(t){try{let e=JSON.parse(t);return!Xi(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function hx(t,e){return t===null?!0:t.holder_host===Is()?!He(t.holder_pid):t.last_heartbeat<e}function gx(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===Is()&&yx(t.delivery_holder_pid)){let n=He(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function wr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);M({event:t,event_at:n,message_id:e.id,message_type:e.message_type,lane_key:JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias]),sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message_created_at:e.created_at,delivering_at:e.delivering_at,delivered_at:e.delivered_at,delivery_holder_pid:e.delivery_holder_pid,delivery_holder_host:e.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...r})}function yx(t){return Number.isInteger(t)&&(t??0)>0}function Ex(t){return{...Dp(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1146
1146
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1147
1147
|
VALUES (?, ?, ?, ?, ?)
|
|
1148
1148
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1542,11 +1542,11 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1542
1542
|
error_detail = ?,
|
|
1543
1543
|
truncated = ?
|
|
1544
1544
|
WHERE id = ?
|
|
1545
|
-
`),...Cp(t),...Rp(t)}}function wx(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var id,dt=T(()=>{"use strict";Gl();Lp();$p();Di();Pp();Jr();pe();bs();a_();ks();id=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Ex(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.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,i,o)=>{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>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,c=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!c)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.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,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"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)=>wx("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.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(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,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 i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Hi)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let c=JSON.parse(i.payload);c.step!==void 0&&typeof c.step.id=="string"&&c.step.id.length>0&&(o=c.step.id),Array.isArray(c.declared_outcomes)&&(a=c.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Ss&&!a.includes(n))return{resumed:!1,reason:d_};let d={};if(l.pending_escalation_decision!==null)try{let c=JSON.parse(l.pending_escalation_decision);c!==null&&typeof c=="object"&&!Array.isArray(c)&&(d=c)}catch{d={}}return d[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,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.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale"),d=Kp(this.db,o,s,l,n.stale_before??null,n.force===!0);a={acquired:!0,current:o,lease_id:d}}else a={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"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n),i=Xr(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:We(i.id)};for(let a of s)Ts(this.db,a,"",D(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return 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){f_(e.name,e.definition,o=>this.getWorkflowByName(o));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 i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){f_(e.name,e.definition,o=>this.getWorkflowByName(o));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,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.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 i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,D());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.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"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?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"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=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,i?r.durable_memory_mode:n.durable_memory_mode,o?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(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}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"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,D(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}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,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,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=u_(),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 i=D(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.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),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}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){return this.db.transaction(()=>{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.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return Zl(this.db,n,e),Ql(this.db,n,e),n})()}beginTeamChatLog(e){return this.db.transaction(()=>{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.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return Zl(this.db,n,e),n})()}finishTeamChatLog(e,r){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Ql(this.db,e,r)})()}setCurrentlyHandlingMessage(e,r,n){this.db.transaction(()=>{En(this.db,e,r,n)})()}clearCurrentlyHandlingMessage(e,r,n){return this.db.transaction(()=>qi(this.db,e,r,n))()}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)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??D(),n=e.holder_host??Is(),s=e.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Zt(e.command),r,e.holder_pid??null,n,s,Zt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return n_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??D();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Zt(r.result_summary),Zt(r.error),r.team_chat_log_id??null,Zt(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return nd(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??D();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Zt(n.result_summary),Zt(n.error),n.team_chat_log_id??null,Zt(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return nd(this.db,o),o})()}heartbeatTrackedInvocation(e,r=D()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return i_(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(o_(this.db,e,r),this.getTrackedInvocation(e)))()}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=D()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return s_(this.db,i,r,n),i})()}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){return this.db.transaction(()=>{let n=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,gs(e.payload),e.created_at??D(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null),s=this.getMailboxMessage(Number(n.lastInsertRowid));return zl(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=gs(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of s){let c=this.getMailboxMessage(d),u=this.stmts.markMailboxMessageDelivered.run(n,i,d);a+=u.changes,u.changes===1&&c!==null&&o.push(c)}let l=new Map;for(let d of o){if(d.message_type!=="request")continue;let c=`${d.receiver_teamfile}\0${d.receiver_alias}`,u=l.get(c);(u===void 0||Xr([u,d])?.id===d.id)&&l.set(c,d)}for(let d of o){let c=l.get(`${d.receiver_teamfile}\0${d.receiver_alias}`)??null;Ts(this.db,d,i,n,null,d.message_type==="request"&&c!==null?{action:"clear",messageId:We(c.id)}:null)}this.db.exec("COMMIT");for(let d of o)Er("mailbox_delivery_delivered",d,{transition:d.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}a+=1,i.push(c)}let l=Xr(i),d=l===null?null:{action:"clear",messageId:We(l.id)};for(let c of i)Ts(this.db,c,s,n,null,d);this.db.exec("COMMIT");for(let c of i)Er("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let c of o)Er("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let d=[...i].sort((p,h)=>p.created_at.localeCompare(h.created_at)||p.id-h.id),c=Xr(i),u=null;if(c!==null&&c.sender_teamfile!==null&&c.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:We(u.id),m=c===null?null:{action:"clear",messageId:We(c.id)};for(let p of i)Ts(this.db,p,s,n,c!==null&&p.id!==c.id?f:null,m);u!==null&&zl(this.db,u,{},{},d.map(p=>We(p.id))),this.db.exec("COMMIT");for(let p of i)Er("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let p of o)Er("mailbox_delivery_finalize_skipped",p,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=Is()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let c=this.getMailboxMessage(l);c!==null&&(Jp(this.db,c,r,n,s),o.push(c))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)Er("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(ed(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)Er("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e,r="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(e.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&ed(this.db,s,r),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=gx(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)Er(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}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)}heartbeatAgentInflight(e,r,n=D()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:Vp(this.db,s,r,n)})()}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&vs(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid});return o.changes===1&&i!==null&&vs(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,r){this.db.exec("BEGIN IMMEDIATE");try{let n=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(n===null||n.sender_teamfile!==e.sender_teamfile||n.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1545
|
+
`),...Cp(t),...Rp(t)}}function wx(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var id,dt=T(()=>{"use strict";Gl();Lp();$p();Di();Pp();Jr();pe();bs();a_();ks();id=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Ex(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.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,i,o)=>{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>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,c=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!c)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.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,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"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)=>wx("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.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(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,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 i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Hi)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let c=JSON.parse(i.payload);c.step!==void 0&&typeof c.step.id=="string"&&c.step.id.length>0&&(o=c.step.id),Array.isArray(c.declared_outcomes)&&(a=c.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Ss&&!a.includes(n))return{resumed:!1,reason:d_};let d={};if(l.pending_escalation_decision!==null)try{let c=JSON.parse(l.pending_escalation_decision);c!==null&&typeof c=="object"&&!Array.isArray(c)&&(d=c)}catch{d={}}return d[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,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.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale"),d=Kp(this.db,o,s,l,n.stale_before??null,n.force===!0);a={acquired:!0,current:o,lease_id:d}}else a={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"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n),i=Xr(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:We(i.id)};for(let a of s)Ts(this.db,a,"",D(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return 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){f_(e.name,e.definition,o=>this.getWorkflowByName(o));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 i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){f_(e.name,e.definition,o=>this.getWorkflowByName(o));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,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.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 i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,D());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.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"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?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"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=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,i?r.durable_memory_mode:n.durable_memory_mode,o?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(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}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"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,D(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}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,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,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=u_(),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 i=D(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.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),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}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){return this.db.transaction(()=>{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.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return Zl(this.db,n,e),Ql(this.db,n,e),n})()}beginTeamChatLog(e){return this.db.transaction(()=>{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.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return Zl(this.db,n,e),n})()}finishTeamChatLog(e,r){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Ql(this.db,e,r)})()}setCurrentlyHandlingMessage(e,r,n){this.db.transaction(()=>{wn(this.db,e,r,n)})()}clearCurrentlyHandlingMessage(e,r,n){return this.db.transaction(()=>qi(this.db,e,r,n))()}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)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??D(),n=e.holder_host??Is(),s=e.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Zt(e.command),r,e.holder_pid??null,n,s,Zt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return n_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??D();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Zt(r.result_summary),Zt(r.error),r.team_chat_log_id??null,Zt(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return nd(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??D();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Zt(n.result_summary),Zt(n.error),n.team_chat_log_id??null,Zt(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return nd(this.db,o),o})()}heartbeatTrackedInvocation(e,r=D()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return i_(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(o_(this.db,e,r),this.getTrackedInvocation(e)))()}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=D()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return s_(this.db,i,r,n),i})()}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){return this.db.transaction(()=>{let n=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,gs(e.payload),e.created_at??D(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null),s=this.getMailboxMessage(Number(n.lastInsertRowid));return zl(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=gs(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of s){let c=this.getMailboxMessage(d),u=this.stmts.markMailboxMessageDelivered.run(n,i,d);a+=u.changes,u.changes===1&&c!==null&&o.push(c)}let l=new Map;for(let d of o){if(d.message_type!=="request")continue;let c=`${d.receiver_teamfile}\0${d.receiver_alias}`,u=l.get(c);(u===void 0||Xr([u,d])?.id===d.id)&&l.set(c,d)}for(let d of o){let c=l.get(`${d.receiver_teamfile}\0${d.receiver_alias}`)??null;Ts(this.db,d,i,n,null,d.message_type==="request"&&c!==null?{action:"clear",messageId:We(c.id)}:null)}this.db.exec("COMMIT");for(let d of o)wr("mailbox_delivery_delivered",d,{transition:d.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}a+=1,i.push(c)}let l=Xr(i),d=l===null?null:{action:"clear",messageId:We(l.id)};for(let c of i)Ts(this.db,c,s,n,null,d);this.db.exec("COMMIT");for(let c of i)wr("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let c of o)wr("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let d=[...i].sort((p,h)=>p.created_at.localeCompare(h.created_at)||p.id-h.id),c=Xr(i),u=null;if(c!==null&&c.sender_teamfile!==null&&c.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:We(u.id),m=c===null?null:{action:"clear",messageId:We(c.id)};for(let p of i)Ts(this.db,p,s,n,c!==null&&p.id!==c.id?f:null,m);u!==null&&zl(this.db,u,{},{},d.map(p=>We(p.id))),this.db.exec("COMMIT");for(let p of i)wr("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let p of o)wr("mailbox_delivery_finalize_skipped",p,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=Is()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let c=this.getMailboxMessage(l);c!==null&&(Jp(this.db,c,r,n,s),o.push(c))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)wr("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(ed(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)wr("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e,r="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(e.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&ed(this.db,s,r),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=gx(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)wr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}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)}heartbeatAgentInflight(e,r,n=D()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:Vp(this.db,s,r,n)})()}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&vs(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid});return o.changes===1&&i!==null&&vs(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,r){this.db.exec("BEGIN IMMEDIATE");try{let n=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(n===null||n.sender_teamfile!==e.sender_teamfile||n.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1546
1546
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==r)return this.db.exec("COMMIT"),!1;if(n.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&vs(this.db,n,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(vs(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(ys,ws(e,r),Es);return n===void 0?null:jp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&td(this.db,n,!0),this.stmts.upsertRuntimeState.run(ys,ws(e.teamfile,e.alias),Es,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&Yp(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ys,ws(e,r),Es,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(ys,ws(e,r),Es);return i.changes===1&&td(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:_x(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=D()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!hx(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:u_(),holder_pid:process.pid,holder_host:Is(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}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,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}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 Tx}from"node:fs";import{resolve as vx}from"node:path";function od(t){let e=vx(t);try{return Tx(e)}catch{return e}}var p_=T(()=>{"use strict"});import{platform as __}from"node:os";function Ot(t){let e=new Ns;for(let r of t)e.registerAdapter(r);return e}var Ns,ad=T(()=>{"use strict";p_();Ns=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=od(e.workspace);i=i.filter(a=>od(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}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(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=__()==="darwin"||__()==="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 h_}from"node:fs";import{createInterface as g_}from"node:readline";import{stat as bx}from"node:fs/promises";import{homedir as Sx}from"node:os";function y_(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*Be(t){let e=h_(t,{encoding:"utf-8"}),r=g_({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(!s)continue;let i=y_(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Xe(t,e){let r=[],n=h_(t,{encoding:"utf-8"}),s=g_({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=y_(o);if(a!==void 0&&r.push(a),r.length>=e)break}}finally{s.close(),n.destroy()}return r}async function Oe(t){let e=await bx(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function fe(t){return t.replace(/\\n/g,`
|
|
1547
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ve,tr=T(()=>{"use strict";ve=Sx()});import{readdir as Ji,stat as E_,unlink as kx}from"node:fs/promises";import{join as
|
|
1548
|
-
`),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else i.start&&(u.start=i.start),i.resume&&(u.resume=i.resume),i.agent&&(u.agent=i.agent),i.profile_flag!==void 0&&(u.profile_flag=i.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?r.providers?.[s.provider]??{}:r.global??{};if(i.min!==void 0){let f=b_(i.min);f!==null&&(u.min=f)}if(i.max!==void 0){let f=b_(i.max);f!==null&&(u.max=f)}s.provider?(r.providers||(r.providers={}),r.providers[s.provider]=u):r.global=u}i={}}for(let u of n){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=Dx(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=Mx(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let d={tools:e};(r.global||r.providers)&&(d.compact=r);let c=a.site_name;return c!==void 0&&c.length>0&&(d.site_name=c),d}function k_(t){return t.site_name??null}function Fx(t,e,r){if(!r)return"";let n=t.tools[e]??ld[e],s=n?.profiles?.[r]?.flags??ld[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 I_(t,e){return!!t.tools[e]}function N_(t,e,r,n,s){let i=t.tools[e]??ld[e],o;if(i?.agent){let l=Ki(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Cx[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(c=>c.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let c=d.map(Ki).join(" ");o=`printf '%s\\n' ${Ki(n)} | ${c}`}else o=d.map(Ki).join(" ")}let a=Fx(t,e,s);return a&&(o+=" "+a),o}var ld,Cx,dd=T(()=>{"use strict";ld={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}}},Cx={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]}}});function A_(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 x_=T(()=>{"use strict"});var Ux,ge,Vi,ht=T(()=>{"use strict";Ux="ACK: waiting for explicit lmctl task.",ge=`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: ${Ux}`,Vi=`send this exact lmctl seed instruction: "${ge}"`});function
|
|
1549
|
-
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.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:Vi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&I_(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,i,o,a="",l,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),c(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},c=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,d(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&d(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(c(),{...p,status:"ok"})).catch(p=>{throw c(),o==="external"?new cd("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=N_(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=A_(r.env),d=R_(s,{shell:!0,cwd:r.cwd,env:Je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),c=!1,u=!1,f=setTimeout(()=>{u=!0,d.kill()},l),m="",p="";if(d.stdout?.on("data",h=>{let _=h.toString();m+=_,r.onDelta?.(_)}),d.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),d.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>d.kill(),{once:!0})}d.on("exit",h=>{if(c)return;c=!0,clearTimeout(f);let _=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:_}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),d.on("error",h=>{c||(c=!0,clearTimeout(f),a(h))})})}}});function zi(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new nr(t,r,e)}var ct,be,rr,Yi,nr,
|
|
1547
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ve,tr=T(()=>{"use strict";ve=Sx()});import{readdir as Ji,stat as E_,unlink as kx}from"node:fs/promises";import{join as bn,basename as w_}from"node:path";function Ix(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Nx(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return fe(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 T_(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Be(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let d=l.message.content;if(typeof d=="string"){if(d.includes("<command-name>")||d.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let d=l.message.content;if(Array.isArray(d))for(let u of d)u.type==="text"&&e++;let c=l.message.usage;if(c){let u=c.input_tokens||0,f=c.cache_creation_input_tokens||0,m=c.cache_read_input_tokens||0,p=c.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let h=u+f+m;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function Ax(t){let e=xx(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function xx(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var Gi,v_=T(()=>{"use strict";tr();Gi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||bn(ve,".claude"),this.projectsDir=bn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ji(this.projectsDir)}catch{return e}for(let n of r){let s=bn(this.projectsDir,n);if(!(await E_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ji(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=w_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let d=bn(s,a);try{let c=await this.extractSummary(d,l);c&&e.push(c)}catch{}}}return e}async extractSummary(e,r){let n=await Xe(e,50),s=await Oe(e),i="",o,a,l,d,c,u;for(let m of n)if(!Ix(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=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;d||(d=H(p.trim(),80)),c=H(p.trim(),80)}}if(!i)return null;let f=await T_(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:d,lastUserMessage:c,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 Oe(r),s=[],i="",o,a,l,d,c,u,f,m=e,p;for await(let _ of Be(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!d&&_.gitBranch&&(d=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:Nx(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),y=_.message.content;if(typeof y=="string"){if(y.includes("<command-name>")||y.includes("<local-command-"))continue;c||(c=H(y.trim(),80)),u=H(y.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:fe(y.trim())})}else if(Array.isArray(y)){for(let E of y)if(E.type==="tool_result"){let w=typeof E.content=="string"?fe(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:E.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.stop_reason===null||_.message.stop_reason==="tool_use"?p="in_progress":typeof _.message.stop_reason=="string"&&(p="complete"),_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),y=_.message.content;if(Array.isArray(y))for(let E of y)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:g,content:fe(E.text),model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):E.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:E.name||"unknown tool",toolName:E.name,toolInput:JSON.stringify(E.input,null,2),toolInputData:E.input,toolCallId:E.id,model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:g,content:E.thinking})}}if(!i)return null;Ax(s);let h=await T_(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:d,turnStatus:p,firstUserMessage:c,lastUserMessage:u,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await kx(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Ji(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=bn(this.projectsDir,o);if(!(await E_(a).catch(()=>null))?.isDirectory())continue;let d;try{d=await Ji(a)}catch{continue}for(let c of d){if(!c.endsWith(".jsonl"))continue;let u=w_(c,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:bn(a,c),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Xe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as Rx,writeFileSync as HK,mkdirSync as XK}from"node:fs";import{join as Lx,dirname as GK}from"node:path";import{homedir as Ox}from"node:os";function $x(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Mx(t){let e=t.indexOf("=");if(e===-1)return null;let r=t.slice(0,e).trim(),n=$x(t.slice(e+1).trim());return r?{key:r,value:n}:null}function Dx(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Ki(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function jx(){return Lx(Ox(),".lmctl","config.toml")}function S_(t){let e=t??jx(),r;try{r=Rx(e,"utf-8")}catch{return{tools:{}}}return Px(r)}function b_(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let r=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!r)return null;let n=parseFloat(r[1]);if(!Number.isFinite(n))return null;switch(r[2]){case"K":case"k":return Math.round(n*1e3);case"M":case"m":return Math.round(n*1e6);default:return Math.round(n)}}function Px(t){let e={},r={},n=t.split(`
|
|
1548
|
+
`),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else i.start&&(u.start=i.start),i.resume&&(u.resume=i.resume),i.agent&&(u.agent=i.agent),i.profile_flag!==void 0&&(u.profile_flag=i.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?r.providers?.[s.provider]??{}:r.global??{};if(i.min!==void 0){let f=b_(i.min);f!==null&&(u.min=f)}if(i.max!==void 0){let f=b_(i.max);f!==null&&(u.max=f)}s.provider?(r.providers||(r.providers={}),r.providers[s.provider]=u):r.global=u}i={}}for(let u of n){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=Dx(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=Mx(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let d={tools:e};(r.global||r.providers)&&(d.compact=r);let c=a.site_name;return c!==void 0&&c.length>0&&(d.site_name=c),d}function k_(t){return t.site_name??null}function Fx(t,e,r){if(!r)return"";let n=t.tools[e]??ld[e],s=n?.profiles?.[r]?.flags??ld[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 I_(t,e){return!!t.tools[e]}function N_(t,e,r,n,s){let i=t.tools[e]??ld[e],o;if(i?.agent){let l=Ki(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Cx[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(c=>c.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let c=d.map(Ki).join(" ");o=`printf '%s\\n' ${Ki(n)} | ${c}`}else o=d.map(Ki).join(" ")}let a=Fx(t,e,s);return a&&(o+=" "+a),o}var ld,Cx,dd=T(()=>{"use strict";ld={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}}},Cx={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]}}});function A_(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 x_=T(()=>{"use strict"});var Ux,ge,Vi,ht=T(()=>{"use strict";Ux="ACK: waiting for explicit lmctl task.",ge=`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: ${Ux}`,Vi=`send this exact lmctl seed instruction: "${ge}"`});function Tr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function qx(t,e){return e===void 0||e.length===0?t:{...t??process.env,[As]:e}}function Je(t,e,r,n="chat"){return{...qx(Tr(t,e),r),[Wx]:n}}var As,Wx,gt=T(()=>{"use strict";As="LMCTL_SELF_SESSIONID",Wx="LMCTL_LAUNCH_SOURCE"});import{spawn as R_}from"node:child_process";import{mkdirSync as Bx}from"node:fs";var cd,xe,$t=T(()=>{"use strict";dd();x_();ht();gt();cd=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},xe=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===ge?r:n)}seed(e,r){return Bx(e,{recursive:!0}),new Promise(n=>{let s;try{s=R_(this.binary,this.seedArgsFor(r),{cwd:e,env:Tr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1549
|
+
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.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:Vi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&I_(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,i,o,a="",l,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),c(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},c=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,d(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&d(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(c(),{...p,status:"ok"})).catch(p=>{throw c(),o==="external"?new cd("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=N_(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=A_(r.env),d=R_(s,{shell:!0,cwd:r.cwd,env:Je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),c=!1,u=!1,f=setTimeout(()=>{u=!0,d.kill()},l),m="",p="";if(d.stdout?.on("data",h=>{let _=h.toString();m+=_,r.onDelta?.(_)}),d.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),d.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>d.kill(),{once:!0})}d.on("exit",h=>{if(c)return;c=!0,clearTimeout(f);let _=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:_}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),d.on("error",h=>{c||(c=!0,clearTimeout(f),a(h))})})}}});function zi(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new nr(t,r,e)}var ct,be,rr,Yi,nr,Sn=T(()=>{"use strict";ct=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},be=class extends ct{},rr=class extends ct{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Yi=class extends ct{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},nr=class extends ct{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fd from"node:child_process";function Xx(t){if(typeof fd.spawnSync=="function")try{fd.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function L_(t){return t.exitCode!==null||t.signalCode!==null}function ud(t,e){return L_(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function et(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??Xx;if(L_(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ud(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await ud(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await ud(t,Hx)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Hx,xs=T(()=>{"use strict";Hx=1e3});function O_(t){ue()&&De({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function vr(t,e){let r=Gx[t];if(r)return r[e]??r.yolo}function Vx(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 yt(t,e,r="yolo"){if(Kx.has(t)){O_(`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)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${r==="plan"?"plan":"auto"})`:"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?vr(t,"plan"):Jx[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 M({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new be(s)}if(!Vx(e,n)){let s=n.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw M({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new be(i)}O_(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var Jx,Gx,Kx,kn=T(()=>{"use strict";Sn();pe();Jx={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},Gx={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"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};Kx=new Set(["codex","opencode","kimi"])});function C_(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(`
|
|
1550
1550
|
|
|
1551
1551
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1552
1552
|
|
|
@@ -1554,47 +1554,47 @@ var CN=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1554
1554
|
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:
|
|
1555
1555
|
${e}
|
|
1556
1556
|
|
|
1557
|
-
${r}`:r}function M_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||rR[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=
|
|
1557
|
+
${r}`:r}function M_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||rR[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=vr(s,a)??sR[s]??["--dangerously-skip-permissions"];o.push(...l);try{yt(s,o,a)}catch(F){return n(F)}if(e.cwd&&!zx(e.cwd))return M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=Yx(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)});d.stdin?.on("error",F=>{Ze(`stream-json: stdin pipe error, ignored (exit handler reports): ${F.message}`)});let c=!1;if(e.signal){if(e.signal.aborted)return c=!0,M({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,M({event:"transport_abort",provider:s}),et(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u="",f=!1,m=!1,p=!1,h=0,_=!1,g=md({onEvent:F=>{h=Date.now(),_=F.type!=="result",e.onEvent?.(F)},onText:e.onText});function y(){if(m)return;m=!0;let F=e.holdOpen;if(F===void 0){d.stdin?.end();return}let $=Date.now();w(F,$).catch(()=>{E(F,{startedMs:$,held:!1,reason:"check-error"})})}function E(F,$){if(!p){p=!0;try{F.onRelease?.({elapsedMs:Date.now()-$.startedMs,held:$.held,reason:$.reason})}catch{}}d.stdin?.end()}async function w(F,$){let R=F.pollMs??Zx,A=F.maxHoldMs??Qx,Y=F.settleMs??eR,B=!1,k=null,I=C=>E(F,{startedMs:$,held:B,reason:C});for(;;){if(c)return I("aborted");if(f)return I("child-exited");let C=A-(Date.now()-$);if(C<=0)return I("max-hold");let W;try{W=await tR(F.hasOutstandingWork(),C,e.signal)}catch{return I("check-error")}if(W===_d)return I(c||e.signal?.aborted===!0?"aborted":"max-hold");if(W)k=null;else{if(!B||Y<=0)return I("cleared");k===null&&(k=Date.now(),Ze(`stream-json: dispatched work cleared \u2014 settling ${Y}ms before closing stdin`));let j=Math.max(k,h);if(!_&&Date.now()-j>=Y)return I("cleared")}if(B||(B=!0,F.onHold?.(),Ze(`stream-json: deferring stdin close \u2014 outstanding dispatched work (poll ${R}ms)`)),Date.now()-$>=A)return M({event:"transport_hold_open_max_wait",provider:e.tool||"claude",elapsed_ms:Date.now()-$}),I("max-hold");let U=Math.max(0,Math.min(R,A-(Date.now()-$)));await new Promise(j=>setTimeout(j,U).unref?.())}}function S(F){let $=g.sawResult();g.processLine(F),!$&&g.sawResult()&&y()}d.stdout?.on("data",F=>{u+=F.toString();let $=u.split(`
|
|
1558
1558
|
`);u=$.pop()||"";for(let R of $)S(R)});let x="";d.stderr?.on("data",F=>{x+=F.toString()}),d.on("error",F=>{M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:F.message}),n(new be(`Failed to spawn ${i}: ${F.message}`,{cause:F}))}),d.on("exit",F=>{if(f=!0,c)return;u.trim()&&S(u);let $=g.finalize();$?(Ze(`stream-json: result ${$.result.slice(0,80)}${$.result.length>80?"...":""} (${$.durationMs}ms)`),r({...$,exitCode:F})):(M({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:F,stderr_tail:x.slice(0,500)}),n(new Error(nR({tool:s,exitCode:F,stderr:x}))))});let J=JSON.stringify({type:"user",message:{role:"user",content:t}});d.stdin?.write(J+`
|
|
1559
|
-
`),Ze(`stream-json: prompt sent (${t.length} chars)`)})}var Zx,Qx,eR,_d,rR,sR,D_=T(()=>{"use strict";
|
|
1559
|
+
`),Ze(`stream-json: prompt sent (${t.length} chars)`)})}var Zx,Qx,eR,_d,rR,sR,D_=T(()=>{"use strict";Sn();xs();kn();pe();gt();pd();pd();Zx=2e3,Qx=8*60*60*1e3,eR=5e3,_d=Symbol("check-timed-out");rR={claude:"claude",qwen:"qwen"};sR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function Zi(t={}){return[]}var hd=T(()=>{"use strict"});function gd(t){return t==="plan"?"read-only":"danger-full-access"}function j_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function yd(){return{agentItems:new Map,resultText:""}}function Qi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let d=typeof i?.threadId=="string"?i.threadId:void 0,c=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:d,turnId:c,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Ed(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function P_(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 wd(){return{pendingCodexError:null}}function Td(t,e){let r=P_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function vd(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bd=T(()=>{"use strict"});import{spawn as iR}from"node:child_process";import{createInterface as oR}from"node:readline";import{existsSync as aR,readFileSync as lR}from"node:fs";import{fileURLToPath as dR}from"node:url";function uR(){return j_(cR)}function br(t,e){Ze(`[codex:${t}] ${JSON.stringify(e)}`)}function fR(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1560
1560
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1561
1561
|
${e}
|
|
1562
1562
|
|
|
1563
|
-
${r}`:r}function F_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?Zi():[];i.push(...a),ue()&&
|
|
1563
|
+
${r}`:r}function F_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?Zi():[];i.push(...a),ue()&&je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",d=gd(l);try{yt("codex",i,l)}catch($){return n($)}if(e.cwd&&!aR(e.cwd))return M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=iR(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:"codex"}),et(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=oR({input:c.stdout}),m=new Map,p=1,h=e.threadId||"",_="",g=!1,y=!1,E=Date.now(),w=yd(),S=wd();function x($,R={}){return new Promise((A,Y)=>{let B=p++;m.set(B,{resolve:A,reject:Y});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:$,params:R});c.stdin?.write(k+`
|
|
1564
1564
|
`)})}function J($,R={}){let A=JSON.stringify({jsonrpc:"2.0",method:$,params:R});c.stdin?.write(A+`
|
|
1565
|
-
`)}f.on("line",$=>{let R;try{R=JSON.parse($)}catch{return}if(typeof R.id=="number"&&m.has(R.id)){let B=m.get(R.id);if(m.delete(R.id),R.error){let k=R.error,I=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(R.error);B.reject(zi(`codex app-server error: ${I}`,k))}else B.resolve(R);e.onEvent?.(R);return}let A=R.method;if(!A){e.onEvent?.(R);return}if(A==="thread/started"){let k=R.params?.thread;k?.id&&(h=k.id)}let Y=ue()?B=>{
|
|
1566
|
-
`),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:$ instanceof Error?$.message:String($)});let A=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let R=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(h=R.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch($){et(c).catch(()=>{}),n($ instanceof Error?$:new Error(String($)))}})()})}var cR,U_=T(()=>{"use strict";pe();pe();
|
|
1565
|
+
`)}f.on("line",$=>{let R;try{R=JSON.parse($)}catch{return}if(typeof R.id=="number"&&m.has(R.id)){let B=m.get(R.id);if(m.delete(R.id),R.error){let k=R.error,I=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(R.error);B.reject(zi(`codex app-server error: ${I}`,k))}else B.resolve(R);e.onEvent?.(R);return}let A=R.method;if(!A){e.onEvent?.(R);return}if(A==="thread/started"){let k=R.params?.thread;k?.id&&(h=k.id)}let Y=ue()?B=>{br("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=R.params,k=B?.turn;k?.id&&(_=k.id),Qi(R,w,e.onDelta,Y),ue()&&br("turn/started",{params:B??null})}if(ue()&&(A==="item/started"||A==="item/completed")){let B=R.params;B?.item?.type==="agentMessage"&&br(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=R.params;ue()&&br("agentMessage/delta",{params:B??null})}Qi(R,w,e.onDelta,Y)}if(A==="turn/completed"){let B=R.params;if(ue())for(let[I,C]of w.agentItems.entries())C.buffer&&br("turn/completed/unflushed-item",{itemId:I,phase:C.phase,bufferLen:C.buffer.length});Ed(w),ue()&&br("turn/completed",{params:B??null});let k=vd(R,S);k.shouldReject?(ue()&&br("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,g=!0,c.stdin?.end(),n(k.turnError)):(g=!0,c.stdin?.end())}if(A==="error"){let B=Td(R,S);if(ue()){let k=R.params,I=k?.error,C=typeof I?.message=="string"?I.message:"(no message)";br(B.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:B.willRetry,params:k??null})}}e.onEvent?.(R)});let F="";c.stderr?.on("data",$=>{F+=$.toString()}),c.on("error",$=>{M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:$.message}),n(new be(`Failed to spawn codex app-server: ${$.message}`,{cause:$}))}),c.on("exit",$=>{if(!u&&!y){if(g){r({result:w.resultText,threadId:h,turnId:_,durationMs:Date.now()-E,exitCode:$});return}if(S.pendingCodexError){n(S.pendingCodexError);return}M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:$,stderr_tail:F.slice(0,500)}),n(new Error(fR({exitCode:$,stderr:F})))}}),(async()=>{try{if(await x("initialize",uR()),J("initialized",{}),e.threadId)try{let $=x("thread/resume",{threadId:e.threadId,sandbox:d,approvalPolicy:"never",...e.model?{model:e.model}:{}}),R=new Promise((A,Y)=>setTimeout(()=>Y(new Error("resume timeout")),5e3));await Promise.race([$,R]),h=e.threadId}catch($){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1566
|
+
`),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:$ instanceof Error?$.message:String($)});let A=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let R=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(h=R.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch($){et(c).catch(()=>{}),n($ instanceof Error?$:new Error(String($)))}})()})}var cR,U_=T(()=>{"use strict";pe();pe();Sn();xs();kn();hd();pe();gt();bd();bd();cR=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(lR(dR(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as B_,mkdirSync as mR,readFileSync as H_,writeFileSync as W_}from"node:fs";import{join as Rs,resolve as pR}from"node:path";function X_(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 Sd(t,e,r={existsSync:B_,readFileSync:H_}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=pR(e,s.sessiondir??e);for(let o of _R(i)){let a=hR(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(X_(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function _R(t){return[Rs(t,".opencode","opencode.jsonc"),Rs(t,"opencode.jsonc"),Rs(t,"opencode.json")]}function hR(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(gR(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function gR(t){let e="",r=!1,n="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(r){e+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
|
|
1567
1567
|
`;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function eo(t,e={}){let r=Rs(t,".opencode"),n=Rs(r,"opencode.json");if(!B_(n)){mR(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return W_(n,o+`
|
|
1568
1568
|
`,"utf-8"),!0}let s;try{s=JSON.parse(H_(n,"utf-8"))}catch{return console.log(q_.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(q_.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),X_(s.permission)||M({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.`}),i&&W_(n,JSON.stringify(s,null,2)+`
|
|
1569
|
-
`,"utf-8"),i}var q_,to=T(()=>{"use strict";pe();q_={yellow:t=>t}});function K_(t){let e=[...t.matchAll(yR)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return J_(t.slice(n).trimStart())}return J_(bR(t.replace(ER,"")))}function bR(t){let e=wR.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(TR)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function J_(t){let e=[...t.matchAll(vR)];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
|
|
1569
|
+
`,"utf-8"),i}var q_,to=T(()=>{"use strict";pe();q_={yellow:t=>t}});function K_(t){let e=[...t.matchAll(yR)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return J_(t.slice(n).trimStart())}return J_(bR(t.replace(ER,"")))}function bR(t){let e=wR.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(TR)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function J_(t){let e=[...t.matchAll(vR)];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 In(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function V_(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function kd(t={}){let e="",r="",n="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?K_(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=V_(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let d=a.params?.update;if(d?.sessionUpdate!=="agent_message_chunk")return!1;let c=d.content,u=typeof c?.text=="string"?c.text:"";return u&&i&&(r+=u,t.onDelta?.(u)),!0},finalize(){return s?o():null}}}var G_,yR,ER,wR,TR,vR,Id=T(()=>{"use strict";G_="(?:png|jpe?g|webp|heic|pdf)",yR=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${G_}\\s*`,"gi"),ER=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${G_}\\s*`,"i"),wR=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,TR=/^STANCE:\s+\S+\s*$/gim,vR=/\[Thought:\s*true\]\s*/gi});import{spawn as Y_}from"node:child_process";import{existsSync as SR}from"node:fs";import{createInterface as kR}from"node:readline";function IR(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
1570
1570
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
1571
1571
|
${e}
|
|
1572
1572
|
|
|
1573
1573
|
${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized"))return e;let r=e.split(/\r?\n/),n=[];for(let s=0;s<r.length;s++){let i=r[s];if(i.includes("Error handling notification")&&i.includes("notifications/initialized")){let o=[i],a=s;for(;a+1<r.length&&o.length<8&&(a++,o.push(r[a]),r[a].trim()!=="}"););let l=o.join(`
|
|
1574
1574
|
`);if(/\bcode:\s*-32601\b/.test(l)&&/Method not found[^]*notifications\/initialized/.test(l)){s=a;continue}}n.push(i)}return n.join(`
|
|
1575
|
-
`)}function z_(t,e){let r=kR({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,d)=>{let c=AR++;n.set(c,{resolve:l,reject:d});let u=JSON.stringify({jsonrpc:"2.0",id:c,method:o,params:a});
|
|
1575
|
+
`)}function z_(t,e){let r=kR({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,d)=>{let c=AR++;n.set(c,{resolve:l,reject:d});let u=JSON.stringify({jsonrpc:"2.0",id:c,method:o,params:a});De({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:c,params:a}),t.stdin?.write(`${u}
|
|
1576
1576
|
`)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
|
|
1577
|
-
`)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(
|
|
1578
|
-
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new be("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ad(t){let e;try{e=Y_(t.binaryPath??Nd.opencode.binary,Nd.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Je(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=z_(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(c,u=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(c);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(c))}},a=c=>{o({status:"unavailable",reason:"spawn",error:c.message},!1)},l=(c,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(c)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let c=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=
|
|
1577
|
+
`)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(De({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let d=n.get(a.id);if(n.delete(a.id),a.error){let c=a.error,u=typeof c?.message=="string"&&c.message.length>0?c.message:JSON.stringify(a.error);d.reject(zi(`ACP RPC error: ${u}`,c))}else d.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){M({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let d=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});De({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${d}
|
|
1578
|
+
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new be("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ad(t){let e;try{e=Y_(t.binaryPath??Nd.opencode.binary,Nd.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Je(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=z_(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(c,u=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(c);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(c))}},a=c=>{o({status:"unavailable",reason:"spawn",error:c.message},!1)},l=(c,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(c)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let c=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=In(c);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(c){o({status:"unavailable",reason:"handshake",error:c instanceof Error?c.message:String(c)})}})()})}function Z_(t,e){let r=Nd[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{eo(e.cwd)}catch(y){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=vr("gemini","plan"),E=vr("gemini","yolo");a=a.filter(w=>!(E??[]).includes(w)),y&&a.push(...y)}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.
|
|
1579
1579
|
`),M({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{yt(e.tool,a,l)}catch(y){return s(y)}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.
|
|
1580
|
-
`),M({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!SR(e.cwd))return M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=Y_(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)}),c=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(d).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-c}),et(d).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=e.sessionId||"",m=kd({tool:e.tool,onDelta:e.onDelta});m.setSessionId(f);let p=z_(d,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:h,sendNotification:_}=p,g="";d.stderr?.on("data",y=>{g+=y.toString()}),d.on("error",y=>{p.close(y),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-c}),s(new be(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),d.on("exit",y=>{if(p.close(new be(`ACP process exited with code ${String(y)}`)),u)return;let E=m.finalize();if(E!==null)n({result:E.result,sessionId:E.sessionId,durationMs:Date.now()-c,stopReason:E.stopReason,exitCode:y});else{let w=NR(e.tool,g);M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:w.slice(0,500),elapsed_ms:Date.now()-c}),s(new Error(IR({tool:e.tool,exitCode:y,stderr:w})))}}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),_("notifications/initialized"),e.sessionId)try{let w=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});f=
|
|
1581
|
-
`),M({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:w instanceof Error?w.message:String(w)});let S=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=
|
|
1580
|
+
`),M({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!SR(e.cwd))return M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=Y_(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)}),c=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(d).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-c}),et(d).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=e.sessionId||"",m=kd({tool:e.tool,onDelta:e.onDelta});m.setSessionId(f);let p=z_(d,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:h,sendNotification:_}=p,g="";d.stderr?.on("data",y=>{g+=y.toString()}),d.on("error",y=>{p.close(y),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-c}),s(new be(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),d.on("exit",y=>{if(p.close(new be(`ACP process exited with code ${String(y)}`)),u)return;let E=m.finalize();if(E!==null)n({result:E.result,sessionId:E.sessionId,durationMs:Date.now()-c,stopReason:E.stopReason,exitCode:y});else{let w=NR(e.tool,g);M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:w.slice(0,500),elapsed_ms:Date.now()-c}),s(new Error(IR({tool:e.tool,exitCode:y,stderr:w})))}}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),_("notifications/initialized"),e.sessionId)try{let w=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});f=In(w,e.sessionId),m.setSessionId(f)}catch(w){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${w instanceof Error?w.message:String(w)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
1581
|
+
`),M({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:w instanceof Error?w.message:String(w)});let S=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=In(S),m.setSessionId(f)}else{let w=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=In(w),m.setSessionId(f)}if(e.tool==="kimi"){let w=o==="plan"?"plan":"auto";try{await h("session/set_config_option",{sessionId:f,configId:"mode",value:w}),Ze(`acp: set_config_option(mode=${w}) ok`)}catch(S){let x=S instanceof Error?S.message:String(S);throw M({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:w,error_message:x}),new Error(`Cannot set Kimi ACP permission mode to ${w}: ${x}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await h("session/set_config_option",{sessionId:f,configId:"model",value:e.model}),Ze(`acp: set_config_option(model=${e.model}) ok`)}catch(w){let S=w instanceof Error?w.message:String(w);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${S}
|
|
1582
1582
|
`),M({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:S})}if(e.effort&&e.tool==="opencode"){let w="effort";try{await h("session/set_config_option",{sessionId:f,configId:w,value:e.effort}),Ze(`acp: set_config_option(${w}=${e.effort}) ok`)}catch(S){let x=S instanceof Error?S.message:String(S);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${x}
|
|
1583
|
-
`),M({event:"acp_config_option_failed",provider:e.tool,config_id:w,value:e.effort,error_message:x})}}m.beginTurn(),Ze(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:f,prompt:[{type:"text",text:t}]}),E=m.completeTurn(y);Ze(`acp: result received (${E.result.length} chars, stopReason=${E.stopReason})`),d.stdin?.end()}catch(y){et(d).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Nd,AR,xd=T(()=>{"use strict";pe();
|
|
1583
|
+
`),M({event:"acp_config_option_failed",provider:e.tool,config_id:w,value:e.effort,error_message:x})}}m.beginTurn(),Ze(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:f,prompt:[{type:"text",text:t}]}),E=m.completeTurn(y);Ze(`acp: result received (${E.result.length} chars, stopReason=${E.stopReason})`),d.stdin?.end()}catch(y){et(d).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Nd,AR,xd=T(()=>{"use strict";pe();Sn();xs();kn();to();pe();gt();Id();Id();Nd={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},AR=1});function we(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Q_(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=xR){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 RR(){let t=new Map;return(e,r)=>{LR(e,Q_(t,r))}}function LR(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,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=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,d=[];s!==void 0&&d.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&d.push(`HTTP ${o}`),l!==void 0&&d.push(`retry in ${Math.round(l/1e3)}s`),a&&d.push(we(a,60));let c=d.length>0?d.join(", "):n;e({kind:"api_retry",summary:c});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(we(i,80)),e({kind:"other",summary:o.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 i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:we(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,d=i.input,c="";d&&(typeof d.command=="string"?c=d.command:typeof d.file_path=="string"?c=d.file_path:typeof d.path=="string"?c=d.path:typeof d.pattern=="string"?c=d.pattern:typeof d.url=="string"?c=d.url:c=we(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:we(c),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:we(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",d=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,c,u=i.content;if(typeof u=="string")c=`${u.split(`
|
|
1584
1584
|
`).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(c=`${f.split(`
|
|
1585
|
-
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:c,id:d,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}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?RR():void 0,s=await M_(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?i=>n(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function OR(){let t=new Map;return(e,r)=>{CR(e,Q_(t,r))}}function CR(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:
|
|
1586
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${
|
|
1587
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${
|
|
1588
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}function UR(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function WR(t,e){if(e===void 0)return;let r={input:e};if(t!=="apply_patch"||typeof e!="string")return r;let n=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return n.length>0&&(r.path=n[0].path,r.paths=n.map(s=>s.path),r.kinds=n.map(s=>s.kind)),r}async function nh(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let d=l.payload;if(d.type==="message"&&d.role==="user"&&d.content)for(let c of d.content)c.type==="input_text"&&typeof c.text=="string"&&c.text&&e++;else if(d.type==="message"&&d.role==="assistant"&&d.content)for(let c of d.content)c.type==="output_text"&&typeof c.text=="string"&&c.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 d=l.payload.info.total_token_usage;r=d.input_tokens??r,n=d.cached_input_tokens??d.cache_read_input_tokens??n,s=d.output_tokens??s,i=d.reasoning_output_tokens??i;let c=FR(l.payload.info.last_token_usage);c&&(o=c),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:i,lastTokenUsage:o,modelContextWindow:a}}var no,sh=T(()=>{"use strict";tr();no=class{name="codex";codexDirs;constructor(e={}){let r=[Ls(ve,".codex"),Ls(ve,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Ls(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Ls(r,"sessions");try{await th(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 i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await MR(e)}catch{return r}for(let s of n){let i=Ls(e,s),o=await th(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=jR(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 Xe(e,30),n=await Oe(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,d,c,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(d||(d=H(h.trim(),80)),c=H(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(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(d||(d=H(h.text.trim(),80)),c=H(h.text.trim(),80))}}if(!i)return null;let m=await nh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:rh(u,f),firstUserMessage:d,lastUserMessage:c,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 Oe(r),s=[],i="",o,a,l,d,c,u=e,f,m,p=new Set;for await(let _ of Be(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=rh(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let y=_.payload;if(y.type==="message"){if(y.role==="user"&&y.content){for(let E of y.content)if(E.type==="input_text"&&typeof E.text=="string"&&E.text){let w=E.text.trim();d||(d=H(w,80)),c=H(w,80),Os(s,p,{role:"user",timestamp:g,content:fe(w)})}continue}if(y.role==="assistant"&&y.content){for(let E of y.content)E.type==="output_text"&&typeof E.text=="string"&&E.text&&Os(s,p,{role:"assistant",timestamp:g,content:fe(E.text),model:a});continue}if(y.role!=="user"&&y.role!=="assistant"&&y.content){for(let E of y.content)(E.type==="input_text"||E.type==="output_text")&&typeof E.text=="string"&&E.text&&Os(s,p,{role:"system",timestamp:g,content:fe(E.text.trim())});continue}}if(y.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.arguments!==void 0?fe(
|
|
1589
|
-
`);E.trim()&&Os(s,p,{role:"thinking",timestamp:g,content:fe(E)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let y=_.payload.message||_.payload.text;y&&Os(s,p,{role:"thinking",timestamp:g,content:fe(y)})}}if(!i)return null;let h=await nh(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:d,lastUserMessage:c,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await DR(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Xe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function $d(t){return new Cd(t)}var Cd,Md=T(()=>{"use strict";sh();$t();
|
|
1585
|
+
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:c,id:d,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}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?RR():void 0,s=await M_(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?i=>n(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function OR(){let t=new Map;return(e,r)=>{CR(e,Q_(t,r))}}function CR(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:we(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:we(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",d=s.rawInput;d&&(typeof d.command=="string"?l=d.command:typeof d.file_path=="string"?l=d.file_path:typeof d.path=="string"?l=d.path:l=we(JSON.stringify(d))),e({kind:"tool_use",tool:o,summary:we(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,d=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",c=d?`running\u2026 ${we(d,80)}`:"running\u2026";e({kind:"other",summary:c,id:a})}return}e({kind:"other",summary:i})}}async function Sr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&De({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?OR():void 0,s=await Z_(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?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function $R(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,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${we(o,120)}`}:{kind:"other",summary:`codex error: ${we(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,d=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:we(d||"(command)"),id:a});else{let c=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof c=="number"?`exit ${c}`:u||"done",p=[];typeof c=="number"?p.push(`exit ${c}`):u&&p.push(u),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(o){let l=s.changes,d=Array.isArray(l)?l.map(c=>c.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:we(d||"(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",d=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${d}`,summary:"",id:a});else{let c=s.status||"done";e({kind:"tool_result",summary:c,status:c,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:we(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:we(s)}:{kind:"text",summary:we(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:we(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
|
|
1586
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${we(o,60)}`:we(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 i=s.split(`
|
|
1587
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${we(o,60)}`:we(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 eh(t,e){let r=await F_(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>$R(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var xR,kr=T(()=>{"use strict";D_();U_();xd();pe();xR=256});function Ld(t){return new Rd(t)}var Rd,Od=T(()=>{"use strict";v_();$t();kr();ht();Rd=class extends xe{constructor(e){super({provider:new Gi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:ro})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as MR,stat as th,unlink as DR}from"node:fs/promises";import{join as Ls,basename as jR}from"node:path";function PR(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Os(t,e,r){let n=PR(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function rh(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function FR(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 Nn(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 Nn(r)}).filter(r=>r.length>0).join(`
|
|
1588
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}function UR(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function WR(t,e){if(e===void 0)return;let r={input:e};if(t!=="apply_patch"||typeof e!="string")return r;let n=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return n.length>0&&(r.path=n[0].path,r.paths=n.map(s=>s.path),r.kinds=n.map(s=>s.kind)),r}async function nh(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let d=l.payload;if(d.type==="message"&&d.role==="user"&&d.content)for(let c of d.content)c.type==="input_text"&&typeof c.text=="string"&&c.text&&e++;else if(d.type==="message"&&d.role==="assistant"&&d.content)for(let c of d.content)c.type==="output_text"&&typeof c.text=="string"&&c.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 d=l.payload.info.total_token_usage;r=d.input_tokens??r,n=d.cached_input_tokens??d.cache_read_input_tokens??n,s=d.output_tokens??s,i=d.reasoning_output_tokens??i;let c=FR(l.payload.info.last_token_usage);c&&(o=c),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:i,lastTokenUsage:o,modelContextWindow:a}}var no,sh=T(()=>{"use strict";tr();no=class{name="codex";codexDirs;constructor(e={}){let r=[Ls(ve,".codex"),Ls(ve,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Ls(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Ls(r,"sessions");try{await th(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 i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await MR(e)}catch{return r}for(let s of n){let i=Ls(e,s),o=await th(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=jR(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 Xe(e,30),n=await Oe(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,d,c,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(d||(d=H(h.trim(),80)),c=H(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(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(d||(d=H(h.text.trim(),80)),c=H(h.text.trim(),80))}}if(!i)return null;let m=await nh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:rh(u,f),firstUserMessage:d,lastUserMessage:c,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 Oe(r),s=[],i="",o,a,l,d,c,u=e,f,m,p=new Set;for await(let _ of Be(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=rh(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let y=_.payload;if(y.type==="message"){if(y.role==="user"&&y.content){for(let E of y.content)if(E.type==="input_text"&&typeof E.text=="string"&&E.text){let w=E.text.trim();d||(d=H(w,80)),c=H(w,80),Os(s,p,{role:"user",timestamp:g,content:fe(w)})}continue}if(y.role==="assistant"&&y.content){for(let E of y.content)E.type==="output_text"&&typeof E.text=="string"&&E.text&&Os(s,p,{role:"assistant",timestamp:g,content:fe(E.text),model:a});continue}if(y.role!=="user"&&y.role!=="assistant"&&y.content){for(let E of y.content)(E.type==="input_text"||E.type==="output_text")&&typeof E.text=="string"&&E.text&&Os(s,p,{role:"system",timestamp:g,content:fe(E.text.trim())});continue}}if(y.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.arguments!==void 0?fe(Nn(y.arguments)):void 0,toolInputData:UR(y.arguments),toolCallId:y.call_id});continue}if(y.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(Nn(y.output)),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.input!==void 0?fe(Nn(y.input)):void 0,toolInputData:WR(y.name,y.input),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(Nn(y.output)),toolCallId:y.call_id});continue}if(y.type==="reasoning"&&y.summary){let E=y.summary.map(w=>Nn(w.text)).join(`
|
|
1589
|
+
`);E.trim()&&Os(s,p,{role:"thinking",timestamp:g,content:fe(E)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let y=_.payload.message||_.payload.text;y&&Os(s,p,{role:"thinking",timestamp:g,content:fe(y)})}}if(!i)return null;let h=await nh(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:d,lastUserMessage:c,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await DR(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Xe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function $d(t){return new Cd(t)}var Cd,Md=T(()=>{"use strict";sh();$t();kr();ht();Cd=class extends xe{constructor(e){super({provider:new no(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:`${ge}
|
|
1590
1590
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:eh})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Cs(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 so(t){let e=Cs(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(`
|
|
1591
1591
|
`).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 i=[],o=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 d=l;if("$set"in d&&d.$set&&typeof d.$set=="object"){Object.assign(s,d.$set);continue}if(typeof d.id=="string"||typeof d.type=="string"){let c=d;if(typeof c.id=="string"){let u=o.get(c.id);u?qR(u,c):(i.push(c),o.set(c.id,c))}else i.push(c)}}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:i}}function qR(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&ih(t.tokens)&&ih(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function ih(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function oh(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
|
|
1592
1592
|
`)+`
|
|
1593
1593
|
`}var Dd=T(()=>{"use strict"});import{createHash as BR}from"node:crypto";import{readdir as $s,readFile as ah,stat as io,unlink as HR}from"node:fs/promises";import{join as rt,basename as XR,dirname as JR}from"node:path";import{cwd as GR}from"node:process";function lh(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function dh(t){return t==="user"}function jd(t){return t==="gemini"||t==="assistant"}function Gr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function KR(t){return`${t.sessionId}\0${t.cwd}`}function VR(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function oo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function ch(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!jd(a.type)||!a.tokens)continue;let l=oo(a.tokens.input),d=oo(a.tokens.cached),c=Math.max(l-d,0),u=oo(a.tokens.output),f=oo(a.tokens.thoughts);e+=l,r+=d,n+=u,s+=f,i=l,o={inputTokens:c,cachedInputTokens:d,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function YR(t){return BR("sha256").update(t).digest("hex")}function Ms(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=JR(r);if(n===r)break;r=n}}var ao,uh=T(()=>{"use strict";tr();Dd();pe();ao=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||rt(ve,".gemini");this.geminiProjectsFile=rt(r,"projects.json"),this.geminiTmpDir=rt(r,"tmp");let n=e.claudeDir||rt(ve,".claude");this.claudeProjectsDir=rt(n,"projects");let s=[rt(ve,".codex"),rt(ve,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>rt(o,"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 i=KR(s),o=r.get(i);r.set(i,o?VR(o,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 Oe(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",d=await this.resolveWorkspace(l),c,u,f;for(let _ of o){let g=Gr(_.timestamp),y=_.type,E=fe(lh(_.content));if(dh(y)){let S=E.trim();S&&(c||(c=H(S,80)),u=H(S,80)),i.push({role:"user",timestamp:g,content:S||E});continue}if(jd(y)){_.model&&(f=_.model);for(let S of _.thoughts||[]){let x=[S.subject,S.description].filter(Boolean).join(`
|
|
1594
|
-
`).trim();x&&i.push({role:"thinking",timestamp:Gr(S.timestamp,g),content:fe(x)})}i.push({role:"assistant",timestamp:g,content:E,model:_.model});continue}let w=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${w}${E}`.trim()})}let m=Gr(n.startTime,s.createdAt),p=Gr(n.lastUpdated,s.modifiedAt),h=ch(o);return{provider:"gemini",sessionId:a,cwd:d,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:c,lastUserMessage:u,messageCount:i.filter(_=>_.role==="user"||_.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:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Oe(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,d,c,u=0;for(let m of s)if(dh(m.type)){u++;let p=lh(m.content).trim();p&&(l||(l=H(fe(p),80)),d=H(fe(p),80))}else jd(m.type)&&(u++,m.model&&(c=m.model));let f=ch(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Gr(r.startTime,n.createdAt),modifiedAt:Gr(r.lastUpdated,n.modifiedAt),model:c,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:u,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 ah(e,"utf-8");if(Cs(r)==="unknown")return M({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 so(r)}catch{return null}}extractSessionIdFromFilename(e){let r=XR(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 $s(this.geminiTmpDir)}catch{return e}for(let n of r){let s=rt(this.geminiTmpDir,n,"chats");if(!(await io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(rt(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await HR(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let c=await Oe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Gr(i?.lastUpdated,c.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.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;Ms(e,GR());for(let n of this.extraWorkspacePaths)Ms(e,n);for(let n of await this.collectGeminiProjectPaths())Ms(e,n);for(let n of await this.collectCodexCwds())Ms(e,n);for(let n of await this.collectClaudeCwds())Ms(e,n);let r=new Map;for(let n of e)r.set(YR(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await ah(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 o=(await Xe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await $s(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=rt(this.claudeProjectsDir,n);if(!(await io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=rt(s,a),c=(await Xe(l,1).catch(()=>[]))[0]?.cwd;c&&e.add(c)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await io(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await $s(e)}catch{return r}for(let i of s){let o=rt(e,i),a=await io(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as zR,writeFileSync as ZR,mkdirSync as QR}from"node:fs";import{join as e0,dirname as t0}from"node:path";import{randomUUID as r0}from"node:crypto";function Fd(t){return new Pd(t)}var Pd,Ud=T(()=>{"use strict";uh();$t();
|
|
1595
|
-
`)}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Vi,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=zR(n,"utf-8"),i=Cs(s),o=so(s),a=r0();o.sessionId=a,o.kind="main";let l=t0(n),d=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),c=i==="jsonl"?".jsonl":".json",u=`session-${d}-${a.slice(0,8)}${c}`,f=e0(l,u);return QR(l,{recursive:!0}),ZR(f,oh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as fh,readFile as n0,rm as s0,stat as
|
|
1594
|
+
`).trim();x&&i.push({role:"thinking",timestamp:Gr(S.timestamp,g),content:fe(x)})}i.push({role:"assistant",timestamp:g,content:E,model:_.model});continue}let w=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${w}${E}`.trim()})}let m=Gr(n.startTime,s.createdAt),p=Gr(n.lastUpdated,s.modifiedAt),h=ch(o);return{provider:"gemini",sessionId:a,cwd:d,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:c,lastUserMessage:u,messageCount:i.filter(_=>_.role==="user"||_.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:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Oe(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,d,c,u=0;for(let m of s)if(dh(m.type)){u++;let p=lh(m.content).trim();p&&(l||(l=H(fe(p),80)),d=H(fe(p),80))}else jd(m.type)&&(u++,m.model&&(c=m.model));let f=ch(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Gr(r.startTime,n.createdAt),modifiedAt:Gr(r.lastUpdated,n.modifiedAt),model:c,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:u,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 ah(e,"utf-8");if(Cs(r)==="unknown")return M({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 so(r)}catch{return null}}extractSessionIdFromFilename(e){let r=XR(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 $s(this.geminiTmpDir)}catch{return e}for(let n of r){let s=rt(this.geminiTmpDir,n,"chats");if(!(await io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(rt(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await HR(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let c=await Oe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Gr(i?.lastUpdated,c.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.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;Ms(e,GR());for(let n of this.extraWorkspacePaths)Ms(e,n);for(let n of await this.collectGeminiProjectPaths())Ms(e,n);for(let n of await this.collectCodexCwds())Ms(e,n);for(let n of await this.collectClaudeCwds())Ms(e,n);let r=new Map;for(let n of e)r.set(YR(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await ah(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 o=(await Xe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await $s(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=rt(this.claudeProjectsDir,n);if(!(await io(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=rt(s,a),c=(await Xe(l,1).catch(()=>[]))[0]?.cwd;c&&e.add(c)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await io(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await $s(e)}catch{return r}for(let i of s){let o=rt(e,i),a=await io(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as zR,writeFileSync as ZR,mkdirSync as QR}from"node:fs";import{join as e0,dirname as t0}from"node:path";import{randomUUID as r0}from"node:crypto";function Fd(t){return new Pd(t)}var Pd,Ud=T(()=>{"use strict";uh();$t();kr();ht();Dd();Pd=class extends xe{constructor(e){super({provider:new ao(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",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Sr(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(`
|
|
1595
|
+
`)}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Vi,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=zR(n,"utf-8"),i=Cs(s),o=so(s),a=r0();o.sessionId=a,o.kind="main";let l=t0(n),d=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),c=i==="jsonl"?".jsonl":".json",u=`session-${d}-${a.slice(0,8)}${c}`,f=e0(l,u);return QR(l,{recursive:!0}),ZR(f,oh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as fh,readFile as n0,rm as s0,stat as An}from"node:fs/promises";import{basename as i0,join as Et}from"node:path";function o0(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},r=!1;for(let n of Object.values(t))n?.usage&&(r=!0,e.inputTokens+=n.usage.inputTokens??0,e.outputTokens+=n.usage.outputTokens??0,e.cacheReadTokens+=n.usage.cacheReadTokens??0,e.cacheWriteTokens+=n.usage.cacheWriteTokens??0,e.reasoningTokens+=n.usage.reasoningTokens??0);return r?e:null}function Wd(){return{shutdownTotals:null,assistantOutputSum:0}}function ph(t,e){if(e.type==="assistant.message"){let r=e.data?.outputTokens;typeof r=="number"&&(t.assistantOutputSum+=r,t.lastAssistantOutputTokens=r)}else if(e.type==="session.shutdown"){let r=o0(e.data?.modelMetrics);r&&(t.shutdownTotals=r)}}function mh(t){let e=t.shutdownTotals,r=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:r}}function a0(t){let e={};for(let r of t.split(`
|
|
1596
1596
|
`)){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 Kr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function l0(t){let e=0,r=Wd();for await(let n of Be(t))(n.type==="user.message"||n.type==="assistant.message"&&(n.data?.content||"").trim())&&e++,ph(r,n);return{messageCount:e,tokens:r}}function d0(t){let e=c0(t),r=new Map;for(let n of t){if(n.role!=="tool_use"||n.toolCallId===void 0)continue;if(n.toolName==="bash"){let l=e.get(n.toolCallId),c=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
|
|
1597
|
-
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(c===void 0)continue;let u=`copilot-shell:${c}:${n.toolCallId}`;r.set(c,u),n.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(n.toolName??""))continue;let s=n.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=r.get(i);if(o===void 0)continue;n.backgroundTaskId=o;let a=e.get(n.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function c0(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var lo,_h=T(()=>{"use strict";tr();lo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||Et(ve,".copilot");this.sessionStateDir=Et(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await fh(this.sessionStateDir)}catch{return e}for(let n of r){let s=Et(this.sessionStateDir,n);if((await
|
|
1597
|
+
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(c===void 0)continue;let u=`copilot-shell:${c}:${n.toolCallId}`;r.set(c,u),n.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(n.toolName??""))continue;let s=n.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=r.get(i);if(o===void 0)continue;n.backgroundTaskId=o;let a=e.get(n.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function c0(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var lo,_h=T(()=>{"use strict";tr();lo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||Et(ve,".copilot");this.sessionStateDir=Et(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await fh(this.sessionStateDir)}catch{return e}for(let n of r){let s=Et(this.sessionStateDir,n);if((await An(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=Et(r,"events.jsonl"),i=await An(s).catch(()=>null),o=i?s:Et(r,"workspace.yaml"),a=await Oe(i?s:r),l=[],d=n?.cwd||"(unknown workspace)",c,u,f,m,p,h,_=n?.id||i0(r)||e,g=Wd();if(i)for await(let y of Be(s)){let E=Kr(y.timestamp)||a.modifiedAt;if(ph(g,y),y.type==="session.start"&&y.data){y.data.sessionId&&(_=y.data.sessionId),y.data.copilotVersion&&(u=y.data.copilotVersion),y.data.startTime&&(h=Kr(y.data.startTime)),y.data.selectedModel&&(c=y.data.selectedModel),y.data.context&&(y.data.context.cwd&&(d=y.data.context.cwd),y.data.context.branch&&(f=y.data.context.branch));continue}if(y.type==="session.model_change"&&y.data?.newModel){c=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let w=y.data.content||"",S=w.trim();S&&(m||(m=H(S,80)),p=H(S,80)),l.push({role:"user",timestamp:E,content:fe(S||w)});continue}if(y.type==="assistant.message"&&y.data){let w=(y.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:E,content:fe(w),model:c}),y.data.toolRequests)for(let S of y.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:S.name||"unknown tool",toolName:S.name,toolInput:S.arguments?JSON.stringify(S.arguments,null,2):void 0,toolInputData:Ct(S.arguments),toolCallId:S.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let w=y.data.result?.content||"",S=y.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:fe(w),toolDetailedContent:S?fe(S):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:E,content:fe(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let w=y.data?.message||"";w.trim()&&l.push({role:"system",timestamp:E,content:fe(w)});continue}}if(!m){let y=(n?.summary||"").trim();y&&(m=H(y,80))}return d0(l),{provider:"copilot",sessionId:_,cwd:d,createdAt:h??Kr(n?.created_at)??a.createdAt,modifiedAt:Kr(n?.updated_at)??a.modifiedAt,model:c,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...mh(g),messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=Et(e,"events.jsonl"),i=await An(s).catch(()=>null),o=i?s:Et(e,"workspace.yaml"),a=await Oe(i?s:e),l=i?await Xe(s,20):[],d=n?.id||r,c=n?.cwd||"(unknown workspace)",u,f,m,p,h;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(d=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=Kr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(c=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(u||(u=g.data.newModel)),g.type==="user.message"&&g.data){let y=(g.data.content||"").trim();y&&(p||(p=H(y,80)),h=H(y,80))}if(!p){let g=(n?.summary||"").trim();g&&(p=H(g,80))}let _=i?await l0(s):{messageCount:0,tokens:Wd()};return{provider:"copilot",sessionId:d,cwd:c,createdAt:m??Kr(n?.created_at)??a.createdAt,modifiedAt:Kr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:_.messageCount,filePath:o,...mh(_.tokens)}}async readWorkspaceYaml(e){let r=Et(e,"workspace.yaml");try{let n=await n0(r,"utf-8");return a0(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await s0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await fh(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=Et(this.sessionStateDir,e);if((await An(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=Et(this.sessionStateDir,s);(await An(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=Et(this.sessionStateDir,s);if(!(await An(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Bd(t){return new qd(t)}var qd,Hd=T(()=>{"use strict";_h();$t();kr();pe();ht();qd=class extends xe{constructor(e){super({provider:new lo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>Sr(r,{...n,acpTool:"copilot"})})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return De({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as hh,readdirSync as u0,statSync as gh}from"node:fs";import{join as Ir}from"node:path";import{createRequire as f0}from"node:module";function yh(){return Xd===null&&(Xd=f0(import.meta.url)("node:sqlite").DatabaseSync),Xd}function Eh(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function wh(t,e){if(!e)return;t.observed=!0;let r=e.input??0,n=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=r,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=n,t.totalReasoningOutputTokens+=s,r+n+s+i+o>0){let a=r+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:r,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:n,reasoningOutputTokens:s,totalTokens:a+n+s}}}function Th(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function m0(){let t=process.env.XDG_DATA_HOME||Ir(ve,".local","share"),e=process.env.XDG_CONFIG_HOME||Ir(ve,".config");return[Ir(t,"opencode","opencode.db"),Ir(e,"opencode","opencode.db")]}function p0(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||Ir(ve,".local","share"),e=Ir(t,"lmplayer"),r=Ir(e,"opencode-local.db"),n=[r];try{let s=u0(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>Ir(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return gh(o).mtimeMs-gh(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function _0(t){return t==="lmplayer"?p0():m0()}var Xd,xn,Jd=T(()=>{"use strict";tr();Xd=null;xn=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=_0(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>hh(e))}openDb(e){return hh(e)?new(yh())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1598
1598
|
s.time_created, s.time_updated
|
|
1599
1599
|
FROM session s
|
|
1600
1600
|
ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),d=a.directory||l?.worktree||"(unknown)",c=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
@@ -1607,14 +1607,14 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1607
1607
|
FROM session s
|
|
1608
1608
|
WHERE s.id LIKE ?
|
|
1609
1609
|
ORDER BY s.time_updated DESC
|
|
1610
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Kd(){return new Gd}var Gd,Vd=T(()=>{"use strict";Jd();$t();
|
|
1610
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Kd(){return new Gd}var Gd,Vd=T(()=>{"use strict";Jd();$t();kr();ht();Gd=class extends xe{constructor(){super({provider:new xn,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",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Sr(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??ge),r}}});import{appendFile as h0,mkdir as g0,readFile as vh,readdir as bh,rm as y0,stat as Sh}from"node:fs/promises";import{basename as E0,dirname as w0,isAbsolute as kh,join as Vr,relative as T0,resolve as Yd}from"node:path";function zd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function S0(t){return typeof t=="number"?new Date(t):zd(t)??new Date(0)}function k0(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
|
|
1611
1611
|
`).trim():""}function Ih(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function I0(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Ih(t)??""}function N0(t){let e=A0(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function A0(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var v0,b0,co,Nh=T(()=>{"use strict";tr();v0="1.4",b0="1.5",co=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Yd(e?.kimiHome??process.env.KIMI_CODE_HOME??Vr(ve,".kimi-code")),this.sessionsDir=Vr(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let r of await this.sessionFiles())try{let n=await this.summary(r);n&&e.push(n)}catch{}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){let r=await this.findSession(e);if(!r)return null;let n=await this.summary(r);if(!n)return null;let s=await this.parseWire(r.wirePath);return{...n,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let r=await this.findSession(e);return r?(await y0(r.sessionDir,{recursive:!0,force:!0}),await g0(w0(this.indexPath()),{recursive:!0,mode:448}),await h0(this.indexPath(),`${JSON.stringify({sessionId:r.sessionId,deleted:!0})}
|
|
1612
|
-
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Vr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),r=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&r.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let n;try{n=await bh(this.sessionsDir,{withFileTypes:!0})}catch{return[...r.values()]}for(let s of n){if(!s.isDirectory())continue;let i=Vr(this.sessionsDir,s.name),o;try{o=await bh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||r.has(a.name))continue;let l=Vr(i,a.name);r.set(a.name,this.filesFor(a.name,l))}}return[...r.values()]}async readIndex(){let e;try{e=await vh(this.indexPath(),"utf-8")}catch{return new Map}let r=new Map;for(let n of e.split(/\r?\n/))if(n.trim())try{let s=JSON.parse(n);if(typeof s.sessionId!="string")continue;s.deleted===!0?r.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&r.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Yd(s.sessionDir),workDir:s.workDir})}catch{}return r}filesFor(e,r,n){return{sessionId:e,sessionDir:r,statePath:Vr(r,"state.json"),wirePath:Vr(r,"agents","main","wire.jsonl"),indexedWorkDir:n}}validSessionDir(e,r){if(!kh(e)||E0(e)!==r)return!1;let n=T0(this.sessionsDir,Yd(e));return n!==""&&n!==".."&&!n.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!kh(n)}async findSession(e){let r=await this.sessionFiles(),n=r.find(i=>i.sessionId===e);if(n)return n;let s=r.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let r=JSON.parse(await vh(e,"utf-8"));return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async summary(e){let r=await this.readState(e.statePath);if(!r)return null;let n;try{n=await Sh(e.wirePath)}catch{return null}let s=await Sh(e.statePath).catch(()=>n),i=await this.parseWire(e.wirePath),o=zd(r.createdAt)??s.birthtime,a=zd(r.updatedAt)??(s.mtime>n.mtime?s.mtime:n.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:r.title,cwd:r.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(r.lastPrompt?H(r.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let r=[],n=!0,s,i,o,a=0,l=0,d=0,c=0,u=!1,f=0,m,p;for await(let h of Be(e)){let _=S0(h.time??h.created_at);if(n&&(n=!1,h.type==="metadata"&&h.protocol_version!==v0)){let y=h.protocol_version===b0?"Kimi experimental v2 transcript format not supported by this lmctl version.":`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if(h.type==="config.update"&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),u||=h.usage!==void 0;let y=h.usage?.inputOther??0,E=h.usage?.inputCacheRead??0,w=h.usage?.inputCacheCreation??0,S=h.usage?.output??0;a+=y,l+=E,d+=w,c+=S,h.usageScope==="turn"&&(m=y+E+w,p={inputTokens:y,cachedInputTokens:E,cacheWriteInputTokens:w,outputTokens:S,totalTokens:m+S});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let y=k0(h.input);y&&(i??=H(y,80),o=H(y,80),r.push({role:"user",timestamp:_,content:y}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let g=h.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(r.push({role:"assistant",timestamp:_,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?r.push({role:"thinking",timestamp:_,content:g.part.think,model:s}):g.type==="tool.call"?r.push({role:"tool_use",timestamp:_,content:g.name??"tool",toolName:g.name,toolInput:Ih(g.args),toolInputData:Ct(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&r.push({role:"tool_result",timestamp:_,content:I0(g.result),toolCallId:g.toolCallId,model:s})}return N0(r),{messages:r,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:u?a:void 0,totalCachedInputTokens:u?l:void 0,totalCacheWriteInputTokens:u?d:void 0,totalOutputTokens:u?c:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function Qd(t){return new Zd(t)}var Zd,ec=T(()=>{"use strict";Nh();$t();
|
|
1612
|
+
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Vr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),r=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&r.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let n;try{n=await bh(this.sessionsDir,{withFileTypes:!0})}catch{return[...r.values()]}for(let s of n){if(!s.isDirectory())continue;let i=Vr(this.sessionsDir,s.name),o;try{o=await bh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||r.has(a.name))continue;let l=Vr(i,a.name);r.set(a.name,this.filesFor(a.name,l))}}return[...r.values()]}async readIndex(){let e;try{e=await vh(this.indexPath(),"utf-8")}catch{return new Map}let r=new Map;for(let n of e.split(/\r?\n/))if(n.trim())try{let s=JSON.parse(n);if(typeof s.sessionId!="string")continue;s.deleted===!0?r.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&r.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Yd(s.sessionDir),workDir:s.workDir})}catch{}return r}filesFor(e,r,n){return{sessionId:e,sessionDir:r,statePath:Vr(r,"state.json"),wirePath:Vr(r,"agents","main","wire.jsonl"),indexedWorkDir:n}}validSessionDir(e,r){if(!kh(e)||E0(e)!==r)return!1;let n=T0(this.sessionsDir,Yd(e));return n!==""&&n!==".."&&!n.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!kh(n)}async findSession(e){let r=await this.sessionFiles(),n=r.find(i=>i.sessionId===e);if(n)return n;let s=r.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let r=JSON.parse(await vh(e,"utf-8"));return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async summary(e){let r=await this.readState(e.statePath);if(!r)return null;let n;try{n=await Sh(e.wirePath)}catch{return null}let s=await Sh(e.statePath).catch(()=>n),i=await this.parseWire(e.wirePath),o=zd(r.createdAt)??s.birthtime,a=zd(r.updatedAt)??(s.mtime>n.mtime?s.mtime:n.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:r.title,cwd:r.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(r.lastPrompt?H(r.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let r=[],n=!0,s,i,o,a=0,l=0,d=0,c=0,u=!1,f=0,m,p;for await(let h of Be(e)){let _=S0(h.time??h.created_at);if(n&&(n=!1,h.type==="metadata"&&h.protocol_version!==v0)){let y=h.protocol_version===b0?"Kimi experimental v2 transcript format not supported by this lmctl version.":`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if(h.type==="config.update"&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),u||=h.usage!==void 0;let y=h.usage?.inputOther??0,E=h.usage?.inputCacheRead??0,w=h.usage?.inputCacheCreation??0,S=h.usage?.output??0;a+=y,l+=E,d+=w,c+=S,h.usageScope==="turn"&&(m=y+E+w,p={inputTokens:y,cachedInputTokens:E,cacheWriteInputTokens:w,outputTokens:S,totalTokens:m+S});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let y=k0(h.input);y&&(i??=H(y,80),o=H(y,80),r.push({role:"user",timestamp:_,content:y}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let g=h.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(r.push({role:"assistant",timestamp:_,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?r.push({role:"thinking",timestamp:_,content:g.part.think,model:s}):g.type==="tool.call"?r.push({role:"tool_use",timestamp:_,content:g.name??"tool",toolName:g.name,toolInput:Ih(g.args),toolInputData:Ct(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&r.push({role:"tool_result",timestamp:_,content:I0(g.result),toolCallId:g.toolCallId,model:s})}return N0(r),{messages:r,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:u?a:void 0,totalCachedInputTokens:u?l:void 0,totalCacheWriteInputTokens:u?d:void 0,totalOutputTokens:u?c:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function Qd(t){return new Zd(t)}var Zd,ec=T(()=>{"use strict";Nh();$t();kr();ht();Zd=class extends xe{constructor(e){super({provider:new co(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ge,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(r,n)=>Sr(r,{...n,acpTool:"kimi"})})}seedArgsFor(e){let r=[];return e?.model&&r.push("--model",e.model),r.push("-p",e?.prompt??ge,"--output-format","stream-json"),r}}});import{spawn as x0}from"node:child_process";import{mkdirSync as R0}from"node:fs";function rc(t){return new tc(t)}async function L0(t,e){let r=Date.now(),n=Ah({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});yt("lmplayer",n,e.permissionMode??"yolo");let s=await xh(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Ah(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...vr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function xh(t,e,r){return new Promise((n,s)=>{let i;try{i=x0(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(_){s(_);return}let o="",a="",l="",d,c,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=_=>{let g=_.trim();if(!g)return;let y;try{y=JSON.parse(g)}catch{u.push(_),r.onText?.(_);return}if(!fo(y))return;let E=uo(y,!1);d===void 0&&E!==void 0&&(d=E),c=uo(y,!0)??c;let w=Rh(y);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",_=>{let g=_.toString("utf8");o+=g,l+=g;let y=l.indexOf(`
|
|
1613
1613
|
`);for(;y>=0;){let E=l.slice(0,y);l=l.slice(y+1),h(E),y=l.indexOf(`
|
|
1614
|
-
`)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{f||(f=!0,p(),l.length>0&&h(l),n({code:_,stdout:o,stderr:a,sessionId:d??c,text:u.join("")}))}),i.on("error",_=>{f||(f=!0,p(),s(_))})})}function Rh(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(fo(r)){let n=Rh(r);if(n)return n}}}function uo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(fo(r)){let n=uo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(fo(s)){let i=uo(s,e);if(i!==void 0)return i}}}function fo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tc,nc=T(()=>{"use strict";Jd();$t();ht();
|
|
1614
|
+
`)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{f||(f=!0,p(),l.length>0&&h(l),n({code:_,stdout:o,stderr:a,sessionId:d??c,text:u.join("")}))}),i.on("error",_=>{f||(f=!0,p(),s(_))})})}function Rh(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(fo(r)){let n=Rh(r);if(n)return n}}}function uo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(fo(r)){let n=uo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(fo(s)){let i=uo(s,e);if(i!==void 0)return i}}}function fo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tc,nc=T(()=>{"use strict";Jd();$t();ht();kn();gt();tc=class extends xe{constructor(e){super({provider:new xn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:L0})}seedArgsFor(e){return Ah({prompt:e?.prompt??ge,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){R0(e,{recursive:!0});let n=this.seedArgsFor(r);yt("lmplayer",n);try{let s=await xh(this.binary,n,{cwd:e,env:Tr(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as mo,readFile as O0,rm as C0}from"node:fs/promises";import{basename as Lh,join as Nr}from"node:path";function $0(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Ds(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function M0(t,e){if(!e)return;t.observed=!0;let r=Ds(e.promptTokenCount),n=Ds(e.cachedContentTokenCount),s=Ds(e.candidatesTokenCount),i=Ds(e.thoughtsTokenCount);t.totalInputTokens+=r,t.totalCachedInputTokens+=n,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=r,t.lastTokenUsage={inputTokens:Math.max(r-n,0),cachedInputTokens:n,outputTokens:s,reasoningOutputTokens:i,totalTokens:Ds(e.totalTokenCount)||r+s}}function D0(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Oh(t){return t.type==="user"||t.message?.role==="user"}function Ch(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function $h(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(`
|
|
1615
1615
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1616
|
-
`):"":""}function Mh(t){return t.model||t.message?.model}function j0(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:jh(t).filter(r=>!r.thought&&r.type!=="thinking"&&typeof r.text=="string"&&r.text.length>0).length}function js(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function P0(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return js(e.output??e.error??t)}return js(t)}function jh(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Dh(t,e,r){let n=t.name||"tool";return{role:"tool_use",timestamp:e,content:n,toolName:n,toolInput:js(t.args,!0),toolInputData:Ct(t.args),toolCallId:t.id,model:r}}var po,Ph=T(()=>{"use strict";tr();po=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Ir(ve,".qwen")}async discoverSessions(){let e=Ir(this.baseDir,"projects"),r;try{r=await mo(e)}catch{return[]}let n=[];for(let s of r){let i=Ir(e,s,"chats"),o;try{o=await mo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=Ir(i,a);try{let c=await this.extractSummary(d,l);c&&n.push(c)}catch{}}}return n}async extractSummary(e,r){let n=await Xe(e,30);if(n.length===0)return null;let s=await Oe(e),i="(unknown)",o,a,l,d,c=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Oh(u)){let f=$h(u).trim();f&&(l||(l=H(f,80)),d=H(f,80),c++)}if(Ch(u)){let f=Mh(u);f&&(o=f),c+=j0(u)}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Lh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Oe(e),s="(unknown)",i,o,a,l,d,c,u=[],f=$0();for await(let m of Be(e)){if(M0(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(m.type==="tool_result"){let _=jh(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:h,content:js(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let y=g.functionResponse,E=P0(y.response),w=js(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:h,content:w??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(Oh(m)){let _=$h(m);_.trim()&&(d||(d=H(_.trim(),80)),c=H(_.trim(),80)),u.push({role:"user",timestamp:h,content:_})}else if(Ch(m)){let _=Mh(m);if(_&&(i=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&u.push(Dh(g.functionCall,h,_));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let y=g.thinking||g.text;y&&u.push({role:"thinking",timestamp:h,content:y})}else g.functionCall?u.push(Dh(g.functionCall,h,_)):g.text&&u.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:c,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...D0(f),messages:u}}async resolveSessionPath(e){let r=Ir(this.baseDir,"projects");try{let n=await mo(r),s=[];for(let i of n){let o=Ir(r,i,"chats",`${e}.jsonl`);try{return await O0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=Ir(r,i,"chats"),a;try{a=await mo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Lh(l,".jsonl").startsWith(e)&&s.push(Ir(o,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 C0(r),!0}catch{return!1}}}});function ic(){return new sc}var sc,oc=T(()=>{"use strict";Ph();$t();Sr();ht();sc=class extends xe{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",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ro})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as Fh,readFile as Uh,rm as Wh,stat as qh}from"node:fs/promises";import{basename as ac,join as Mt}from"node:path";import{fileURLToPath as F0}from"node:url";async function U0(t){let e=await Promise.all(t.map(r=>Oe(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 W0(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Bh(t){return t.type==="USER_INPUT"}function Hh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function q0(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Xh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Jh(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 B0(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function H0(t){for await(let e of Be(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=X0(s);if(i)return i}let n=J0(e.content);if(n)return n}return null}function X0(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 J0(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function G0(t,e){if(t.status!=="RUNNING"||!t.content)return;let r=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!r||r[1]!==e)&&!(t.step_index===void 0||Number(r[3])!==t.step_index))return r[2]}function K0(t,e){let r=new Set;for(let n of e){let s=V0(t,r,n);if(!s)continue;r.add(s);let i=n.event.step_index===void 0?void 0:`agy-step-${n.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=n.message.backgroundTaskId,n.message.toolName=s.name,n.message.toolCallId=i}}function V0(t,e,r){let n=r.message.backgroundTaskId===void 0?void 0:Q0(r.event.content);if(n!==void 0)return Gh(t.filter(i=>!e.has(i)&&eL(i)===n),r.event.step_index);let s=Z0(r.event);if(s!==void 0)return Gh(t.filter(i=>!e.has(i)&&Y0(i.name,r.event.type)&&Vh(z0(i))===s),r.event.step_index)}function Gh(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let r=t.map(n=>({call:n,distance:n.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-n.stepIndex)})).sort((n,s)=>n.distance-s.distance);return r[0].distance<r[1].distance?r[0].call:void 0}function Y0(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function z0(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function Z0(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),Vh(e)}function Vh(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return F0(e)}catch{return}}function Q0(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function eL(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,r=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof r!="string"?void 0:`Timer: ${e}s, Prompt: ${r}`}}function Kh(t){if(t.endsWith(".db"))return ac(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var _o,Yh=T(()=>{"use strict";tr();_o=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Mt(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Mt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Mt(this.baseDir,"conversations"),r;try{r=await Fh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=ac(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Mt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,r){return Mt(this.baseDir,"brain",e,".system_generated","logs",r?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let r of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await qh(r),r}catch{}return null}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await U0([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,d,c=0;if(n){let u=await Xe(n,80);for(let f of u){let m=Jh(f.content);if(m&&(a=m),Bh(f)){let p=Xh(f.content).trim();p&&(l||(l=H(p,80)),d=H(p,80)),c++}else Hh(f)&&f.content&&c++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Kh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage,c=[],u=[];if(i)for await(let f of Be(i)){let m=W0(f.created_at,s.modifiedAt),p=Jh(f.content);if(p&&(a=p),Bh(f)){let h=Xh(f.content),_=h.trim();_&&(l||(l=H(_,80)),d=H(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=B0(h.args),y=Ct(h.args),E={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:y};o.push(E),c.push({name:_,stepIndex:f.step_index,input:y,message:E})}if(Hh(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(q0(f)&&f.content){let h=G0(f,n),_=h===void 0?null:await this.readTaskLog(n,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return K0(c,u),{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await qh(r),r}catch{}let n=Mt(this.baseDir,"conversations");try{let s=[];for(let i of await Fh(n)){if(!i.endsWith(".db"))continue;ac(i,".db").startsWith(e)&&s.push(Mt(n,i))}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=Kh(r);return n?(await Wh(this.conversationPath(n),{force:!0}),await Wh(Mt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await H0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Mt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Uh(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}async readTaskLog(e,r){if(!/^task-\d+$/.test(r))return null;let n=Mt(this.baseDir,"brain",e,".system_generated","tasks",`${r}.log`);try{let[s,i]=await Promise.all([Uh(n,"utf8"),Oe(n)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as tL}from"node:child_process";function dc(t){return new lc(t)}async function rL(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",sL(e.timeoutMs)];e.model&&n.push("--model",e.model),yt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await nL(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function nL(t,e,r){return new Promise((n,s)=>{let i;try{i=tL(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(d){s(d);return}let o="",a="";i.stdout?.on("data",d=>{o+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",d=>{r.signal?.removeEventListener("abort",l),s(d)}),i.on("exit",(d,c)=>{if(r.signal?.removeEventListener("abort",l),d===0){n({stdout:o,stderr:a});return}let u=c?`signal ${c}`:`exit code ${d}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function sL(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var lc,cc=T(()=>{"use strict";Yh();$t();ht();gt();Sn();lc=class extends xe{constructor(e){super({provider:new _o(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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:rL})}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 iL}from"node:crypto";import{existsSync as oL,mkdirSync as aL,readFileSync as lL,renameSync as dL,writeFileSync as cL}from"node:fs";import{dirname as tg,join as zh,resolve as uc}from"node:path";function uL(t){return iL("sha256").update(t).digest("hex").slice(0,8)}function fL(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function mL(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 rg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function ho(t){return Math.max(1,Math.ceil(t.length/4))}function Rn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return uc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?zh(tg(uc(r)),".lmctl-claude-mock","sessions.json"):zh(uc(t),".lmctl-claude-mock","sessions.json")}function Zh(){return{schemaVersion:1,sessions:{}}}function Ps(t){if(!oL(t))return Zh();try{let e=JSON.parse(lL(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Zh()}}function ng(t,e){aL(tg(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;cL(r,`${JSON.stringify(e,null,2)}
|
|
1617
|
-
`,"utf8"),dL(r,t)}function pL(t){return{...t,timestamp:t.timestamp.toISOString()}}function _L(t){return{...t,timestamp:new Date(t.timestamp)}}function hL(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(pL)}}function sg(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(_L)}}function go(t,e=process.cwd()){let r=xn.get(t);if(r!==void 0)return r;let s=Ps(Rn(e)).sessions[t];if(s===void 0)return;let i=sg(s);return xn.set(i.sessionId,i),i}function Qh(t){xn.set(t.sessionId,t);let e=Rn(t.cwd),r=Ps(e);r.sessions[t.sessionId]=hL({...t,filePath:e}),ng(e,r)}function gL(){let t=Ps(Rn()),e=Object.values(t.sessions).map(sg);for(let r of e)xn.set(r.sessionId,r);return e}function yL(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[rg(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function eg(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 pc(){return new mc}var xn,fc,mc,_c=T(()=>{"use strict";xn=new Map;fc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of gL())e.set(r.sessionId,r);for(let r of xn.values())e.set(r.sessionId,r);return[...e.values()].map(eg)}async loadSession(e){let r=go(e);return r===void 0?null:{...eg(r),messages:r.messages.slice()}}async resolveSessionPath(e){return go(e)?.filePath??null}async deleteSession(e){let r=xn.delete(e),n=Rn(),s=Ps(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&ng(n,s),r||i}},mc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new fc;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=fL(mL(e,r)),s=`mock-${n}-${uL(`${e}:${n}`)}`,i=new Date,o=Rn(e),a=go(s,e),l=r?.prompt??"ClaudeMock seed",d=ho(l),c={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:i,content:l}),c.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=d,c.totalOutputTokens+=ho("ACK: ClaudeMock seeded"),Qh(c),{success:!0,sessionId:s}}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=go(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=Ps(Rn(r.cwd)),a=yL(e,o)??`ClaudeMock ack: ${rg(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=ho(e),s.totalOutputTokens+=ho(a),Qh(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Dt(t){let e=[Ld({claudeDir:t?.claudeDir}),$d({codexDir:t?.codexDir,codeDir:t?.codeDir}),Fd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Bd({copilotDir:t?.copilotDir}),Kd(),Qd({kimiHome:t?.kimiHome}),rc({lmplayerDbPath:t?.lmplayerDbPath}),ic(),dc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(pc()),e}var hc=T(()=>{"use strict";Od();Md();Ud();Hd();Vd();ec();nc();oc();cc();_c();Od();Md();Ud();Hd();Vd();ec();nc();oc();cc();_c()});var wc={};he(wc,{ProviderRegistry:()=>Ns,TransportConnectionError:()=>be,TransportError:()=>ct,TransportJsonError:()=>Yi,TransportProcessError:()=>rr,TransportRpcError:()=>nr,_resetDefaultRegistryForTests:()=>EL,chat:()=>jt,countTokens:()=>Ec,createAdapterRegistry:()=>Ot,createAllAdapters:()=>Dt,listSessions:()=>yc,seed:()=>gc});function Eo(){return yo===null&&(yo=Ot(Dt())),yo}function EL(){yo=null}function og(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function jt(t){let e=t.registry??Eo(),r=og(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen},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 gc(t){let e=t.registry??Eo(),r=og(e,t.provider),n=await ig(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await ig(e,t.provider,t.cwd),a=wL(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function ig(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function wL(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 yc(t={}){return(t.registry??Eo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Ec(t){let r=await(t.registry??Eo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var yo,Pt=T(()=>{"use strict";ad();hc();ad();hc();bn();yo=null});function TL(){return Tc===null&&(Tc=Ot(Dt())),Tc}async function wo(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,i;try{return await bL(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)Ln.delete(r),e.setMemberState(r,"idle");else{let o=vL(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function vL(t,e){if(!(t instanceof Re))return Ln.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=(Ln.get(e)??0)+1;return r>=3?(Ln.delete(e),"consecutive_timeouts"):(Ln.set(e,r),null)}return Ln.delete(e),null}async function bL(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=TL(),s;try{let c=await n.resolveSession(t.sessionid);if(!c)return Promise.reject(new Re("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,vc(t.sessionid,t.sessiondir,"unresolved")));s=c.provider.name}catch(c){return Promise.reject(new Re("other",null,`library: session resolution failed: ${ag(c)}`,vc(t.sessionid,t.sessiondir,"unresolved")))}let i=vc(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let d=Date.now();try{let c=await jt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(c.status==="stalled")throw new Re("timeout",null,`library: stalled after ${c.stalledAfterMs??0}ms`,i);return{text:c.text,ms:Date.now()-d,exit_status:0,argv:i}}catch(c){throw l?new Re("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):SL(c,i)}finally{a!==null&&clearTimeout(a)}}function vc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function ag(t){return t instanceof Error?t.message:String(t)}function SL(t,e){if(t instanceof Re)return t;if(t instanceof be){let r=t.cause;return r?.code==="ENOENT_CWD"?new Re("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Re("enoent",null,t.message,e):new Re("other",null,t.message,e)}return t instanceof rr?new Re("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof nr?new Re("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ct?new Re("other",null,t.message,e):new Re("other",null,ag(t),e)}var Re,Tc,Ln,To=T(()=>{"use strict";Pt();Re=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"}},Tc=null;Ln=new Map});function lg(){return bc===null&&(bc=Ot(Dt())),bc}function IL(t,e){if(!kL.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ce("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return r}async function vo(t){let e=IL(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await NL({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function NL(t){let e=t.member.provider,r=t.member.sessiondir,n=Sc("seed",r,e);try{let s=await gc({provider:e,cwd:r,registry:lg()});if(!s.success)throw xL(s.error,n);if(!s.sessionId)throw new Ce("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ce?s:kc(s,n)}}async function dg(t){return AL(t)}async function AL(t){let e=lg(),r=Sc("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ce("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ce?i:kc(i,r)}let s=Sc("tokens",t.sessionid,n);try{let i=await Ec({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ce?i:kc(i,s)}}function Sc(t,e,r){return["<library>",t,e,"--provider",r]}function xL(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ce("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ce("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 Ce("nonzero_exit",Number(n[1]),r,e)}return new Ce("other",null,r,e)}function kc(t,e){return t instanceof Ce?t:t instanceof be?t.cause?.code==="ENOENT"?new Ce("enoent",null,t.message,e):new Ce("other",null,t.message,e):t instanceof rr?new Ce("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof nr?new Ce("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ct?new Ce("other",null,t.message,e):new Ce("other",null,t instanceof Error?t.message:String(t),e)}var Ce,bc,kL,Ic=T(()=>{"use strict";Pt();Ce=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"}},bc=null;kL=/^provider[123]$/});function bo(t){return Buffer.from(t,"utf8").toString("base64url")}function Us(t){return Buffer.from(t,"base64url").toString("utf8")}async function cg(t,e=r=>dg({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of RL(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){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:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function ug(t,e,r){let n=fg(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Fs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await wo({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:mg(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 Nc(t,e,r){let n=fg(t,e,r);if(n===null)throw new Error("session member not found");let s=await vo({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:mg(t,e,r)}}function RL(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function fg(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 mg(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Fs,So=T(()=>{"use strict";To();Ic();Fs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Ac(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??OL(e),s=r-n,i=e.query(`
|
|
1616
|
+
`):"":""}function Mh(t){return t.model||t.message?.model}function j0(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:jh(t).filter(r=>!r.thought&&r.type!=="thinking"&&typeof r.text=="string"&&r.text.length>0).length}function js(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function P0(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return js(e.output??e.error??t)}return js(t)}function jh(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Dh(t,e,r){let n=t.name||"tool";return{role:"tool_use",timestamp:e,content:n,toolName:n,toolInput:js(t.args,!0),toolInputData:Ct(t.args),toolCallId:t.id,model:r}}var po,Ph=T(()=>{"use strict";tr();po=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Nr(ve,".qwen")}async discoverSessions(){let e=Nr(this.baseDir,"projects"),r;try{r=await mo(e)}catch{return[]}let n=[];for(let s of r){let i=Nr(e,s,"chats"),o;try{o=await mo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=Nr(i,a);try{let c=await this.extractSummary(d,l);c&&n.push(c)}catch{}}}return n}async extractSummary(e,r){let n=await Xe(e,30);if(n.length===0)return null;let s=await Oe(e),i="(unknown)",o,a,l,d,c=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Oh(u)){let f=$h(u).trim();f&&(l||(l=H(f,80)),d=H(f,80),c++)}if(Ch(u)){let f=Mh(u);f&&(o=f),c+=j0(u)}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Lh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Oe(e),s="(unknown)",i,o,a,l,d,c,u=[],f=$0();for await(let m of Be(e)){if(M0(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(m.type==="tool_result"){let _=jh(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:h,content:js(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let y=g.functionResponse,E=P0(y.response),w=js(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:h,content:w??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(Oh(m)){let _=$h(m);_.trim()&&(d||(d=H(_.trim(),80)),c=H(_.trim(),80)),u.push({role:"user",timestamp:h,content:_})}else if(Ch(m)){let _=Mh(m);if(_&&(i=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&u.push(Dh(g.functionCall,h,_));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let y=g.thinking||g.text;y&&u.push({role:"thinking",timestamp:h,content:y})}else g.functionCall?u.push(Dh(g.functionCall,h,_)):g.text&&u.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:c,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...D0(f),messages:u}}async resolveSessionPath(e){let r=Nr(this.baseDir,"projects");try{let n=await mo(r),s=[];for(let i of n){let o=Nr(r,i,"chats",`${e}.jsonl`);try{return await O0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=Nr(r,i,"chats"),a;try{a=await mo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Lh(l,".jsonl").startsWith(e)&&s.push(Nr(o,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 C0(r),!0}catch{return!1}}}});function ic(){return new sc}var sc,oc=T(()=>{"use strict";Ph();$t();kr();ht();sc=class extends xe{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",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ro})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as Fh,readFile as Uh,rm as Wh,stat as qh}from"node:fs/promises";import{basename as ac,join as Mt}from"node:path";import{fileURLToPath as F0}from"node:url";async function U0(t){let e=await Promise.all(t.map(r=>Oe(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 W0(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Bh(t){return t.type==="USER_INPUT"}function Hh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function q0(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Xh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Jh(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 B0(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function H0(t){for await(let e of Be(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=X0(s);if(i)return i}let n=J0(e.content);if(n)return n}return null}function X0(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 J0(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function G0(t,e){if(t.status!=="RUNNING"||!t.content)return;let r=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!r||r[1]!==e)&&!(t.step_index===void 0||Number(r[3])!==t.step_index))return r[2]}function K0(t,e){let r=new Set;for(let n of e){let s=V0(t,r,n);if(!s)continue;r.add(s);let i=n.event.step_index===void 0?void 0:`agy-step-${n.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=n.message.backgroundTaskId,n.message.toolName=s.name,n.message.toolCallId=i}}function V0(t,e,r){let n=r.message.backgroundTaskId===void 0?void 0:Q0(r.event.content);if(n!==void 0)return Gh(t.filter(i=>!e.has(i)&&eL(i)===n),r.event.step_index);let s=Z0(r.event);if(s!==void 0)return Gh(t.filter(i=>!e.has(i)&&Y0(i.name,r.event.type)&&Vh(z0(i))===s),r.event.step_index)}function Gh(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let r=t.map(n=>({call:n,distance:n.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-n.stepIndex)})).sort((n,s)=>n.distance-s.distance);return r[0].distance<r[1].distance?r[0].call:void 0}function Y0(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function z0(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function Z0(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),Vh(e)}function Vh(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return F0(e)}catch{return}}function Q0(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function eL(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,r=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof r!="string"?void 0:`Timer: ${e}s, Prompt: ${r}`}}function Kh(t){if(t.endsWith(".db"))return ac(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var _o,Yh=T(()=>{"use strict";tr();_o=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Mt(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Mt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Mt(this.baseDir,"conversations"),r;try{r=await Fh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=ac(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Mt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,r){return Mt(this.baseDir,"brain",e,".system_generated","logs",r?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let r of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await qh(r),r}catch{}return null}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await U0([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,d,c=0;if(n){let u=await Xe(n,80);for(let f of u){let m=Jh(f.content);if(m&&(a=m),Bh(f)){let p=Xh(f.content).trim();p&&(l||(l=H(p,80)),d=H(p,80)),c++}else Hh(f)&&f.content&&c++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Kh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage,c=[],u=[];if(i)for await(let f of Be(i)){let m=W0(f.created_at,s.modifiedAt),p=Jh(f.content);if(p&&(a=p),Bh(f)){let h=Xh(f.content),_=h.trim();_&&(l||(l=H(_,80)),d=H(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=B0(h.args),y=Ct(h.args),E={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:y};o.push(E),c.push({name:_,stepIndex:f.step_index,input:y,message:E})}if(Hh(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(q0(f)&&f.content){let h=G0(f,n),_=h===void 0?null:await this.readTaskLog(n,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return K0(c,u),{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await qh(r),r}catch{}let n=Mt(this.baseDir,"conversations");try{let s=[];for(let i of await Fh(n)){if(!i.endsWith(".db"))continue;ac(i,".db").startsWith(e)&&s.push(Mt(n,i))}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=Kh(r);return n?(await Wh(this.conversationPath(n),{force:!0}),await Wh(Mt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await H0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Mt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Uh(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}async readTaskLog(e,r){if(!/^task-\d+$/.test(r))return null;let n=Mt(this.baseDir,"brain",e,".system_generated","tasks",`${r}.log`);try{let[s,i]=await Promise.all([Uh(n,"utf8"),Oe(n)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as tL}from"node:child_process";function dc(t){return new lc(t)}async function rL(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",sL(e.timeoutMs)];e.model&&n.push("--model",e.model),yt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await nL(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function nL(t,e,r){return new Promise((n,s)=>{let i;try{i=tL(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(d){s(d);return}let o="",a="";i.stdout?.on("data",d=>{o+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",d=>{r.signal?.removeEventListener("abort",l),s(d)}),i.on("exit",(d,c)=>{if(r.signal?.removeEventListener("abort",l),d===0){n({stdout:o,stderr:a});return}let u=c?`signal ${c}`:`exit code ${d}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function sL(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var lc,cc=T(()=>{"use strict";Yh();$t();ht();gt();kn();lc=class extends xe{constructor(e){super({provider:new _o(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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:rL})}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 iL}from"node:crypto";import{existsSync as oL,mkdirSync as aL,readFileSync as lL,renameSync as dL,writeFileSync as cL}from"node:fs";import{dirname as tg,join as zh,resolve as uc}from"node:path";function uL(t){return iL("sha256").update(t).digest("hex").slice(0,8)}function fL(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function mL(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 rg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function ho(t){return Math.max(1,Math.ceil(t.length/4))}function Ln(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return uc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?zh(tg(uc(r)),".lmctl-claude-mock","sessions.json"):zh(uc(t),".lmctl-claude-mock","sessions.json")}function Zh(){return{schemaVersion:1,sessions:{}}}function Ps(t){if(!oL(t))return Zh();try{let e=JSON.parse(lL(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Zh()}}function ng(t,e){aL(tg(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;cL(r,`${JSON.stringify(e,null,2)}
|
|
1617
|
+
`,"utf8"),dL(r,t)}function pL(t){return{...t,timestamp:t.timestamp.toISOString()}}function _L(t){return{...t,timestamp:new Date(t.timestamp)}}function hL(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(pL)}}function sg(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(_L)}}function go(t,e=process.cwd()){let r=Rn.get(t);if(r!==void 0)return r;let s=Ps(Ln(e)).sessions[t];if(s===void 0)return;let i=sg(s);return Rn.set(i.sessionId,i),i}function Qh(t){Rn.set(t.sessionId,t);let e=Ln(t.cwd),r=Ps(e);r.sessions[t.sessionId]=hL({...t,filePath:e}),ng(e,r)}function gL(){let t=Ps(Ln()),e=Object.values(t.sessions).map(sg);for(let r of e)Rn.set(r.sessionId,r);return e}function yL(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[rg(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function eg(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 pc(){return new mc}var Rn,fc,mc,_c=T(()=>{"use strict";Rn=new Map;fc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of gL())e.set(r.sessionId,r);for(let r of Rn.values())e.set(r.sessionId,r);return[...e.values()].map(eg)}async loadSession(e){let r=go(e);return r===void 0?null:{...eg(r),messages:r.messages.slice()}}async resolveSessionPath(e){return go(e)?.filePath??null}async deleteSession(e){let r=Rn.delete(e),n=Ln(),s=Ps(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&ng(n,s),r||i}},mc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new fc;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=fL(mL(e,r)),s=`mock-${n}-${uL(`${e}:${n}`)}`,i=new Date,o=Ln(e),a=go(s,e),l=r?.prompt??"ClaudeMock seed",d=ho(l),c={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:i,content:l}),c.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=d,c.totalOutputTokens+=ho("ACK: ClaudeMock seeded"),Qh(c),{success:!0,sessionId:s}}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=go(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=Ps(Ln(r.cwd)),a=yL(e,o)??`ClaudeMock ack: ${rg(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=ho(e),s.totalOutputTokens+=ho(a),Qh(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Dt(t){let e=[Ld({claudeDir:t?.claudeDir}),$d({codexDir:t?.codexDir,codeDir:t?.codeDir}),Fd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Bd({copilotDir:t?.copilotDir}),Kd(),Qd({kimiHome:t?.kimiHome}),rc({lmplayerDbPath:t?.lmplayerDbPath}),ic(),dc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(pc()),e}var hc=T(()=>{"use strict";Od();Md();Ud();Hd();Vd();ec();nc();oc();cc();_c();Od();Md();Ud();Hd();Vd();ec();nc();oc();cc();_c()});var wc={};he(wc,{ProviderRegistry:()=>Ns,TransportConnectionError:()=>be,TransportError:()=>ct,TransportJsonError:()=>Yi,TransportProcessError:()=>rr,TransportRpcError:()=>nr,_resetDefaultRegistryForTests:()=>EL,chat:()=>jt,countTokens:()=>Ec,createAdapterRegistry:()=>Ot,createAllAdapters:()=>Dt,listSessions:()=>yc,seed:()=>gc});function Eo(){return yo===null&&(yo=Ot(Dt())),yo}function EL(){yo=null}function og(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function jt(t){let e=t.registry??Eo(),r=og(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen},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 gc(t){let e=t.registry??Eo(),r=og(e,t.provider),n=await ig(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await ig(e,t.provider,t.cwd),a=wL(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function ig(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function wL(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 yc(t={}){return(t.registry??Eo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Ec(t){let r=await(t.registry??Eo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var yo,Pt=T(()=>{"use strict";ad();hc();ad();hc();Sn();yo=null});function TL(){return Tc===null&&(Tc=Ot(Dt())),Tc}async function wo(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,i;try{return await bL(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)On.delete(r),e.setMemberState(r,"idle");else{let o=vL(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function vL(t,e){if(!(t instanceof Re))return On.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=(On.get(e)??0)+1;return r>=3?(On.delete(e),"consecutive_timeouts"):(On.set(e,r),null)}return On.delete(e),null}async function bL(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=TL(),s;try{let c=await n.resolveSession(t.sessionid);if(!c)return Promise.reject(new Re("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,vc(t.sessionid,t.sessiondir,"unresolved")));s=c.provider.name}catch(c){return Promise.reject(new Re("other",null,`library: session resolution failed: ${ag(c)}`,vc(t.sessionid,t.sessiondir,"unresolved")))}let i=vc(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let d=Date.now();try{let c=await jt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(c.status==="stalled")throw new Re("timeout",null,`library: stalled after ${c.stalledAfterMs??0}ms`,i);return{text:c.text,ms:Date.now()-d,exit_status:0,argv:i}}catch(c){throw l?new Re("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):SL(c,i)}finally{a!==null&&clearTimeout(a)}}function vc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function ag(t){return t instanceof Error?t.message:String(t)}function SL(t,e){if(t instanceof Re)return t;if(t instanceof be){let r=t.cause;return r?.code==="ENOENT_CWD"?new Re("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Re("enoent",null,t.message,e):new Re("other",null,t.message,e)}return t instanceof rr?new Re("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof nr?new Re("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ct?new Re("other",null,t.message,e):new Re("other",null,ag(t),e)}var Re,Tc,On,To=T(()=>{"use strict";Pt();Re=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"}},Tc=null;On=new Map});function lg(){return bc===null&&(bc=Ot(Dt())),bc}function IL(t,e){if(!kL.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ce("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return r}async function vo(t){let e=IL(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await NL({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function NL(t){let e=t.member.provider,r=t.member.sessiondir,n=Sc("seed",r,e);try{let s=await gc({provider:e,cwd:r,registry:lg()});if(!s.success)throw xL(s.error,n);if(!s.sessionId)throw new Ce("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ce?s:kc(s,n)}}async function dg(t){return AL(t)}async function AL(t){let e=lg(),r=Sc("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ce("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ce?i:kc(i,r)}let s=Sc("tokens",t.sessionid,n);try{let i=await Ec({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ce?i:kc(i,s)}}function Sc(t,e,r){return["<library>",t,e,"--provider",r]}function xL(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ce("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ce("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 Ce("nonzero_exit",Number(n[1]),r,e)}return new Ce("other",null,r,e)}function kc(t,e){return t instanceof Ce?t:t instanceof be?t.cause?.code==="ENOENT"?new Ce("enoent",null,t.message,e):new Ce("other",null,t.message,e):t instanceof rr?new Ce("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof nr?new Ce("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ct?new Ce("other",null,t.message,e):new Ce("other",null,t instanceof Error?t.message:String(t),e)}var Ce,bc,kL,Ic=T(()=>{"use strict";Pt();Ce=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"}},bc=null;kL=/^provider[123]$/});function bo(t){return Buffer.from(t,"utf8").toString("base64url")}function Us(t){return Buffer.from(t,"base64url").toString("utf8")}async function cg(t,e=r=>dg({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of RL(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){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:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function ug(t,e,r){let n=fg(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Fs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await wo({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:mg(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 Nc(t,e,r){let n=fg(t,e,r);if(n===null)throw new Error("session member not found");let s=await vo({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:mg(t,e,r)}}function RL(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function fg(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 mg(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Fs,So=T(()=>{"use strict";To();Ic();Fs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Ac(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??OL(e),s=r-n,i=e.query(`
|
|
1618
1618
|
SELECT
|
|
1619
1619
|
isess.id AS interactive_session_id,
|
|
1620
1620
|
isess.run_id,
|
|
@@ -1658,7 +1658,7 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1658
1658
|
GROUP BY name
|
|
1659
1659
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1660
1660
|
ORDER BY w.name ASC
|
|
1661
|
-
`)}function Eg(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 wg(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 Tg(t,e){return t.getSubmittedPr(e)}function Lo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function
|
|
1661
|
+
`)}function Eg(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 wg(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 Tg(t,e){return t.getSubmittedPr(e)}function Lo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Cn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function zr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Lo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:FL(t,r.id)}}function FL(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:vg(t,r.id)}))}function Cc(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:vg(t,n.id)}}function vg(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Zr(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 bg(t,e,r){let n=Cc(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function Sg(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 kg(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 xr(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 Oo(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(`${Ig}
|
|
1662
1662
|
WHERE ${n}
|
|
1663
1663
|
ORDER BY a.created_at DESC`,...r).map(Ng)}function Ft(t,e){let n=t.query(`${Ig}
|
|
1664
1664
|
WHERE a.id = ?`,e)[0];return n===void 0?null:Ng(n)}function Ng(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 i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function Ag(t){return t.query(`
|
|
@@ -1731,7 +1731,7 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1731
1731
|
AND json_extract(payload, '$.elapsedMs') > 0
|
|
1732
1732
|
AND payload_truncated = 0
|
|
1733
1733
|
ORDER BY json_extract(payload, '$.tool') ASC,
|
|
1734
|
-
json_extract(payload, '$.elapsedMs') ASC`,r),o=new Map;for(let l of i){let d=o.get(l.tool_name)??[];d.push(l.elapsed_ms),o.set(l.tool_name,d)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let d=a.get(l.tool_name)??0,c=o.get(l.tool_name)??[],u=c.length>0?c.reduce((p,h)=>p+h,0)/c.length:null,f=c.length>0?c[Math.floor(c.length*.5)]??null:null,m=c.length>0?c[Math.floor(c.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:d,hit_rate_pct:l.cnt>0?`${(d/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function xg(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 i of e.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(r.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&n.set(i.name,o))}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,d]of Object.entries(r))if(d!==null&&typeof d=="object"){let c=d.type;typeof c=="string"&&n.set(l,c)}let s=typeof e.start_at=="string"?e.start_at:null,i=Object.keys(r),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,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:[...o,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function
|
|
1734
|
+
json_extract(payload, '$.elapsedMs') ASC`,r),o=new Map;for(let l of i){let d=o.get(l.tool_name)??[];d.push(l.elapsed_ms),o.set(l.tool_name,d)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let d=a.get(l.tool_name)??0,c=o.get(l.tool_name)??[],u=c.length>0?c.reduce((p,h)=>p+h,0)/c.length:null,f=c.length>0?c[Math.floor(c.length*.5)]??null:null,m=c.length>0?c[Math.floor(c.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:d,hit_rate_pct:l.cnt>0?`${(d/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function xg(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 i of e.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(r.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&n.set(i.name,o))}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,d]of Object.entries(r))if(d!==null&&typeof d=="object"){let c=d.type;typeof c=="string"&&n.set(l,c)}let s=typeof e.start_at=="string"?e.start_at:null,i=Object.keys(r),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,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:[...o,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function $n(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 _=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return _===void 0?null:t.query("SELECT * FROM project WHERE id = ?",_.project_id)[0]?.name??null})(),i=n!==null?xg(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=_=>i.schema==="v3"&&i.nameToId.has(_)?i.nameToId.get(_):_,l=new Map;for(let _ of o)l.set(a(_.state_name),_);let d=t.query(`SELECT state_name, status, last_agent_output
|
|
1735
1735
|
FROM interactive_session
|
|
1736
1736
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1737
1737
|
ORDER BY id DESC LIMIT 1`,e)[0],c=d!==void 0?a(d.state_name):null,u=c,f=d?.last_agent_output??null;if(u===null){let _=o.find(g=>g.ended_at===null);_!==void 0?u=a(_.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let _ of o){let g=a(_.state_name);!i.nodes.includes(g)&&!p.includes(g)&&p.push(g)}u!==null&&!p.includes(u)&&p.push(u);let h=[];for(let _ of p){if(m.has(_))continue;m.add(_);let g=_===u,y=l.get(_),E="pending",w=null;if(_.startsWith("@terminal:"))E=r.terminal_state===_.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?E=g&&c===_?"paused":"running":y.outcome===null?E="failed":E="done",y.ended_at!==null)){let S=Date.parse(y.started_at),x=Date.parse(y.ended_at);!Number.isNaN(S)&&!Number.isNaN(x)&&(w=x-S)}g&&c===_&&(E="paused"),h.push({id:_,status:E,is_current:g,elapsed_ms:w,prompt:g&&E==="paused"?f:null,expected:g&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:u,nodes:h}}function Co(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 i of t.nodes)e.push(...UL(i));return`${e.join(`
|
|
@@ -1746,7 +1746,7 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1746
1746
|
AND acknowledged_at IS NULL
|
|
1747
1747
|
ORDER BY id ASC`,e).map(S=>({kind:S.kind,severity:S.severity,payload:YL(S.payload)})),w=g.map(S=>{let x=f.get(S),J=p.get(S),F=HL(s,S,y,x,J),$=x===void 0?null:Date.parse(x.started_at),R=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN($??NaN)?null:R!==null&&!Number.isNaN(R)?R-$:F==="running"||F==="paused"?n-$:null,Y=x===void 0?null:h.get(x.id)??null,B=zL(J?.last_activity_at??null,Y,_),k=i===null||J===void 0?void 0:GL(t,s.team_id,i.definition,J.state_name,x?.state_name??S);return{step_id:x?.id??null,state_id:S,status:F,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...J!==void 0?{interactive_session:{id:J.id,status:J.status,turn_count:J.turn_count,state_name:J.state_name}}:{}}});return{run_id:e,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:JL(s,a,w),submitted_at:a?.enqueued_at??s.started_at,nodes:w,current_node_index:XL(w,s.terminal_state!==null),related_attentions:E}}function Mo(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${gg(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${hg(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":hg(t.submitted_at,a.started_at),d=a.status.padEnd(7),c=a.elapsed_ms===null?"":` elapsed ${Do(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${d}${c}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${gg(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),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}${ZL(a.payload)}`)}return`${n.join(`
|
|
1748
1748
|
`)}
|
|
1749
|
-
`}function qL(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 i=r(s.state_name);n.includes(i)||n.push(i)}return n}function BL(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function HL(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 XL(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 JL(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 GL(t,e,r,n,s){let i=KL(r,n,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function KL(t,e,r){let n=VL(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>
|
|
1749
|
+
`}function qL(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 i=r(s.state_name);n.includes(i)||n.push(i)}return n}function BL(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function HL(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 XL(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 JL(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 GL(t,e,r,n,s){let i=KL(r,n,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function KL(t,e,r){let n=VL(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Ar(a)?a.id===e||a.name===e||a.name===r:!1),i=Ar(s?.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(Ar(n.states)){let s=n.states[e]??n.states[r];if(!Ar(s))return null;let i=Ar(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function VL(t){try{let e=JSON.parse(t);return Ar(e)?e:null}catch{return null}}function YL(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Ar(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zL(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function hg(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Do(Math.max(0,n-r)).padEnd(6)}]`}function gg(t,e){return Number.isNaN(t)?"?":Do(Math.max(0,e-t))}function Do(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),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function ZL(t){if(!Ar(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"?`, ${Do(t.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${i}`}var Ig,sr=T(()=>{"use strict";dt();Ig=`SELECT a.id AS attention_id,
|
|
1750
1750
|
a.kind AS kind,
|
|
1751
1751
|
a.severity AS severity,
|
|
1752
1752
|
a.created_at AS created_at,
|
|
@@ -1773,17 +1773,17 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1773
1773
|
`),2):iC(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Fo(r.rest.slice(2)))return e.stdout.write(`${dO}
|
|
1774
1774
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Fo(r.rest.slice(2)))return e.stdout.write(`${cO}
|
|
1775
1775
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?tC(r.rest.slice(2),e):rC(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?nC(r.rest.slice(2),e):sC(r.rest.slice(2),e);if(r.present)return UO(r.rest,e);let n=$g(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1776
|
-
`),2;let s=Qr(e),i=s.baseUrl,o=
|
|
1776
|
+
`),2;let s=Qr(e),i=s.baseUrl,o=Rr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=EO(n.upload.filePath,n.upload.project)}catch(d){return e.stderr.write(`error: upload failed: ${d instanceof Error?d.message:String(d)}
|
|
1777
1777
|
`),2}else n.body!==void 0&&n.contentType!==void 0?o["Content-Type"]=n.contentType:n.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,i),{method:n.method,headers:o,body:a})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1778
1778
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1779
1779
|
`),l.status===400?2:1;if(n.runAfterSubmit){let d=await l.json(),c=TO(d);if(c===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
|
|
1780
|
-
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${c}/run`,i),{method:"POST",headers:
|
|
1780
|
+
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${c}/run`,i),{method:"POST",headers:Rr("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
|
|
1781
1781
|
`),2}if(!u.ok)return e.stderr.write(`error: HTTP ${u.status}: ${await u.text()}
|
|
1782
1782
|
`),u.status===400?2:1;let f=await u.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
|
|
1783
1783
|
`):e.stdout.write(`${JSON.stringify(f)}
|
|
1784
1784
|
`)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1785
1785
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1786
|
-
`));return 0}function $g(t){let e=jg(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Po(i,"/api/status",n):s==="projects"?Po(i,"/api/projects",n):s==="teams"?Po(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?xO(i.slice(1),e.format):Po(i,"/api/workflows",n):s==="workflow"?AO(i,n):s==="upload"?IO(i,n):s==="submit-job"?NO(i,n):s==="issues"?kO(i,n):s==="jobs"?Ws(i,"--status","/api/jobs","status",n):s==="job"?SO(i,n):s==="project"?RO(i,n):s==="artifact"?CO(i,n):s==="runs"?Ws(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Ws(i,"--type","/api/external-objects","type",n):s==="external-signals"?Lg(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?$O(i,n):Lg(i,"--unacked","/api/attentions","unacked",n):s==="stats"?MO(i,n):s==="daemon"?DO(i,n):s==="intake"?jO(i,n):s==="session"?PO(i,n):s==="run"?FO(i,e.format):s==="prs"?Ws(i,"--status","/api/submitted-prs","status",n):s==="pr"?vO(i,n):`unknown subcommand: ${s}`}function
|
|
1786
|
+
`));return 0}function $g(t){let e=jg(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Po(i,"/api/status",n):s==="projects"?Po(i,"/api/projects",n):s==="teams"?Po(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?xO(i.slice(1),e.format):Po(i,"/api/workflows",n):s==="workflow"?AO(i,n):s==="upload"?IO(i,n):s==="submit-job"?NO(i,n):s==="issues"?kO(i,n):s==="jobs"?Ws(i,"--status","/api/jobs","status",n):s==="job"?SO(i,n):s==="project"?RO(i,n):s==="artifact"?CO(i,n):s==="runs"?Ws(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Ws(i,"--type","/api/external-objects","type",n):s==="external-signals"?Lg(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?$O(i,n):Lg(i,"--unacked","/api/attentions","unacked",n):s==="stats"?MO(i,n):s==="daemon"?DO(i,n):s==="intake"?jO(i,n):s==="session"?PO(i,n):s==="run"?FO(i,e.format):s==="prs"?Ws(i,"--status","/api/submitted-prs","status",n):s==="pr"?vO(i,n):`unknown subcommand: ${s}`}function Rr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Qr(t){if(t.dal!==void 0)return qs(t.dal,process.env,t);let e=qe({path:ne()});try{return qs(e,process.env,t)}finally{e.close()}}function qs(t,e,r){let n=[],s=t.getConfig("api.url"),i;s!==null?i=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(i=e.LMCTL_API_URL,n.push("api.url")):i=rO;let o=t.getConfig("api.token"),a;e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,o===null?n.push("api.token"):o!==a&&r.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
|
|
1787
1787
|
`)):o!==null?a=o:a=null;for(let l of n)r.stderr.write(`note: ${iO(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1788
1788
|
`);return{baseUrl:i,token:a}}function iO(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 oO(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1789
1789
|
`),2;let s=e.dal===void 0,i=e.dal??qe({path:ne()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
@@ -1802,7 +1802,7 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1802
1802
|
`),0;let n=Bg(t,"--direct"),s=r||n.present,i=n.rest,[o,...a]=i;return o===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
|
|
1803
1803
|
`),2):s?fO(o,a,e):o==="list"?pO(a,e):o==="show"?hO(a,e):o==="respond"?gO(a,e):(e.stderr.write(`error: unknown api escalations verb: ${o}
|
|
1804
1804
|
`),2)}function Fo(t){return t.some(e=>e==="--help"||e==="-h")}function fO(t,e,r){let n=r.dal===void 0,s=r.dal??qe({path:ne()});try{return Hg(s,[t,...e],r)}finally{n&&s.close()}}function Mg(t){let e,r=!1,n=!1,s;for(let o=0;o<t.length;o+=1){let a=t[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let d=mO(l);if(typeof d=="object"&&"error"in d)return d.error;s=d.iso;continue}return ae(a)}let i={json:r,all:n};return e!==void 0&&(i.project=e),s!==void 0&&(i.since=s),i}function mO(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*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 pO(t,e){let r=Mg(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1805
|
-
`),2;let n=Qr(e),s=
|
|
1805
|
+
`),2;let n=Qr(e),s=Rr("application/json",n.token),i=new URLSearchParams;r.project!==void 0&&i.set("project",r.project),r.all&&i.set("all","true"),r.since!==void 0&&i.set("since",r.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,n.baseUrl),{method:"GET",headers:s})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1806
1806
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1807
1807
|
`),a.status===400?2:1;let l=await a.json();return Dg(l,r.json,e)}function Dg(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
|
|
1808
1808
|
`),0;if(t.length===0)return r.stdout.write(`No pending escalations.
|
|
@@ -1816,13 +1816,13 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1816
1816
|
`),r.stdout.write(`
|
|
1817
1817
|
`)}return 0}function _O(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function hO(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
|
|
1818
1818
|
`),2;let n=le(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1819
|
-
`),2;let s=Qr(e),i=
|
|
1819
|
+
`),2;let s=Qr(e),i=Rr("application/json",s.token),o;try{o=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:i})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1820
1820
|
`),1}return o.status===404?(e.stderr.write(`error: escalation not found: ${n}
|
|
1821
1821
|
`),1):o.ok?(e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1822
1822
|
`),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1823
1823
|
`),o.status===400?2:1)}async function gO(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1824
1824
|
`),2;let i=le(s[0],"attention_id");if(typeof i=="string")return e.stderr.write(`error: ${i}
|
|
1825
|
-
`),2;let o=s[1],a=Qr(e),l=
|
|
1825
|
+
`),2;let o=s[1],a=Qr(e),l=Rr("application/json",a.token);l["Content-Type"]="application/json";let d={input:o};n&&(d.done=!0);let c;try{c=await fetch(new URL(`/api/escalations/${i}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(d)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
|
|
1826
1826
|
`),1}if(c.status===404)return e.stderr.write(`error: escalation not found: ${i}
|
|
1827
1827
|
`),1;if(!c.ok){let f=await c.text();return e.stderr.write(`error: HTTP ${c.status}: ${f}
|
|
1828
1828
|
`),c.status===400?2:1}let u=await c.json();return r?e.stdout.write(`${JSON.stringify(u,null,2)}
|
|
@@ -1864,15 +1864,15 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1864
1864
|
`),2):(nt(r,Ro(t),n),0)}function eC(t,e,r,n){let s;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[++i];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${o}
|
|
1865
1865
|
`),2;if(o==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
|
|
1866
1866
|
`),2;s=Number(a)}else return r.stderr.write(`error: ${ae(o)}
|
|
1867
|
-
`),2}return nt(r,
|
|
1867
|
+
`),2}return nt(r,Cn(t,s!==void 0?{limit:s}:{}),n),0}function tC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
|
|
1868
1868
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1869
1869
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${ae(a)}
|
|
1870
|
-
`),2}let i=e.dal===void 0,o=e.dal??qe({path:ne()});try{let a
|
|
1870
|
+
`),2}let i=e.dal===void 0,o=e.dal??qe({path:ne()});try{let a=$n(o,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
|
|
1871
1871
|
`),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1872
1872
|
`):e.stdout.write(Co(a)),0)}finally{i&&o.close()}}async function rC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
|
|
1873
1873
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1874
1874
|
`),2;let s=!1;for(let d of n){if(d==="--json"){s=!0;continue}if(d!=="--text")return e.stderr.write(`error: ${ae(d)}
|
|
1875
|
-
`),2}let i=Qr(e),a=
|
|
1875
|
+
`),2}let i=Qr(e),a=Rr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,i.baseUrl),{method:"GET",headers:a})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1876
1876
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1877
1877
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1878
1878
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
@@ -1884,17 +1884,17 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1884
1884
|
`):e.stdout.write(Mo(a)),0)}finally{i&&o.close()}}async function sC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
|
|
1885
1885
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1886
1886
|
`),2;let s=!1;for(let d of n){if(d==="--json"){s=!0;continue}if(d!=="--text")return e.stderr.write(`error: ${ae(d)}
|
|
1887
|
-
`),2}let i=Qr(e),a=
|
|
1887
|
+
`),2}let i=Qr(e),a=Rr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,i.baseUrl),{method:"GET",headers:a})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1888
1888
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1889
1889
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1890
1890
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1891
1891
|
`),l.status===404?1:l.status===400?2:1)}async function iC(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ae(a)}
|
|
1892
|
-
`),2}let n=Qr(e),i=
|
|
1892
|
+
`),2}let n=Qr(e),i=Rr(r?"application/json":"text/plain",n.token),o;try{o=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:i})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1893
1893
|
`),2}return o.ok?(r?e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1894
1894
|
`):(e.stdout.write(await o.text()),o.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1895
1895
|
`)),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1896
1896
|
`),o.status===400?2:1)}function oC(t,e,r,n){let s=!1;for(let i of e){if(i==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ae(i)}
|
|
1897
|
-
`),2}return nt(r,
|
|
1897
|
+
`),2}return nt(r,xr(t,{unacked:s}),n),0}function Hg(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1898
1898
|
`),2;if(n==="list"){let i=Mg(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1899
1899
|
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Oo(t,o);return Dg(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
|
|
1900
1900
|
`),2;let o=le(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
@@ -1904,9 +1904,9 @@ ${r}`:r}function NR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1904
1904
|
`),2)}function aC(t,e,r){let n=!1,s=!1,i=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}i.push(m)}if(i.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1905
1905
|
`),2;let o=le(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1906
1906
|
`),2;let a=i[1],l=Ft(t,o);if(l===null)return r.stderr.write(`error: escalation not found: ${o}
|
|
1907
|
-
`),1;let d=
|
|
1907
|
+
`),1;let d=xr(t).find(m=>m.id===o);if(d===void 0)return r.stderr.write(`error: escalation not found: ${o}
|
|
1908
1908
|
`),1;if(d.kind==="workflow_escalation"){let m=t.resumeEscalation(o,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${o})
|
|
1909
|
-
`),2;let p=
|
|
1909
|
+
`),2;let p=xr(t).find(_=>_.id===o),h={ok:!0,attention_id:o,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
|
|
1910
1910
|
`):r.stdout.write(`ok: attention ${o} acknowledged; run ${m.run.id} resumed with decision "${a}"
|
|
1911
1911
|
`),0}if(d.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${o} is kind=${d.kind}, not interactive_waiting_operator
|
|
1912
1912
|
`),2;if(d.acknowledged_at!==null)return r.stderr.write(`error: attention ${o} is already acknowledged (${d.acknowledged_at})
|
|
@@ -2053,27 +2053,27 @@ and \`lmctl api escalations\` (no args) print detailed usage.
|
|
|
2053
2053
|
|
|
2054
2054
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
2055
2055
|
and report the first step that would be started. Default output is the TTY
|
|
2056
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;KO=["open","assigned","closed","reopened"]});import Jg from"jexl";function $n(t){Jg.compile(Gg(t))}async function en(t,e){return Jg.eval(Gg(t),e)}function Gg(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Bs=T(()=>{"use strict"});import{z as v}from"zod";function Hc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var lC,Kg,Pc,Fc,Uc,Wc,qc,Bc,Vg,dC,cC,uC,Hs,fC,Uo,Wo,qo,Bo,Ho,Yg,mC,pC,_C,hC,Xo,Mn=T(()=>{"use strict";Bs();lC=v.object({kind:v.enum(["success","neutral","failure"])}),Kg=v.enum(["string","number","boolean","object","array"]),Pc=v.object({name:v.string().min(1),type:Kg,required:v.boolean().optional(),default:v.unknown().optional(),description:v.string().optional()}),Fc=v.object({name:v.string().min(1),type:Kg,source_step_id:v.string().min(1),source_field:v.string().min(1),description:v.string().optional()}),Uc=v.object({id:v.string().min(1),type:v.string().min(1),parameters:v.record(v.string(),v.unknown()).default({})}),Wc="__failure__",qc=v.object({tools:v.array(v.string().min(1)).optional(),auth:v.array(v.string().min(1)).optional()}).strict().optional(),Bc=v.object({on_unhandled_failure:v.object({attention_kind:v.string().min(1).default("workflow_failed"),severity:v.enum(["warn","error","critical"]).default("warn"),capture_evidence:v.boolean().default(!0),recommend_recovery:v.string().min(1).optional()}).optional(),on_unhandled_failure_state:v.string().min(1).optional()}).optional(),Vg=v.object({type:v.literal("AssertRepoClean"),fail_message:v.string().min(1).optional(),next:v.string().min(1)}),dC=v.object({name:v.string().min(1),command:v.string().min(1).optional(),args:v.array(v.string()).optional(),env:v.record(v.string(),v.string()).optional(),type:v.enum(["stdio","http","sse"]).optional(),url:v.string().min(1).optional(),headers:v.record(v.string(),v.string()).optional()}).strict(),cC=v.union([v.string().min(1),dC]),uC=v.union([v.string().min(1),v.object({name:v.string().min(1),content:v.string().min(1)}).strict()]),Hs=v.object({team:v.string().min(1),alias:v.string().min(1),prompt_template:v.string().optional(),mcp:v.array(cC).optional(),skills:v.array(uC).optional()}),fC=v.object({kind:v.literal("shell"),command:v.string().min(1),description:v.string().optional()}),Uo=v.object({type:v.literal("Review"),state_name:v.string().min(1),coder:Hs,pre_checks:v.array(fC).optional(),reviewers:v.array(Hs.extend({rubric_artifact:v.string().optional()})).optional(),outcomes:v.object({approve:v.string().min(1),request_changes:v.string().optional(),fail_pre_check:v.string().optional(),max_loops_exceeded:v.string().optional()}),writes_to_project_path:v.boolean().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional(),max_loops:v.number().int().positive().default(5),loop_feedback_artifact:v.string().optional(),outcomes_from_stance:v.record(v.string(),v.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"})}),Wo=v.object({type:v.literal("Consolidate"),state_name:v.string().min(1),researchers:v.array(Hs.extend({topic:v.string().min(1)})).optional(),consolidator:Hs,outcomes:v.object({ok:v.string().min(1),error:v.string().optional()}),research_artifact_prefix:v.string().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional()}),qo=v.object({type:v.literal("Interactive"),state_name:v.string().min(1),agent:Hs.extend({initial_prompt_template:v.string().min(1)}),termination:v.object({operator_signal:v.boolean().default(!0),agent_signal:v.string().optional(),max_turns:v.number().int().positive().default(20),timeout_seconds:v.number().int().positive().optional()}),outcomes:v.object({done:v.string().min(1),timeout:v.string().optional()}),artifact_name:v.string().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional()}),Bo=v.object({type:v.literal("Loop"),state_name:v.string().min(1),over:v.string().min(1),item_var:v.string().min(1),body:v.string().min(1),outcomes:v.object({ok:v.string().min(1),error:v.string().optional()}),stop_on_error:v.boolean().default(!0),max_items:v.number().int().positive().default(1e3)}),Ho=v.object({type:v.literal("ShellStep"),state_name:v.string().min(1),command:v.string().min(1),outcomes_from_exit:v.record(v.string(),v.string().min(1)),timeout_ms:v.number().int().nonnegative().optional(),capture_output_to:v.string().optional(),writes_to_project_path:v.boolean().optional()}),Yg=v.object({type:v.literal("Choice"),state_name:v.string().min(1),branches:v.array(v.object({when:v.string().min(1),next:v.string().min(1)})).default([]),default_next:v.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{$n(Hc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),mC=v.discriminatedUnion("type",[Vg,Uo,Wo,qo,Bo,Ho,Yg]),pC=v.object({type:v.literal("ForEach"),state_name:v.string().min(1),items_from:v.string().min(1),mode:v.enum(["sequential","parallel"]).default("sequential"),max_concurrency:v.number().int().positive().default(1),on_item_failure:v.enum(["continue","stop"]).default("stop"),body:mC,outcomes:v.object({all_ok:v.string().min(1),any_failed:v.string().optional()})}).superRefine((t,e)=>{try{$n(Hc(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}`})}}),_C=v.object({type:v.literal("Subflow"),state_name:v.string().min(1),workflow_name:v.string().min(1),inputs:v.record(v.string(),v.string().min(1)).optional(),outcomes:v.record(v.string(),v.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{$n(Hc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),hC=v.discriminatedUnion("type",[Vg,Uo,Wo,qo,Bo,Ho,Yg,pC,_C]),Xo=v.object({name:v.string().min(1),version:v.number().int().positive(),definition_schema_version:v.union([v.literal(1),v.literal(2)]),description:v.string().optional(),estimated_duration_ms:v.number().int().nonnegative().optional(),primitive_version:v.union([v.literal(1),v.literal(2)]).default(1),start_at:v.string().min(1),states:v.record(v.string().min(1),hC),terminals:v.record(v.string().min(1),lC),errors:Bc,concurrency_key:v.string().min(1).optional(),concurrent_limit:v.number().int().positive().optional(),default_task_timeout_ms:v.number().int().positive().max(216e5).optional(),inputs:v.array(Pc).optional(),outputs:v.array(Fc).optional(),triggers:v.array(Uc).optional(),read_only:v.boolean().optional(),requires:qc}).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}from"zod";var gC,Jo,yC,EC,wC,Ut,Dn=T(()=>{"use strict";Mn();gC=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Jo=z.string().regex(gC),yC=z.object({step_id:Jo,type:z.literal("main"),index:z.number().int().min(0)}),EC=z.record(Jo,z.record(z.string().min(1),z.array(z.array(yC)))),wC=z.object({id:Jo,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),Ut=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:Bc,inputs:z.array(Pc).optional(),outputs:z.array(Fc).optional(),steps:z.array(wC).min(1),connections:EC.default({}),entry_step_id:Jo,triggers:z.array(Uc).optional(),read_only:z.boolean().optional(),requires:qc}).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[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[d,c]of l.entries())r.has(c.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,d,"step_id"],message:`connection target does not reference an existing step: ${c.step_id}`})}})});function Go(t){return Jc(t)}function Jc(t){if(Array.isArray(t))return t.map(Jc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Jc(e[n]);if(typeof r.type=="string"){let n=vC[r.type];n!==void 0&&(r.type=n)}return r}var Xc,TC,vC,Gc=T(()=>{"use strict";Xc="lmctl.builtin.",TC={Review:`${Xc}Review`,Research:`${Xc}Research`,Consolidate:`${Xc}Consolidate`},vC=Object.fromEntries(Object.entries(TC).map(([t,e])=>[e,t]))});import{readFileSync as bC}from"node:fs";function Qg(t){return SC(t)}function SC(t){let e=Go(NC(t));if(IC(e),ey(e)===3)return kC(e);let r=Xo.safeParse(e);if(!r.success)throw new ir({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=AC(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new ir(n);return r.data}function kC(t){let e=Ut.safeParse(t);if(!e.success)throw new ir({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function IC(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=ey(t);if(!(e===null||zg.includes(e)))throw new ir({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${zg.join(", ")}`}]})}function ey(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 NC(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2057
|
-
`)||e.startsWith("{")||e.startsWith("[")?Zg(t,"$"):e.endsWith(".json")?Zg(bC(e,"utf8"),e):t}function Zg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new ir({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function AC(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"}),xC(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function xC(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 zg,ir,ty=T(()=>{"use strict";
|
|
2058
|
-
`),s=[];for(let k=0;k<n.length;k+=1){let C=jC(n[k]).trim();C.length>0&&s.push({n:k+1,text:C})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,d=[],c=[],u=[],f,m={},p=new Map,h=new Map,_=new Map,g=(k,I,C,W,U,j)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:I,params:C,line:W,isTerminal:U,...j?{members:j}:{}}),c.push(k)},y=k=>{let I=[],C=k+1;for(;C<s.length;C+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(W===null)break;I.push({label:W[1],dst:W[2]})}return{branches:I,nextIdx:C-1}};for(let k=1;k<s.length;k+=1){let{n:I,text:C}=s[k],W=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){k!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let U=/^meta\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),j=Rr(U[1],I,r);for(let te of Object.keys(j))iy.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...iy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(W==="step"){let U=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),j=U[1],te=U[2],Te=U[3],ce=sy[te];ce===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(sy).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:Yt}=$C(ce,Rr(Te,I,r));g(j,ce,Ae,I,!1,Object.keys(Yt).length>0?Yt:void 0);continue}if(W==="trigger"){let U=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),j=U[1],te=U[2],Te=U[3],ce=oy[te];ce===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(oy).join(", ")})`),p.has(j)&&r(I,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:ce,parameters:Rr(Te,I,r)});continue}if(W==="mcp"||W==="skill"){let U=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??r(I,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${C}`),j=U[1],te=U[2].trim(),Te=W==="mcp"?h:_;Te.has(j)&&r(I,`duplicate ${W} declaration: ${j}`);let ce;if(te.startsWith("{")){let Ae=Rr(te,I,r);W==="mcp"?ce={...Ae,name:j}:((typeof Ae.content!="string"||Ae.content.length===0)&&r(I,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ce={name:j,content:Ae.content})}else{let Ae=ly(te);(typeof Ae!="string"||Ae.length===0)&&r(I,`\`${W} ${j}\`: string form must be a non-empty file path or http(s) URL`),ce=Ae}Te.set(j,ce);continue}if(W==="terminal"){let U=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(U[1],"lmctl/terminal",{name:U[2],kind:U[3]??"neutral"},I,!0);continue}if(W==="seq"){let j=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(j.length<3||j.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<j.length+1&&!(te+2>j.length-1);te+=2){let Te=j[te],ce=j[te+1],Ae=j[te+2],Yt=ce==="->"?"main":ce.slice(1,-2);d.push({srcDeclId:Te,port:Yt,dstDeclId:Ae,line:I})}continue}if(W==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Te,ce=k+1;for(;ce<s.length;ce+=1){let Ae=s[ce].text,Yt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(Yt!==null){Te!==void 0&&r(s[ce].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let us=Yt[2];te.push({when:Yt[1].trim(),next:`@terminal:${us}`}),d.push({srcDeclId:j,port:us,dstDeclId:Yt[3],line:s[ce].n});continue}let Ml=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(Ml!==null){Te!==void 0&&r(s[ce].n,`\`choice ${j}\` has more than one \`default\``);let us=Ml[1];Te=`@terminal:${us}`,d.push({srcDeclId:j,port:us,dstDeclId:Ml[2],line:s[ce].n});continue}break}te.length===0&&r(I,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:te,...Te!==void 0?{default_next:Te}:{}},I,!1),k=ce-1;continue}if(W==="loop"){let U=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(U[1],"lmctl/loop",Rr(U[2],I,r),I,!1);continue}if(W==="foreach"){let U=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),j=Rr(U[2],I,r);"mode"in j&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(U[1],"lmctl/foreach",j,I,!1);continue}if(W==="call"){let U=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),j=U[1],te=Rr(U[2],I,r),Te=te.workflow;(typeof Te!="string"||Te.length===0)&&r(I,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:ce,...Ae}=te;g(j,"lmctl/subflow",{workflow_name:Te,...Ae},I,!1),u.push({declId:j,target:Te,line:I});continue}if(W==="decide"){let U=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),j=U[1],te=Rr(U[2],I,r),{branches:Te,nextIdx:ce}=y(k);Te.length===0&&r(I,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let Ae of Te)d.push({srcDeclId:j,port:Ae.label,dstDeclId:Ae.dst,line:I});k=ce;continue}if(W==="entry"){let U=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=U[1];continue}r(I,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}c.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=c[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=k=>{if(Array.isArray(k)){for(let C of k)E(C);return}if(typeof k!="object"||k===null)return;let I=k;if(typeof I.alias=="string")for(let[C,W]of[["mcp",h],["skills",_]]){let U=I[C];Array.isArray(U)&&(I[C]=U.map(j=>typeof j=="string"&&W.has(j)?structuredClone(W.get(j)):j))}for(let C of Object.values(I))E(C)};for(let k of c){let I=l.get(k);I.members!==void 0&&E(I.members)}let w=k=>ry(o,k),S=c.map(k=>{let I=l.get(k);return{id:w(k),name:k,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let k of d){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let I=w(k.srcDeclId);x[I]??={},x[I][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[I][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of c){let I=l.get(k);MC.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let J=new Map;for(let k of d){let I=J.get(k.srcDeclId);I===void 0?J.set(k.srcDeclId,[k.dstDeclId]):I.push(k.dstDeclId)}for(let k of c){let I=l.get(k);if(I.type!=="lmctl/loop")continue;let C=I.params.body;if(typeof C=="string"&&l.has(C)){let W=J.get(k);W===void 0?J.set(k,[C]):W.push(C)}}let F=new Set([f]),$=[f];for(;$.length>0;){let k=$.shift();for(let I of J.get(k)??[])F.has(I)||(F.add(I),$.push(I))}for(let k of c)F.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let R=new Map;for(let k of d){let I=R.get(k.srcDeclId);I===void 0&&(I=new Set,R.set(k.srcDeclId,I)),I.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of c){let I=l.get(k);if(I.isTerminal)continue;let C=R.get(k)??new Set;if(I.type==="lmctl/review"){let U=[...C].some(j=>!A.has(j));!C.has("approve")&&!U&&r(I.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -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 W=DC[I.type];if(W!==void 0)for(let U of W)C.has(U)||r(I.line,`uncovered outcome: required outcome \`${U}\` of step \`${k}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${k} -${U}-> <target|terminal>\`)`);else C.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${k}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of c){let I=l.get(k),C=OC[I.type];if(C===void 0)continue;let W={...I.params,...I.members??{},type:C.v2type,state_name:k,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},U=C.schema.safeParse(W);if(!U.success){let j=U.error.issues[0],te=j.path.length===0?"$":j.path.map(String).join(".");r(I.line,`step \`${k}\` (\`${I.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${j.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let Y={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:S,connections:x,entry_step_id:w(f)},B=Ut.safeParse(Y);if(!B.success)throw new jn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function jC(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 i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of PC(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=ly(l)}return s}function PC(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function ly(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 OC,CC,sy,jn,MC,DC,iy,oy,dy=T(()=>{"use strict";Dn();ny();Mn();OC={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Uo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Wo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:qo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Bo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ho}},CC={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};sy={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"},jn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2056
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;KO=["open","assigned","closed","reopened"]});import Jg from"jexl";function Mn(t){Jg.compile(Gg(t))}async function en(t,e){return Jg.eval(Gg(t),e)}function Gg(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Bs=T(()=>{"use strict"});import{z as v}from"zod";function Hc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var lC,Kg,Pc,Fc,Uc,Wc,qc,Bc,Vg,dC,cC,uC,Hs,fC,Uo,Wo,qo,Bo,Ho,Yg,mC,pC,_C,hC,Xo,Dn=T(()=>{"use strict";Bs();lC=v.object({kind:v.enum(["success","neutral","failure"])}),Kg=v.enum(["string","number","boolean","object","array"]),Pc=v.object({name:v.string().min(1),type:Kg,required:v.boolean().optional(),default:v.unknown().optional(),description:v.string().optional()}),Fc=v.object({name:v.string().min(1),type:Kg,source_step_id:v.string().min(1),source_field:v.string().min(1),description:v.string().optional()}),Uc=v.object({id:v.string().min(1),type:v.string().min(1),parameters:v.record(v.string(),v.unknown()).default({})}),Wc="__failure__",qc=v.object({tools:v.array(v.string().min(1)).optional(),auth:v.array(v.string().min(1)).optional()}).strict().optional(),Bc=v.object({on_unhandled_failure:v.object({attention_kind:v.string().min(1).default("workflow_failed"),severity:v.enum(["warn","error","critical"]).default("warn"),capture_evidence:v.boolean().default(!0),recommend_recovery:v.string().min(1).optional()}).optional(),on_unhandled_failure_state:v.string().min(1).optional()}).optional(),Vg=v.object({type:v.literal("AssertRepoClean"),fail_message:v.string().min(1).optional(),next:v.string().min(1)}),dC=v.object({name:v.string().min(1),command:v.string().min(1).optional(),args:v.array(v.string()).optional(),env:v.record(v.string(),v.string()).optional(),type:v.enum(["stdio","http","sse"]).optional(),url:v.string().min(1).optional(),headers:v.record(v.string(),v.string()).optional()}).strict(),cC=v.union([v.string().min(1),dC]),uC=v.union([v.string().min(1),v.object({name:v.string().min(1),content:v.string().min(1)}).strict()]),Hs=v.object({team:v.string().min(1),alias:v.string().min(1),prompt_template:v.string().optional(),mcp:v.array(cC).optional(),skills:v.array(uC).optional()}),fC=v.object({kind:v.literal("shell"),command:v.string().min(1),description:v.string().optional()}),Uo=v.object({type:v.literal("Review"),state_name:v.string().min(1),coder:Hs,pre_checks:v.array(fC).optional(),reviewers:v.array(Hs.extend({rubric_artifact:v.string().optional()})).optional(),outcomes:v.object({approve:v.string().min(1),request_changes:v.string().optional(),fail_pre_check:v.string().optional(),max_loops_exceeded:v.string().optional()}),writes_to_project_path:v.boolean().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional(),max_loops:v.number().int().positive().default(5),loop_feedback_artifact:v.string().optional(),outcomes_from_stance:v.record(v.string(),v.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"})}),Wo=v.object({type:v.literal("Consolidate"),state_name:v.string().min(1),researchers:v.array(Hs.extend({topic:v.string().min(1)})).optional(),consolidator:Hs,outcomes:v.object({ok:v.string().min(1),error:v.string().optional()}),research_artifact_prefix:v.string().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional()}),qo=v.object({type:v.literal("Interactive"),state_name:v.string().min(1),agent:Hs.extend({initial_prompt_template:v.string().min(1)}),termination:v.object({operator_signal:v.boolean().default(!0),agent_signal:v.string().optional(),max_turns:v.number().int().positive().default(20),timeout_seconds:v.number().int().positive().optional()}),outcomes:v.object({done:v.string().min(1),timeout:v.string().optional()}),artifact_name:v.string().optional(),durable_memory_tags:v.array(v.string().min(1)).optional(),write_back_durable_memory:v.union([v.boolean(),v.string().min(1)]).optional()}),Bo=v.object({type:v.literal("Loop"),state_name:v.string().min(1),over:v.string().min(1),item_var:v.string().min(1),body:v.string().min(1),outcomes:v.object({ok:v.string().min(1),error:v.string().optional()}),stop_on_error:v.boolean().default(!0),max_items:v.number().int().positive().default(1e3)}),Ho=v.object({type:v.literal("ShellStep"),state_name:v.string().min(1),command:v.string().min(1),outcomes_from_exit:v.record(v.string(),v.string().min(1)),timeout_ms:v.number().int().nonnegative().optional(),capture_output_to:v.string().optional(),writes_to_project_path:v.boolean().optional()}),Yg=v.object({type:v.literal("Choice"),state_name:v.string().min(1),branches:v.array(v.object({when:v.string().min(1),next:v.string().min(1)})).default([]),default_next:v.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Mn(Hc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),mC=v.discriminatedUnion("type",[Vg,Uo,Wo,qo,Bo,Ho,Yg]),pC=v.object({type:v.literal("ForEach"),state_name:v.string().min(1),items_from:v.string().min(1),mode:v.enum(["sequential","parallel"]).default("sequential"),max_concurrency:v.number().int().positive().default(1),on_item_failure:v.enum(["continue","stop"]).default("stop"),body:mC,outcomes:v.object({all_ok:v.string().min(1),any_failed:v.string().optional()})}).superRefine((t,e)=>{try{Mn(Hc(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}`})}}),_C=v.object({type:v.literal("Subflow"),state_name:v.string().min(1),workflow_name:v.string().min(1),inputs:v.record(v.string(),v.string().min(1)).optional(),outcomes:v.record(v.string(),v.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Mn(Hc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),hC=v.discriminatedUnion("type",[Vg,Uo,Wo,qo,Bo,Ho,Yg,pC,_C]),Xo=v.object({name:v.string().min(1),version:v.number().int().positive(),definition_schema_version:v.union([v.literal(1),v.literal(2)]),description:v.string().optional(),estimated_duration_ms:v.number().int().nonnegative().optional(),primitive_version:v.union([v.literal(1),v.literal(2)]).default(1),start_at:v.string().min(1),states:v.record(v.string().min(1),hC),terminals:v.record(v.string().min(1),lC),errors:Bc,concurrency_key:v.string().min(1).optional(),concurrent_limit:v.number().int().positive().optional(),default_task_timeout_ms:v.number().int().positive().max(216e5).optional(),inputs:v.array(Pc).optional(),outputs:v.array(Fc).optional(),triggers:v.array(Uc).optional(),read_only:v.boolean().optional(),requires:qc}).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}from"zod";var gC,Jo,yC,EC,wC,Ut,jn=T(()=>{"use strict";Dn();gC=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Jo=z.string().regex(gC),yC=z.object({step_id:Jo,type:z.literal("main"),index:z.number().int().min(0)}),EC=z.record(Jo,z.record(z.string().min(1),z.array(z.array(yC)))),wC=z.object({id:Jo,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),Ut=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:Bc,inputs:z.array(Pc).optional(),outputs:z.array(Fc).optional(),steps:z.array(wC).min(1),connections:EC.default({}),entry_step_id:Jo,triggers:z.array(Uc).optional(),read_only:z.boolean().optional(),requires:qc}).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[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[d,c]of l.entries())r.has(c.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,d,"step_id"],message:`connection target does not reference an existing step: ${c.step_id}`})}})});function Go(t){return Jc(t)}function Jc(t){if(Array.isArray(t))return t.map(Jc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Jc(e[n]);if(typeof r.type=="string"){let n=vC[r.type];n!==void 0&&(r.type=n)}return r}var Xc,TC,vC,Gc=T(()=>{"use strict";Xc="lmctl.builtin.",TC={Review:`${Xc}Review`,Research:`${Xc}Research`,Consolidate:`${Xc}Consolidate`},vC=Object.fromEntries(Object.entries(TC).map(([t,e])=>[e,t]))});import{readFileSync as bC}from"node:fs";function Qg(t){return SC(t)}function SC(t){let e=Go(NC(t));if(IC(e),ey(e)===3)return kC(e);let r=Xo.safeParse(e);if(!r.success)throw new ir({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=AC(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new ir(n);return r.data}function kC(t){let e=Ut.safeParse(t);if(!e.success)throw new ir({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function IC(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=ey(t);if(!(e===null||zg.includes(e)))throw new ir({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${zg.join(", ")}`}]})}function ey(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 NC(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2057
|
+
`)||e.startsWith("{")||e.startsWith("[")?Zg(t,"$"):e.endsWith(".json")?Zg(bC(e,"utf8"),e):t}function Zg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new ir({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function AC(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"}),xC(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function xC(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 zg,ir,ty=T(()=>{"use strict";Dn();jn();Gc();zg=[1,2,3],ir=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 RC}from"node:crypto";function ry(t,e){let r=LC(e),n=RC("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function LC(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var ny=T(()=>{"use strict";jn()});function $C(t,e){let r=CC[t]??[],n={},s={};for(let[i,o]of Object.entries(e))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function ay(t){let e=[],r=(k,I)=>{throw new Pn([{line:k,message:I}])},n=t.split(`
|
|
2058
|
+
`),s=[];for(let k=0;k<n.length;k+=1){let C=jC(n[k]).trim();C.length>0&&s.push({n:k+1,text:C})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,d=[],c=[],u=[],f,m={},p=new Map,h=new Map,_=new Map,g=(k,I,C,W,U,j)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:I,params:C,line:W,isTerminal:U,...j?{members:j}:{}}),c.push(k)},y=k=>{let I=[],C=k+1;for(;C<s.length;C+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(W===null)break;I.push({label:W[1],dst:W[2]})}return{branches:I,nextIdx:C-1}};for(let k=1;k<s.length;k+=1){let{n:I,text:C}=s[k],W=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){k!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let U=/^meta\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),j=Lr(U[1],I,r);for(let te of Object.keys(j))iy.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...iy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(W==="step"){let U=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),j=U[1],te=U[2],Te=U[3],ce=sy[te];ce===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(sy).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:Yt}=$C(ce,Lr(Te,I,r));g(j,ce,Ae,I,!1,Object.keys(Yt).length>0?Yt:void 0);continue}if(W==="trigger"){let U=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),j=U[1],te=U[2],Te=U[3],ce=oy[te];ce===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(oy).join(", ")})`),p.has(j)&&r(I,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:ce,parameters:Lr(Te,I,r)});continue}if(W==="mcp"||W==="skill"){let U=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??r(I,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${C}`),j=U[1],te=U[2].trim(),Te=W==="mcp"?h:_;Te.has(j)&&r(I,`duplicate ${W} declaration: ${j}`);let ce;if(te.startsWith("{")){let Ae=Lr(te,I,r);W==="mcp"?ce={...Ae,name:j}:((typeof Ae.content!="string"||Ae.content.length===0)&&r(I,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ce={name:j,content:Ae.content})}else{let Ae=ly(te);(typeof Ae!="string"||Ae.length===0)&&r(I,`\`${W} ${j}\`: string form must be a non-empty file path or http(s) URL`),ce=Ae}Te.set(j,ce);continue}if(W==="terminal"){let U=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(U[1],"lmctl/terminal",{name:U[2],kind:U[3]??"neutral"},I,!0);continue}if(W==="seq"){let j=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(j.length<3||j.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<j.length+1&&!(te+2>j.length-1);te+=2){let Te=j[te],ce=j[te+1],Ae=j[te+2],Yt=ce==="->"?"main":ce.slice(1,-2);d.push({srcDeclId:Te,port:Yt,dstDeclId:Ae,line:I})}continue}if(W==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Te,ce=k+1;for(;ce<s.length;ce+=1){let Ae=s[ce].text,Yt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(Yt!==null){Te!==void 0&&r(s[ce].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let us=Yt[2];te.push({when:Yt[1].trim(),next:`@terminal:${us}`}),d.push({srcDeclId:j,port:us,dstDeclId:Yt[3],line:s[ce].n});continue}let Ml=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(Ml!==null){Te!==void 0&&r(s[ce].n,`\`choice ${j}\` has more than one \`default\``);let us=Ml[1];Te=`@terminal:${us}`,d.push({srcDeclId:j,port:us,dstDeclId:Ml[2],line:s[ce].n});continue}break}te.length===0&&r(I,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:te,...Te!==void 0?{default_next:Te}:{}},I,!1),k=ce-1;continue}if(W==="loop"){let U=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(U[1],"lmctl/loop",Lr(U[2],I,r),I,!1);continue}if(W==="foreach"){let U=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),j=Lr(U[2],I,r);"mode"in j&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(U[1],"lmctl/foreach",j,I,!1);continue}if(W==="call"){let U=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),j=U[1],te=Lr(U[2],I,r),Te=te.workflow;(typeof Te!="string"||Te.length===0)&&r(I,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:ce,...Ae}=te;g(j,"lmctl/subflow",{workflow_name:Te,...Ae},I,!1),u.push({declId:j,target:Te,line:I});continue}if(W==="decide"){let U=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),j=U[1],te=Lr(U[2],I,r),{branches:Te,nextIdx:ce}=y(k);Te.length===0&&r(I,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let Ae of Te)d.push({srcDeclId:j,port:Ae.label,dstDeclId:Ae.dst,line:I});k=ce;continue}if(W==="entry"){let U=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=U[1];continue}r(I,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}c.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=c[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=k=>{if(Array.isArray(k)){for(let C of k)E(C);return}if(typeof k!="object"||k===null)return;let I=k;if(typeof I.alias=="string")for(let[C,W]of[["mcp",h],["skills",_]]){let U=I[C];Array.isArray(U)&&(I[C]=U.map(j=>typeof j=="string"&&W.has(j)?structuredClone(W.get(j)):j))}for(let C of Object.values(I))E(C)};for(let k of c){let I=l.get(k);I.members!==void 0&&E(I.members)}let w=k=>ry(o,k),S=c.map(k=>{let I=l.get(k);return{id:w(k),name:k,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let k of d){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let I=w(k.srcDeclId);x[I]??={},x[I][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[I][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of c){let I=l.get(k);MC.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let J=new Map;for(let k of d){let I=J.get(k.srcDeclId);I===void 0?J.set(k.srcDeclId,[k.dstDeclId]):I.push(k.dstDeclId)}for(let k of c){let I=l.get(k);if(I.type!=="lmctl/loop")continue;let C=I.params.body;if(typeof C=="string"&&l.has(C)){let W=J.get(k);W===void 0?J.set(k,[C]):W.push(C)}}let F=new Set([f]),$=[f];for(;$.length>0;){let k=$.shift();for(let I of J.get(k)??[])F.has(I)||(F.add(I),$.push(I))}for(let k of c)F.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let R=new Map;for(let k of d){let I=R.get(k.srcDeclId);I===void 0&&(I=new Set,R.set(k.srcDeclId,I)),I.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of c){let I=l.get(k);if(I.isTerminal)continue;let C=R.get(k)??new Set;if(I.type==="lmctl/review"){let U=[...C].some(j=>!A.has(j));!C.has("approve")&&!U&&r(I.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -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 W=DC[I.type];if(W!==void 0)for(let U of W)C.has(U)||r(I.line,`uncovered outcome: required outcome \`${U}\` of step \`${k}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${k} -${U}-> <target|terminal>\`)`);else C.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${k}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of c){let I=l.get(k),C=OC[I.type];if(C===void 0)continue;let W={...I.params,...I.members??{},type:C.v2type,state_name:k,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},U=C.schema.safeParse(W);if(!U.success){let j=U.error.issues[0],te=j.path.length===0?"$":j.path.map(String).join(".");r(I.line,`step \`${k}\` (\`${I.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${j.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let Y={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:S,connections:x,entry_step_id:w(f)},B=Ut.safeParse(Y);if(!B.success)throw new Pn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function jC(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function Lr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of PC(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=ly(l)}return s}function PC(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function ly(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 OC,CC,sy,Pn,MC,DC,iy,oy,dy=T(()=>{"use strict";jn();ny();Dn();OC={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Uo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Wo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:qo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Bo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ho}},CC={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};sy={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"},Pn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2059
2059
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
2060
2060
|
`)}`),this.issues=e,this.name="DslCompileError"}},MC=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"]),DC={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},iy=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),oy={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as FC}from"node:fs";function UC(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function WC(t){for(let e of t.split(`
|
|
2061
|
-
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function wt(t){if(typeof t=="string"&&UC()&&WC(t)){let r;try{r=ay(t)}catch(s){throw s instanceof
|
|
2062
|
-
`)||e.startsWith("{")||e.startsWith("[")?cy(t):e.endsWith(".json")?cy(FC(e,"utf8")):t}function cy(t){return JSON.parse(t)}function HC(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kc,or,Xs=T(()=>{"use strict";Mn();ty();Gc();Dn();dy();Kc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},or=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Ko(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:XC(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:GC(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function XC(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=JC(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function JC(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 GC(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Vc=T(()=>{"use strict"});var uy={};he(uy,{enqueueFromAgentOutput:()=>VC,enqueueFromGitHubIssue:()=>Yc,enqueueManual:()=>KC,enqueueScheduled:()=>YC});function Yc(t,e){return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function KC(t,e){return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key})}function VC(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key})}function YC(t,e){return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key})}function Vo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Yo(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 i=wt(s.definition),o={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=Ko({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var zc=T(()=>{"use strict";Xs();Vc()});async function my(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return fy(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 i of e){if(!await zC(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...ZC(i.parameters_override)},l=fy(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function fy(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Yc(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function zC(t,e){if(t===null||t.trim().length===0)return!0;try{return await en(t,e)===!0}catch{return!1}}function ZC(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 py=T(()=>{"use strict";Bs();zc()});import{spawnSync as QC}from"node:child_process";async function e$(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=QC(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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!r$(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await my({dal:t.dal,project:t.project,issue:n$(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function zo(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=t$(r.intake_config);try{let s=await e$({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});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:i})})}catch{}}}return e}function t$(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Zc(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 r$(t){return Array.isArray(t)&&t.every(e=>{if(!Zc(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:Zc(n)&&typeof n.name=="string"))})}function n$(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 Zc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Qc=T(()=>{"use strict";py()});function hy(t){return async e=>i$(t.app,e,t.log!==void 0?{log:t.log}:{})}async function i$(t,e,r={}){let n=o$(e.path),s={"content-type":"application/json",...e.headers??{},[Zo]:eu},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),d=await a$(l);if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${_y(e.path)} \u2192 ${d.status} (${c}ms)`)}return d}catch(l){if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${_y(e.path)} \u2192 ERR (${d}ms)`)}throw l}}function _y(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function o$(t){let e=t.startsWith("/")?t:`/${t}`;return`${s$}${e}`}async function a$(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((i,o)=>{o.toLowerCase()!==Zo&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Zo,eu,s$,tu=T(()=>{"use strict";Zo="x-mailbox-channel",eu="1",s$="http://mailbox.local"});import{createHash as gy,createHmac as l$,timingSafeEqual as d$}from"node:crypto";function yy(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=Ey();if(n===null||p$(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(Zo)===eu){await r();return}let s=e.req.query("token");if(s!==void 0&&Qo(s,n)){nu(e,n),await r();return}if(m$(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Ey(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function wy(t){let e=Ey();return e!==null&&Qo(t,e)}function nu(t,e,r=new Date){t.header("Set-Cookie",`${ru}=${u$(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ty(t){t.header("Set-Cookie",`${ru}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function u$(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+c$*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${vy(t,n)}`,"utf8").toString("base64url")}function f$(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 i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:Qo(s[2],vy(e,`${s[0]}|${s[1]}`))}function Qo(t,e){return d$(gy("sha256").update(t).digest(),gy("sha256").update(e).digest())}function m$(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Qo(r,e))return!0;let n=_$(t.req.header("cookie")??"")[ru];return n!==void 0&&f$(n,e)}function p$(t){return t==="/login"||t==="/logout"}function _$(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 vy(t,e){return l$("sha256",t).update(e).digest("hex")}var ru,c$,by=T(()=>{"use strict";tu();ru="lmctl_next_session",c$=30});import{existsSync as Pn,mkdirSync as h$,readdirSync as g$,readFileSync as ea,unlinkSync as y$,writeFileSync as ou}from"node:fs";import{join as tn}from"node:path";function ut(t){if(!E$.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function ky(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(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return b$(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Sy,updated_at:Sy}:null}function w$(t,e,r,n){let s=r!==null?`
|
|
2061
|
+
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function wt(t){if(typeof t=="string"&&UC()&&WC(t)){let r;try{r=ay(t)}catch(s){throw s instanceof Pn?new or(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=Ut.safeParse(r);if(!n.success)throw new or(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Go(BC(t));if(HC(e)&&e.definition_schema_version===3){let r=Ut.safeParse(e);if(!r.success)throw new or(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return qC(e)}function qC(t){let e=Xo.safeParse(t);if(!e.success)throw new or(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,i]of Object.entries(r.states))if(n.has(i.type))throw new or([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return Qg(r)}catch(s){throw s instanceof ir?new Kc(s):s}}function BC(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2062
|
+
`)||e.startsWith("{")||e.startsWith("[")?cy(t):e.endsWith(".json")?cy(FC(e,"utf8")):t}function cy(t){return JSON.parse(t)}function HC(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kc,or,Xs=T(()=>{"use strict";Dn();ty();Gc();jn();dy();Kc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},or=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Ko(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:XC(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:GC(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function XC(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=JC(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function JC(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 GC(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Vc=T(()=>{"use strict"});var uy={};he(uy,{enqueueFromAgentOutput:()=>VC,enqueueFromGitHubIssue:()=>Yc,enqueueManual:()=>KC,enqueueScheduled:()=>YC});function Yc(t,e){return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function KC(t,e){return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key})}function VC(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key})}function YC(t,e){return Yo(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:Vo(e.payload),concurrency_key:e.concurrency_key})}function Vo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Yo(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 i=wt(s.definition),o={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=Ko({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var zc=T(()=>{"use strict";Xs();Vc()});async function my(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return fy(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 i of e){if(!await zC(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...ZC(i.parameters_override)},l=fy(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function fy(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Yc(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function zC(t,e){if(t===null||t.trim().length===0)return!0;try{return await en(t,e)===!0}catch{return!1}}function ZC(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 py=T(()=>{"use strict";Bs();zc()});import{spawnSync as QC}from"node:child_process";async function e$(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=QC(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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!r$(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await my({dal:t.dal,project:t.project,issue:n$(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function zo(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=t$(r.intake_config);try{let s=await e$({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});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:i})})}catch{}}}return e}function t$(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Zc(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 r$(t){return Array.isArray(t)&&t.every(e=>{if(!Zc(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:Zc(n)&&typeof n.name=="string"))})}function n$(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 Zc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Qc=T(()=>{"use strict";py()});function hy(t){return async e=>i$(t.app,e,t.log!==void 0?{log:t.log}:{})}async function i$(t,e,r={}){let n=o$(e.path),s={"content-type":"application/json",...e.headers??{},[Zo]:eu},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),d=await a$(l);if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${_y(e.path)} \u2192 ${d.status} (${c}ms)`)}return d}catch(l){if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${_y(e.path)} \u2192 ERR (${d}ms)`)}throw l}}function _y(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function o$(t){let e=t.startsWith("/")?t:`/${t}`;return`${s$}${e}`}async function a$(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((i,o)=>{o.toLowerCase()!==Zo&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Zo,eu,s$,tu=T(()=>{"use strict";Zo="x-mailbox-channel",eu="1",s$="http://mailbox.local"});import{createHash as gy,createHmac as l$,timingSafeEqual as d$}from"node:crypto";function yy(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=Ey();if(n===null||p$(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(Zo)===eu){await r();return}let s=e.req.query("token");if(s!==void 0&&Qo(s,n)){nu(e,n),await r();return}if(m$(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Ey(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function wy(t){let e=Ey();return e!==null&&Qo(t,e)}function nu(t,e,r=new Date){t.header("Set-Cookie",`${ru}=${u$(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ty(t){t.header("Set-Cookie",`${ru}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function u$(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+c$*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${vy(t,n)}`,"utf8").toString("base64url")}function f$(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 i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:Qo(s[2],vy(e,`${s[0]}|${s[1]}`))}function Qo(t,e){return d$(gy("sha256").update(t).digest(),gy("sha256").update(e).digest())}function m$(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Qo(r,e))return!0;let n=_$(t.req.header("cookie")??"")[ru];return n!==void 0&&f$(n,e)}function p$(t){return t==="/login"||t==="/logout"}function _$(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 vy(t,e){return l$("sha256",t).update(e).digest("hex")}var ru,c$,by=T(()=>{"use strict";tu();ru="lmctl_next_session",c$=30});import{existsSync as Fn,mkdirSync as h$,readdirSync as g$,readFileSync as ea,unlinkSync as y$,writeFileSync as ou}from"node:fs";import{join as tn}from"node:path";function ut(t){if(!E$.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function ky(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(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return b$(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Sy,updated_at:Sy}:null}function w$(t,e,r,n){let s=r!==null?`
|
|
2063
2063
|
description: ${r}`:"";return`---
|
|
2064
2064
|
name: ${t}${s}
|
|
2065
2065
|
type: ${e}
|
|
2066
2066
|
---
|
|
2067
|
-
${n}`}function T$(t,e,r,n){let s=tn(t,au),i=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=
|
|
2067
|
+
${n}`}function T$(t,e,r,n){let s=tn(t,au),i=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=Fn(s)?ea(s,"utf8"):"",a=new RegExp(`^- \\[${Iy(e)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
|
|
2068
2068
|
`)?`${o}
|
|
2069
2069
|
${i}
|
|
2070
2070
|
`:`${o}${i}
|
|
2071
|
-
`,ou(s,o,"utf8")}function v$(t,e){let r=tn(t,au);if(!Pn(r))return;let n=ea(r,"utf8"),s=new RegExp(`^- \\[${Iy(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&ou(r,n.replace(s,""),"utf8")}function Iy(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function b$(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function Tt(t,e){return t.durable_memory_mode==="db"?new iu(e,t.id):new su(t.local_path)}var E$,au,Sy,su,iu,lu=T(()=>{"use strict";E$=/^[a-zA-Z0-9_-]+$/;au="MEMORY.md",Sy="1970-01-01T00:00:00.000Z",su=class{dir;constructor(e){this.dir=tn(e,"durable-memory")}read(e){ut(e);let r=tn(this.dir,`${e}.md`);if(!Pn(r))return null;let n=ea(r,"utf8");return ky(e,n)}write(e){ut(e.name),h$(this.dir,{recursive:!0});let r=tn(this.dir,`${e.name}.md`),n=!Pn(r),s=w$(e.name,e.type,e.description??null,e.body);return ou(r,s,"utf8"),T$(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:i})=>({name:r,type:n,description:s,updated_at:i}))}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){ut(e);let r=tn(this.dir,`${e}.md`);return Pn(r)?(y$(r),v$(this.dir,e),!0):!1}listFiles(){if(!Pn(this.dir))return[];let e=g$(this.dir).filter(n=>n.endsWith(".md")&&n!==au),r=[];for(let n of e){let s=n.slice(0,-3),i=ea(tn(this.dir,n),"utf8"),o=ky(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};iu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){ut(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){ut(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 ut(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Ay(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=Tt(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(d=>d.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=Tt(o,r),l;try{l=a.read(i)}catch(d){return n.json({error:d.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,d=typeof o.body=="string"?o.body:null,c=typeof o.description=="string"?o.description:null;if(a===null||!Ny.has(a))return n.json({error:`invalid type: must be one of ${[...Ny].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(d===null)return n.json({error:"missing body"},400);let u=Tt(i,r),f;try{({created:f}=u.write({type:a,name:l,description:c,body:d}))}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")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=Tt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Ny,xy=T(()=>{"use strict";lu();Ny=new Set(["user","feedback","project","reference"])});function k$(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(S$[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function I$(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 Ry(t,e=new Date){let{time:r,date:n}=I$(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let _=a.encode(h.name),g=k$(h.data),y=h.data.length,E=new Uint8Array(30+_.length),w=new DataView(E.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,g,!0),w.setUint32(18,y,!0),w.setUint32(22,y,!0),w.setUint16(26,_.length,!0),w.setUint16(28,0,!0),E.set(_,30),s.push(E,h.data);let S=new Uint8Array(46+_.length),x=new DataView(S.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,g,!0),x.setUint32(20,y,!0),x.setUint32(24,y,!0),x.setUint16(28,_.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),S.set(_,46),i.push(S),o+=E.length+h.data.length}let l=o,d=0;for(let h of i)d+=h.length;let c=new Uint8Array(22),u=new DataView(c.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,d,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+d+c.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(c,p),m}var S$,Ly=T(()=>{"use strict";S$=(()=>{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 na,mkdirSync as N$,readdirSync as A$,readFileSync as $y,statSync as x$,unlinkSync as R$,writeFileSync as L$}from"node:fs";import{join as Ks}from"node:path";function My(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await vt(n);if(typeof s=="string")return L(n,s,400);let i=me(s,"name"),o=me(s,"local_path");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(o===null||o.length===0)return L(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return L(n,`project already exists: ${i}`,409);let a=me(s,"workflow_name")??"bugfix",l,d=me(s,"team_name");if(d!==null&&d.length>0){let u=r.findTeamByName(d);if(u===null)return L(n,`team not found: ${d}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return L(n,"no teams exist; create a team first",400);l=u[0].id}let c=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:me(s,"default_branch")});return n.json(c,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return L(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return L(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return L(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return L(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?L(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await vt(n);if(typeof s=="string")return L(n,s,400);let i=me(s,"name");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return L(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return L(n,"team not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"alias"),a=me(i,"provider");if(o===null||o.length===0)return L(n,"missing or empty alias",400);if(a===null||a.length===0)return L(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return L(n,`member already exists: ${o}`,409);let l=me(i,"model"),d=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),c=me(i,"role_prompt");c!==null&&r.setMemberRolePrompt(d.id,c);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??d,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return L(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return L(n,"member not found",404);let o=await vt(n);if(typeof o=="string")return L(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let d=o.role_prompt;if(d!==null&&typeof d!="string")return L(n,"role_prompt must be string or null",400);a.role_prompt=d}if(Object.prototype.hasOwnProperty.call(o,"model")){let d=o.model;if(d!==null&&typeof d!="string")return L(n,"model must be string or null",400);a.model=d}if(Object.prototype.hasOwnProperty.call(o,"provider")){let d=o.provider;if(typeof d!="string"||d.length===0)return L(n,"provider must be a non-empty string",400);a.provider=d}if(Object.keys(a).length===0)return L(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?L(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 L(n,"project not found",404);let i=Tt(s,r);return n.json(i.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"name"),a=me(i,"body"),l=me(i,"type");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ta.includes(l))return L(n,`invalid type: must be one of ${ta.join("|")}`,400);try{ut(o)}catch(u){return L(n,u.message,400)}let d=Tt(s,r);try{if(d.read(o)!==null)return L(n,`chapter already exists: ${o}`,409)}catch(u){return L(n,u.message,400)}try{d.write({type:l,name:o,description:me(i,"description"),body:a})}catch(u){return L(n,u.message,400)}let c=d.read(o);return c===null?L(n,"chapter created but unreadable",500):n.json(c,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=Tt(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return o===null?L(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=n.req.param("chapter"),o=await vt(n);if(typeof o=="string")return L(n,o,400);let a=Tt(s,r),l;try{l=a.read(i)}catch(m){return L(n,m.message,400)}if(l===null)return L(n,"chapter not found",404);let d=me(o,"body")??l.body,c=Object.prototype.hasOwnProperty.call(o,"description")?me(o,"description"):l.description,u=me(o,"type")??l.type;if(!ta.includes(u))return L(n,`invalid type: must be one of ${ta.join("|")}`,400);try{a.write({type:u,name:i,description:c,body:d})}catch(m){return L(n,m.message,400)}let f=a.read(i);return f===null?L(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 L(n,"project not found",404);let i=Tt(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return o?n.json({removed:!0}):L(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?L(n,"project not found",404):n.json(C$(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"name"),a=me(i,"body"),l=me(i,"type");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ra.has(l))return L(n,`invalid type: must be one of ${[...ra].join("|")}`,400);try{ut(o)}catch(f){return L(n,f.message,400)}let d=Js(s.local_path),c=Ks(d,`${o}.md`);if(na(c))return L(n,`chapter already exists: ${o}`,409);N$(d,{recursive:!0}),Cy(c,o,l,me(i,"description"),a);let u=Gs(d,o);return u===null?L(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);try{ut(n.req.param("chapter"))}catch(o){return L(n,o.message,400)}let i=Gs(Js(s.local_path),n.req.param("chapter"));return i===null?L(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=n.req.param("chapter");try{ut(i)}catch(m){return L(n,m.message,400)}let o=Js(s.local_path),a=Gs(o,i);if(a===null)return L(n,"chapter not found",404);let l=await vt(n);if(typeof l=="string")return L(n,l,400);let d=me(l,"body")??a.body,c=Object.prototype.hasOwnProperty.call(l,"description")?me(l,"description"):a.description,u=me(l,"type")??a.type;if(!ra.has(u))return L(n,`invalid type: must be one of ${[...ra].join("|")}`,400);Cy(Ks(o,`${i}.md`),i,u,c,d);let f=Gs(o,i);return f===null?L(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 L(n,"project not found",404);let i=n.req.param("chapter");try{ut(i)}catch(a){return L(n,a.message,400)}let o=Ks(Js(s.local_path),`${i}.md`);return na(o)?(R$(o),n.json({removed:!0})):L(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>L(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 vt(n);return typeof s=="string"?L(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Oy))),t.post("/api/chat/sessions",async n=>{let s=await O$(n);if(typeof s=="string")return L(n,s,400);let i=s!==null?me(s,"title"):null,o=r.createChatbotSession(Oy,i);return n.json(o,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?L(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 L(n,"chat session not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"role"),a=me(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(n,"role must be one of user|assistant|tool",400);if(a===null)return L(n,"missing content",400);let l=r.appendChatbotMessage(s,o,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 L(n,"invalid run id",400);if(r.getRun(s)===null)return L(n,"run not found",404);let o=Zr(r,s),a=[];for(let d of o){let c=M$(d),u=null;if(d.content!==null&&d.content!==void 0)u=new TextEncoder().encode(d.content);else if(d.path!==null&&d.path!==void 0)try{let f=$y(d.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:c,data:u})}let l=Ry(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 L(t,e,r){return t.json({error:e},r)}async function vt(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 O$(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 me(t,e){let r=t[e];return typeof r!="string"?null:r}function Js(t){return Ks(t,"ai-test")}function Gs(t,e){let r=Ks(t,`${e}.md`);if(!na(r))return null;let n=$y(r,"utf8"),s=$$(n),i=x$(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function C$(t){let e=Js(t);return na(e)?A$(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Gs(e,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Cy(t,e,r,n,s){let i=n!==null&&n.length>0?`
|
|
2071
|
+
`,ou(s,o,"utf8")}function v$(t,e){let r=tn(t,au);if(!Fn(r))return;let n=ea(r,"utf8"),s=new RegExp(`^- \\[${Iy(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&ou(r,n.replace(s,""),"utf8")}function Iy(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function b$(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function Tt(t,e){return t.durable_memory_mode==="db"?new iu(e,t.id):new su(t.local_path)}var E$,au,Sy,su,iu,lu=T(()=>{"use strict";E$=/^[a-zA-Z0-9_-]+$/;au="MEMORY.md",Sy="1970-01-01T00:00:00.000Z",su=class{dir;constructor(e){this.dir=tn(e,"durable-memory")}read(e){ut(e);let r=tn(this.dir,`${e}.md`);if(!Fn(r))return null;let n=ea(r,"utf8");return ky(e,n)}write(e){ut(e.name),h$(this.dir,{recursive:!0});let r=tn(this.dir,`${e.name}.md`),n=!Fn(r),s=w$(e.name,e.type,e.description??null,e.body);return ou(r,s,"utf8"),T$(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:i})=>({name:r,type:n,description:s,updated_at:i}))}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){ut(e);let r=tn(this.dir,`${e}.md`);return Fn(r)?(y$(r),v$(this.dir,e),!0):!1}listFiles(){if(!Fn(this.dir))return[];let e=g$(this.dir).filter(n=>n.endsWith(".md")&&n!==au),r=[];for(let n of e){let s=n.slice(0,-3),i=ea(tn(this.dir,n),"utf8"),o=ky(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};iu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){ut(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){ut(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 ut(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Ay(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=Tt(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(d=>d.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=Tt(o,r),l;try{l=a.read(i)}catch(d){return n.json({error:d.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,d=typeof o.body=="string"?o.body:null,c=typeof o.description=="string"?o.description:null;if(a===null||!Ny.has(a))return n.json({error:`invalid type: must be one of ${[...Ny].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(d===null)return n.json({error:"missing body"},400);let u=Tt(i,r),f;try{({created:f}=u.write({type:a,name:l,description:c,body:d}))}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")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=Tt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Ny,xy=T(()=>{"use strict";lu();Ny=new Set(["user","feedback","project","reference"])});function k$(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(S$[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function I$(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 Ry(t,e=new Date){let{time:r,date:n}=I$(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let _=a.encode(h.name),g=k$(h.data),y=h.data.length,E=new Uint8Array(30+_.length),w=new DataView(E.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,g,!0),w.setUint32(18,y,!0),w.setUint32(22,y,!0),w.setUint16(26,_.length,!0),w.setUint16(28,0,!0),E.set(_,30),s.push(E,h.data);let S=new Uint8Array(46+_.length),x=new DataView(S.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,g,!0),x.setUint32(20,y,!0),x.setUint32(24,y,!0),x.setUint16(28,_.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),S.set(_,46),i.push(S),o+=E.length+h.data.length}let l=o,d=0;for(let h of i)d+=h.length;let c=new Uint8Array(22),u=new DataView(c.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,d,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+d+c.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(c,p),m}var S$,Ly=T(()=>{"use strict";S$=(()=>{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 na,mkdirSync as N$,readdirSync as A$,readFileSync as $y,statSync as x$,unlinkSync as R$,writeFileSync as L$}from"node:fs";import{join as Ks}from"node:path";function My(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await vt(n);if(typeof s=="string")return L(n,s,400);let i=me(s,"name"),o=me(s,"local_path");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(o===null||o.length===0)return L(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return L(n,`project already exists: ${i}`,409);let a=me(s,"workflow_name")??"bugfix",l,d=me(s,"team_name");if(d!==null&&d.length>0){let u=r.findTeamByName(d);if(u===null)return L(n,`team not found: ${d}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return L(n,"no teams exist; create a team first",400);l=u[0].id}let c=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:me(s,"default_branch")});return n.json(c,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return L(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return L(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return L(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return L(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?L(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await vt(n);if(typeof s=="string")return L(n,s,400);let i=me(s,"name");if(i===null||i.length===0)return L(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return L(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return L(n,"team not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"alias"),a=me(i,"provider");if(o===null||o.length===0)return L(n,"missing or empty alias",400);if(a===null||a.length===0)return L(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return L(n,`member already exists: ${o}`,409);let l=me(i,"model"),d=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),c=me(i,"role_prompt");c!==null&&r.setMemberRolePrompt(d.id,c);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??d,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return L(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return L(n,"member not found",404);let o=await vt(n);if(typeof o=="string")return L(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let d=o.role_prompt;if(d!==null&&typeof d!="string")return L(n,"role_prompt must be string or null",400);a.role_prompt=d}if(Object.prototype.hasOwnProperty.call(o,"model")){let d=o.model;if(d!==null&&typeof d!="string")return L(n,"model must be string or null",400);a.model=d}if(Object.prototype.hasOwnProperty.call(o,"provider")){let d=o.provider;if(typeof d!="string"||d.length===0)return L(n,"provider must be a non-empty string",400);a.provider=d}if(Object.keys(a).length===0)return L(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?L(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 L(n,"project not found",404);let i=Tt(s,r);return n.json(i.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"name"),a=me(i,"body"),l=me(i,"type");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ta.includes(l))return L(n,`invalid type: must be one of ${ta.join("|")}`,400);try{ut(o)}catch(u){return L(n,u.message,400)}let d=Tt(s,r);try{if(d.read(o)!==null)return L(n,`chapter already exists: ${o}`,409)}catch(u){return L(n,u.message,400)}try{d.write({type:l,name:o,description:me(i,"description"),body:a})}catch(u){return L(n,u.message,400)}let c=d.read(o);return c===null?L(n,"chapter created but unreadable",500):n.json(c,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=Tt(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return o===null?L(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=n.req.param("chapter"),o=await vt(n);if(typeof o=="string")return L(n,o,400);let a=Tt(s,r),l;try{l=a.read(i)}catch(m){return L(n,m.message,400)}if(l===null)return L(n,"chapter not found",404);let d=me(o,"body")??l.body,c=Object.prototype.hasOwnProperty.call(o,"description")?me(o,"description"):l.description,u=me(o,"type")??l.type;if(!ta.includes(u))return L(n,`invalid type: must be one of ${ta.join("|")}`,400);try{a.write({type:u,name:i,description:c,body:d})}catch(m){return L(n,m.message,400)}let f=a.read(i);return f===null?L(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 L(n,"project not found",404);let i=Tt(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return L(n,a.message,400)}return o?n.json({removed:!0}):L(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?L(n,"project not found",404):n.json(C$(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"name"),a=me(i,"body"),l=me(i,"type");if(o===null||o.length===0)return L(n,"missing or empty name",400);if(a===null)return L(n,"missing body",400);if(l===null||!ra.has(l))return L(n,`invalid type: must be one of ${[...ra].join("|")}`,400);try{ut(o)}catch(f){return L(n,f.message,400)}let d=Js(s.local_path),c=Ks(d,`${o}.md`);if(na(c))return L(n,`chapter already exists: ${o}`,409);N$(d,{recursive:!0}),Cy(c,o,l,me(i,"description"),a);let u=Gs(d,o);return u===null?L(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);try{ut(n.req.param("chapter"))}catch(o){return L(n,o.message,400)}let i=Gs(Js(s.local_path),n.req.param("chapter"));return i===null?L(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return L(n,"project not found",404);let i=n.req.param("chapter");try{ut(i)}catch(m){return L(n,m.message,400)}let o=Js(s.local_path),a=Gs(o,i);if(a===null)return L(n,"chapter not found",404);let l=await vt(n);if(typeof l=="string")return L(n,l,400);let d=me(l,"body")??a.body,c=Object.prototype.hasOwnProperty.call(l,"description")?me(l,"description"):a.description,u=me(l,"type")??a.type;if(!ra.has(u))return L(n,`invalid type: must be one of ${[...ra].join("|")}`,400);Cy(Ks(o,`${i}.md`),i,u,c,d);let f=Gs(o,i);return f===null?L(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 L(n,"project not found",404);let i=n.req.param("chapter");try{ut(i)}catch(a){return L(n,a.message,400)}let o=Ks(Js(s.local_path),`${i}.md`);return na(o)?(R$(o),n.json({removed:!0})):L(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>L(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 vt(n);return typeof s=="string"?L(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Oy))),t.post("/api/chat/sessions",async n=>{let s=await O$(n);if(typeof s=="string")return L(n,s,400);let i=s!==null?me(s,"title"):null,o=r.createChatbotSession(Oy,i);return n.json(o,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?L(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 L(n,"chat session not found",404);let i=await vt(n);if(typeof i=="string")return L(n,i,400);let o=me(i,"role"),a=me(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(n,"role must be one of user|assistant|tool",400);if(a===null)return L(n,"missing content",400);let l=r.appendChatbotMessage(s,o,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 L(n,"invalid run id",400);if(r.getRun(s)===null)return L(n,"run not found",404);let o=Zr(r,s),a=[];for(let d of o){let c=M$(d),u=null;if(d.content!==null&&d.content!==void 0)u=new TextEncoder().encode(d.content);else if(d.path!==null&&d.path!==void 0)try{let f=$y(d.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:c,data:u})}let l=Ry(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 L(t,e,r){return t.json({error:e},r)}async function vt(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 O$(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 me(t,e){let r=t[e];return typeof r!="string"?null:r}function Js(t){return Ks(t,"ai-test")}function Gs(t,e){let r=Ks(t,`${e}.md`);if(!na(r))return null;let n=$y(r,"utf8"),s=$$(n),i=x$(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function C$(t){let e=Js(t);return na(e)?A$(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Gs(e,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Cy(t,e,r,n,s){let i=n!==null&&n.length>0?`
|
|
2072
2072
|
description: ${n}`:"",o=`---
|
|
2073
2073
|
name: ${e}${i}
|
|
2074
2074
|
type: ${r}
|
|
2075
2075
|
---
|
|
2076
|
-
${s}`;L$(t,o,"utf8")}function $$(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),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function M$(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?D$(t.path):j$(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function D$(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function j$(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ta,ra,Oy,Dy=T(()=>{"use strict";sr();Ly();lu();ta=["user","feedback","project","reference"],ra=new Set(["smoke","integration","vision","scenario","regression"]),Oy="operator"});function
|
|
2076
|
+
${s}`;L$(t,o,"utf8")}function $$(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),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function M$(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?D$(t.path):j$(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function D$(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function j$(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var ta,ra,Oy,Dy=T(()=>{"use strict";sr();Ly();lu();ta=["user","feedback","project","reference"],ra=new Set(["smoke","integration","vision","scenario","regression"]),Oy="operator"});function Pe(t,e){return`<!doctype html>
|
|
2077
2077
|
<html lang="en">
|
|
2078
2078
|
<head>
|
|
2079
2079
|
<meta charset="utf-8">
|
|
@@ -2134,8 +2134,8 @@ ${s}`;L$(t,o,"utf8")}function $$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2134
2134
|
</nav>
|
|
2135
2135
|
<main>${e}</main>
|
|
2136
2136
|
</body>
|
|
2137
|
-
</html>`}function b(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ye(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(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function _e(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var du=T(()=>{"use strict"});import{createHash as P$}from"node:crypto";import{existsSync as Vs,mkdirSync as Py,readFileSync as Ys,readdirSync as F$,renameSync as U$,statSync as W$,unlinkSync as q$,writeFileSync as sa}from"node:fs";import{homedir as B$}from"node:os";import{dirname as cu,isAbsolute as jy,join as bt,relative as H$,resolve as
|
|
2138
|
-
`,"utf8"),U$(n,r)}function K$(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function V$(t,e,r,n,s){let i=`${e}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=bt(t,a);try{return sa(l,n,{flag:"wx"}),a}catch(d){if(K$(d)!=="EEXIST")throw d;if(ia(Ys(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function Y$(t,e){if(jy(e)||cu(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=
|
|
2137
|
+
</html>`}function b(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ye(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(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function _e(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var du=T(()=>{"use strict"});import{createHash as P$}from"node:crypto";import{existsSync as Vs,mkdirSync as Py,readFileSync as Ys,readdirSync as F$,renameSync as U$,statSync as W$,unlinkSync as q$,writeFileSync as sa}from"node:fs";import{homedir as B$}from"node:os";import{dirname as cu,isAbsolute as jy,join as bt,relative as H$,resolve as Un}from"node:path";import{fileURLToPath as X$}from"node:url";function Uy(t){let e=Un(t);for(;;){let r=bt(e,uu);try{if(W$(r).isDirectory())return r}catch{}let n=cu(e);if(n===e)return null;e=n}}function fu(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return Un(e);let r=Uy(t);return r!==null?r:bt(Fy(),uu)}function Wy(){return Un(cu(X$(import.meta.url)),"..","..","workflows")}function J$(t){let e=bt(t,qy);try{let r=JSON.parse(Ys(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 G$(t,e){Py(t,{recursive:!0});let r=bt(t,qy),n=`${r}.tmp-${process.pid}`;sa(n,`${JSON.stringify(e,null,2)}
|
|
2138
|
+
`,"utf8"),U$(n,r)}function K$(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function V$(t,e,r,n,s){let i=`${e}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=bt(t,a);try{return sa(l,n,{flag:"wx"}),a}catch(d){if(K$(d)!=="EEXIST")throw d;if(ia(Ys(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function Y$(t,e){if(jy(e)||cu(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=Un(t,"templates","workflows"),s=Un(t,"templates",e),i=H$(n,s);return i.length===0||i.startsWith("..")||jy(i)||i.includes("/")||i.includes("\\")?null:s}function z$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let i=Y$(t,n);if(i===null){delete e.files[n];continue}if(!Vs(i)){delete e.files[n];continue}try{if(ia(Ys(i))!==s)continue;q$(i),delete e.files[n]}catch{}}}function By(t={}){let e=fu(t.cwd),r=bt(e,"templates","workflows"),n=Wy(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=Vs(n)?F$(n).filter(d=>d.endsWith(".compound.json")||d.endsWith(".lmctl")||d==="index.jsonl"):[];if(i.length===0)return s;Py(r,{recursive:!0});let o=J$(e),a=xt(),l=new Set(i.map(d=>`workflows/${d}`));for(let d of i){let c=`workflows/${d}`,u=Ys(bt(n,d)),f=ia(u),m=bt(r,d);if(!Vs(m)){try{sa(m,u,{flag:"wx"}),s.copied.push(d)}catch{}o.files[c]=f;continue}let p=ia(Ys(m));if(p===f){o.files[c]=f;continue}let h=o.files[c];if(h!==void 0&&p===h)sa(m,u),o.files[c]=f,s.refreshed.push(d);else{let _=V$(r,d,a,u,f);s.preserved.push(d),s.shadowed.push(_)}}z$(e,o,l),G$(e,{version:a,files:o.files})}catch(i){if(t.swallow!==!0)throw i}return s}function mu(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(Un(r));let n=Uy(t??process.cwd());return n!==null&&e.push(n),e.push(bt(Fy(),uu)),e}function oa(t,e){let r=mu(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let i of n){let o=bt(s,"templates","workflows",i);if(Vs(o))return o}for(let s of n){let i=bt(Wy(),s);if(Vs(i))return i}return null}var uu,Fy,ia,qy,pu=T(()=>{"use strict";_s();uu=".lmctl",Fy=()=>process.env.HOME??B$(),ia=t=>P$("sha256").update(t).digest("hex");qy=".dist-manifest.json"});function Hy(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
|
|
2139
2139
|
JOIN step s ON s.id = sa.step_id
|
|
2140
2140
|
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 i=s[0].id,o=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
|
|
2141
2141
|
JOIN step s ON s.id = sa.step_id
|
|
@@ -2144,37 +2144,37 @@ ${s}`;L$(t,o,"utf8")}function $$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2144
2144
|
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],J=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",F=e.getWorkflow(n.workflow_id),$=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,R={run_id:t,workflow_name:F?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:$,steps:d,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:w,token_totals:J};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(R)})}var Xy=T(()=>{"use strict"});import{spawnSync as Gy}from"node:child_process";function _u(t){return Z$[t]??`no install hint; ensure '${t}' is on PATH`}function Q$(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 Jy(t){return Gy("which",[t],{encoding:"utf8"}).status===0}function Ky(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Jy(e)){let r=_u(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Jy(e)){let s=_u(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=Q$(e);if(r===null)continue;let n=Gy(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:_u(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Z$,Vy=T(()=>{"use strict";Z$={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",kimi:"install: https://github.com/MoonshotAI/kimi-code"}});import{existsSync as eM,readdirSync as tM,readFileSync as rM}from"node:fs";import{join as Yy}from"node:path";function nM(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(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
|
|
2145
2145
|
`).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function zy(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 Zy(t,e){if(e.length===0)return null;let r=Yy(t,"durable-memory");if(!eM(r))return null;let n;try{n=tM(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=rM(Yy(r,i),"utf8");if(nM(o).some(l=>e.includes(l))){let l=zy(o,"name")??i.replace(".md",""),d=zy(o,"description");s.push(d?`${l} (${d})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var Qy=T(()=>{"use strict"});function yu(t){let e=t.trim().replace(sM,"").trim();for(let r=0;r<4;r+=1){let n=iM.exec(e);if(n===null)break;e=n[2].trim()}return e}function eE(t){let e=t.trim(),r=oM.exec(e);if(r!==null)return r[2];let n=aM.exec(e);return n!==null?n[0]:null}function zs(t,e){let r=t.split(`
|
|
2146
2146
|
`),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=yu(r[o]),l=hu.exec(a);if(l===null)continue;let d=l[1].trim();if(gu.test(d))continue;let c=eE(d);c!==null&&(n=c,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=yu(r[o]),l=hu.exec(a);if(l===null)break;let d=gu.exec(l[1].trim());if(d===null)break;i[d[1]]=d[2].trim()}return{outcome:n,evidence:i}}function tE(t){let e=t.split(`
|
|
2147
|
-
`),r=null;for(let n=0;n<e.length;n+=1){let s=yu(e[n]),i=hu.exec(s);if(i===null)continue;let o=i[1].trim();if(gu.test(o))continue;let a=eE(o);if(a===null||!
|
|
2148
|
-
\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 fE(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 i=
|
|
2147
|
+
`),r=null;for(let n=0;n<e.length;n+=1){let s=yu(e[n]),i=hu.exec(s);if(i===null)continue;let o=i[1].trim();if(gu.test(o))continue;let a=eE(o);if(a===null||!vn(a))continue;let d=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:d}}return r}var sM,iM,hu,gu,oM,aM,Eu=T(()=>{"use strict";ks();sM=/^#{1,6}\s+/,iM=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,gu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,oM=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,aM=/^[A-Za-z0-9_-]+/});function rE(t,e,r){return n=>{let s=r(),i=Date.now(),o=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(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),d=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let c=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:c.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:null})}}var nE=T(()=>{"use strict"});import{readFileSync as lM}from"node:fs";import{dirname as dM,join as cM}from"node:path";import{fileURLToPath as uM}from"node:url";function pM(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function yM(t){let e=[],r=[];for(let n of t)fM.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function EM(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&mM.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,d)=>s[d]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function wM(t,e){if(t.length===0)return{matched:!1};let r=yM(t);for(let n of r){let s=EM(n,e);if(s.matched)return s}return{matched:!1}}function wu(t){return wM(t,gM)}function TM(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 Tu(t){return TM(t).split(" ").filter(e=>e.length>0)}var fM,mM,_M,hM,gM,sE=T(()=>{"use strict";fM=new Set(["&&","||",";","|",">",">>","<","<<"]),mM=/^[A-Za-z_][A-Za-z0-9_]*=/;_M=dM(uM(import.meta.url)),hM=JSON.parse(lM(cM(_M,"side_effect_classifier.json"),"utf-8")),gM=pM(hM)});function aa(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 iE(t,e){try{return await en(vu(t)??t,aa(e))===!0}catch{return!1}}async function la(t,e){try{return await en(vu(t)??t,aa(e))}catch{return}}async function oE(t,e){if(typeof t!="string")return t;let r=vu(t);if(r===null)return t;try{return await en(r,aa(e))}catch{return}}async function aE(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let i of r){let o=i.index??0;n+=t.slice(s,o);let a=i[1]?.trim()??"";try{n+=vM(await en(a,aa(e)))}catch{n+=""}s=o+i[0].length}return n+=t.slice(s),n}function vu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function vM(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Zs=T(()=>{"use strict";Bs()});import{existsSync as lE,readdirSync as dE,readFileSync as bM,statSync as cE}from"node:fs";import{join as ca}from"node:path";function uE(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function G(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 ft(t,e,r,n,s={}){let i=D(),o=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Qs}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=vn(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Hi,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:o.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:SM(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function SM(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
2148
|
+
\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 fE(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 i=Or(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function st(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=Or(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=Or(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=kM(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return aE(n,e)}function kM(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 Or(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 ei(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=rE(e.dal,e.run_id,()=>i),d=bu(e,r),c={violation:null},u=y=>{if(l(y),c.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let E=Tu(y.summary),w=wu(E);w.matched&&!d&&(c.violation={summary:y.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{u(y),IM(y,(E,w)=>{m+=E,p+=w})},_=await wo({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Qe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:_.ms})}),NM(e.project,e.dal,f);let g=c.violation;return g!==null?{kind:"g3_violation",summary:g.summary,violationKind:g.kind}:!a&&e.project.local_path.trim().length>0&&Su(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:_.text,ms:_.ms,argv:_.argv}}function IM(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=da(s.input_tokens),a=da(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=da(i.input_tokens),a=da(i.output_tokens);(o>0||a>0)&&e(o,a)}}function da(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function ar(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ei({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let d=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,d?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Wn(t,e,r,n,s,i,o,a=!1,l){let d=t.membersByAlias.get(r.alias);if(d===void 0||d.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let c=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];d.prompt_snapshot!==null&&d.prompt_snapshot.length>0&&u.push(d.prompt_snapshot),i&&u.push(c_(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await st(r.prompt_template,t,e):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
|
|
2149
2149
|
|
|
2150
|
-
`);try{let p=await ei({context:t,stateId:e,member:d,prompt:m,stepId:c.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let _=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:c.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(c.id,null,_),{outcome:null,text:"",status_detail:_}}if(t.dal.insertStepArtifact({step_id:c.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(c.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=zs(p.text,s);return t.dal.finishStep(c.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 Re?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(c.id,null,h),{outcome:null,text:"",status_detail:h}}}function
|
|
2150
|
+
`);try{let p=await ei({context:t,stateId:e,member:d,prompt:m,stepId:c.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let _=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:c.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(c.id,null,_),{outcome:null,text:"",status_detail:_}}if(t.dal.insertStepArtifact({step_id:c.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(c.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=zs(p.text,s);return t.dal.finishStep(c.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 Re?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(c.id,null,h),{outcome:null,text:"",status_detail:h}}}function qn(t,e){return(e?.length??0)>0?Zy(t.project.local_path,e):null}function mE(t){return wu(Tu(t))}function bu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
2151
2151
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
2152
2152
|
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 Su(t,e){if(!lE(t))return!1;let r=ca(t,"durable-memory");function n(s){let i;try{i=dE(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=ca(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(cE(a).mtime>e)return!0}catch{}}return!1}return n(t)}function NM(t,e,r){let n=ca(t.local_path,"durable-memory");if(!lE(n))return;let s;try{s=dE(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=ca(n,i),a;try{a=cE(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=bM(o,"utf8")}catch{continue}let d=xM(l);if(d===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
|
|
2153
|
-
`),M({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:d.type,name:d.name,description:d.description,body:d.body})}catch{}}}function xM(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!AM.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Qs,AM,tt=T(()=>{"use strict";dt();
|
|
2153
|
+
`),M({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:d.type,name:d.name,description:d.description,body:d.body})}catch{}}}function xM(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!AM.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Qs,AM,tt=T(()=>{"use strict";dt();Dn();To();Qy();Eu();ks();nE();pe();sE();Zs();Qs="__paused__:";AM=new Set(["user","feedback","project","reference"])});import{spawnSync as pE}from"node:child_process";function RM(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=pE("git",["diff","--quiet"],{cwd:i}).status!==0,a=pE("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),K(t,r,n,Wc),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),K(t,r,n,"clean"),G(t.workflow,e.next)}var _E,hE=T(()=>{"use strict";tt();_E={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=>RM(t,t.state)}});async function LM(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await iE(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),K(t,r,n,"matched"),G(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),K(t,r,n,"no_match"),e.default_next!==void 0?G(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var gE,yE=T(()=>{"use strict";tt();Zs();gE={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=>LM(t,t.state)}});async function OM(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=qn(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,_=await Wn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);_.text.length>0&&(a[p]=_.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
|
|
2154
2154
|
${m}`:null).filter(m=>m!==null).join(`
|
|
2155
2155
|
|
|
2156
|
-
`),d=`${n}:consolidator`,c=await
|
|
2156
|
+
`),d=`${n}:consolidator`,c=await Wn(t,d,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,c.outcome===null||c.outcome==="error"){t.dal.finishStep(u.id,c.outcome,c.status_detail),c.outcome==="error"&&K(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?G(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:c.text}),t.dal.finishStep(u.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 ar(t,n,m,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.ok)}var EE,wE=T(()=>{"use strict";tt();EE={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=>OM(t,t.state)}});async function CM(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await la(e.items_from,t),a=jM(o);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?G(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},d=e.mode==="parallel"?await MM(t,e,s.id,a,l):await $M(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 c=d.some(f=>f.outcome===null||f.outcome==="__failure__"),u=c?"any_failed":"all_ok";if(t.dal.finishStep(s.id,u,JSON.stringify({iterations:d,count:a.length})),K(t,r,n,u),c){let f=e.outcomes.any_failed;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}return G(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function $M(t,e,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await vE(t,e,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function MM(t,e,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await vE(t,e,r,n[l],l,s)}});return await Promise.all(a),i}async function vE(t,e,r,n,s,i){let o=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=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let c=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":DM(t.outcomes[a]);return t.emit_progress?.({kind:c===null||c==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:c}}),{index:s,value:n,outcome:c}}function DM(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function jM(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 TE,bE=T(()=>{"use strict";tt();Zs();TE={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=>CM(t,t.state)}});async function PM(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:Z(t.workflow)}}let o=qn(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 ar(t,n,i,e.write_back_durable_memory),G(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?G(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ei({context:t,stateId:n,member:i,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 ar(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(SE({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Re?`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=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),c=await st(e.agent.initial_prompt_template,t,n),u=o?`${o}
|
|
2157
2157
|
|
|
2158
|
-
${c}`:c;try{let f=await ei({context:t,stateId:n,member:i,prompt:u,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(d.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 ar(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(SE({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Re?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function SE(t){let{context:e,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=t,a=D();e.dal.setRunPausedState(e.run_id,`${Qs}${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(FM({context:e,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function FM(t){let{context:e,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=UM(e,r),d={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:i,expected_response:d,transcript_tail:WM(i,3),paused_at:o,created_run_inputs:
|
|
2158
|
+
${c}`:c;try{let f=await ei({context:t,stateId:n,member:i,prompt:u,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(d.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 ar(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(SE({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Re?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function SE(t){let{context:e,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=t,a=D();e.dal.setRunPausedState(e.run_id,`${Qs}${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(FM({context:e,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function FM(t){let{context:e,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=UM(e,r),d={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:i,expected_response:d,transcript_tail:WM(i,3),paused_at:o,created_run_inputs:Or(e.job.payload)}}function UM(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=t.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(e),r}function WM(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 kE,IE=T(()=>{"use strict";To();tt();kE={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=>PM(t,t.state)}});async function qM(t,e){let r=t.stateId,n=t.displayName,s=fE(t,e.over);if(s===null){let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let u=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:Z(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=t.iteration;t.iteration={item:f,index:u};let h;try{h=await t.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let _=BM(t.outcomes[m]);if(a.push({index:u,value:f,outcome:_}),_===null&&e.stop_on_error){l=!0;break}}let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=l?"error":"ok";if(t.dal.finishStep(d.id,c,JSON.stringify({iterations:a,count:o.length})),K(t,r,n,c),l){let u=e.outcomes.error;return u!==void 0?G(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}return G(t.workflow,e.outcomes.ok)}function BM(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var NE,AE=T(()=>{"use strict";tt();NE={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>qM(t,t.state)}});import{createHash as HM}from"node:crypto";import{existsSync as XM,mkdirSync as JM,readFileSync as GM,writeFileSync as KM}from"node:fs";import{dirname as VM,isAbsolute as RE,normalize as YM,resolve as ti}from"node:path";import{Document as zM,ExternalHyperlink as ZM,HeadingLevel as Bn,LevelFormat as QM,Packer as eD,Paragraph as St,Table as tD,TableCell as rD,TableRow as nD,TextRun as kt,WidthType as sD}from"docx";import{marked as iD}from"marked";async function oD(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await aD(t,e,n),o=await lD(t,e),a=await dD(t,e.title),l=await pD(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return JM(VM(o),{recursive:!0}),KM(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:HM("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),K(t,r,n,{output_path:o,path:o,bytes:l.length}),G(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),K(t,r,n,{error:o}),G(t.workflow,e.outcomes?.error??"@terminal:error")}}async function aD(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 st(e.markdown_source,t,r)).trim(),i=(n.length===0?mD(t,e.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=uD(t.project.local_path,i);if(o!==null){if(!XM(o))throw new Error(`markdown_source file not found: ${o}`);return ua(GM(o,"utf8"))}return ua(i)}async function lD(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await st(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=cD(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function dD(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await st(e,t,t.stateId)).trim();return r.length===0?null:r}function cD(t,e){let r=ti(t);return YM(RE(e)?ti(e):ti(r,e))}function uD(t,e){return fD(e)?RE(e)?ti(e):ti(t,e):null}function fD(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function mD(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(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return ua(s);let i=t.dal.query(`SELECT sa.content
|
|
2159
2159
|
FROM step_artifact sa
|
|
2160
2160
|
JOIN step s ON s.id = sa.step_id
|
|
2161
2161
|
WHERE s.run_id = ?
|
|
2162
2162
|
AND s.state_name LIKE ?
|
|
2163
2163
|
AND sa.content IS NOT NULL
|
|
2164
2164
|
ORDER BY sa.id DESC
|
|
2165
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:ua(i[0].content)}function ua(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function pD(t,e){let r=OE(iD.lexer(t,{gfm:!0})),n=new zM({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:QM.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new St("")]:r}]});return eD.toBuffer(n)}function OE(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new St({heading:TD(r.depth),children
|
|
2166
|
-
`).map(r=>new St({children:[new kt({text:r.length===0?" ":r,font:"Courier New"})]}))}function
|
|
2167
|
-
${a}`:null,d,l,s,e.writes_to_project_path===!0,i);if(l){let _=tE(p.text);if(_!==null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),E=zs(p.text,y);if(E.outcome===null){let S=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let w=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(w.id,E.outcome,"outcomes_from_stance"),K(t,r,n,E.outcome),G(t.workflow,e.outcomes_from_stance[E.outcome])}let _=zs(p.text,ej);if(_.outcome!==null){let y=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,_.outcome,"default_failure_stance"),K(t,r,n,_.outcome),{kind:"escalate",token:_.outcome,reason:`failure_stance:${_.outcome}`}}let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await ar(t,n,y,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(_=>
|
|
2165
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:ua(i[0].content)}function ua(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function pD(t,e){let r=OE(iD.lexer(t,{gfm:!0})),n=new zM({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:QM.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new St("")]:r}]});return eD.toBuffer(n)}function OE(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new St({heading:TD(r.depth),children:$r(Cr(r))}));break;case"paragraph":e.push(new St({children:$r(Cr(r))}));break;case"text":e.push(new St({children:Cr(r).length===0?[new kt(r.text)]:$r(Cr(r))}));break;case"blockquote":e.push(...OE(Cr(r)).map(n=>n instanceof St?n:new St({children:[new kt(r.text)]})));break;case"list":yD(r)&&e.push(..._D(r));break;case"table":ED(r)&&e.push(hD(r));break;case"code":wD(r)&&e.push(...gD(r));break;case"hr":e.push(new St(""));break;case"html":r.text.trim().length>0&&e.push(new St({children:[new kt(r.text)]}));break;default:break}return e}function $r(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new kt({text:n.text,...ku(e)}));break;case"strong":r.push(...$r(Cr(n),{...e,bold:!0}));break;case"em":r.push(...$r(Cr(n),{...e,italics:!0}));break;case"codespan":r.push(new kt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new ZM({link:n.href,children:$r(Cr(n),{...e})}));break;case"br":r.push(new kt({text:"",break:1}));break;case"image":r.push(new kt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new kt({text:n.text,strike:!0}));break;default:r.push(new kt({text:n.raw,...ku(e)}));break}return r.length===0?[new kt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function _D(t){return t.items.map(e=>new St({children:$r(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:xE(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:xE(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function xE(t){return t.task?`[${t.checked?"x":" "}] `:""}function hD(t){let e=[t.header,...t.rows].map(r=>new nD({children:r.map(n=>new rD({children:[new St({children:$r(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new tD({width:{size:100,type:sD.PERCENTAGE},rows:e})}function gD(t){return t.text.split(`
|
|
2166
|
+
`).map(r=>new St({children:[new kt({text:r.length===0?" ":r,font:"Courier New"})]}))}function Cr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function yD(t){return t.type==="list"&&Array.isArray(t.items)}function ED(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function wD(t){return t.type==="code"&&typeof t.text=="string"}function TD(t){switch(t){case 1:return Bn.HEADING_1;case 2:return Bn.HEADING_2;case 3:return Bn.HEADING_3;case 4:return Bn.HEADING_4;case 5:return Bn.HEADING_5;default:return Bn.HEADING_6}}var LE,CE=T(()=>{"use strict";tt();LE={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=>oD(t,t.state)}});import{createHash as vD}from"node:crypto";import{existsSync as bD,mkdirSync as SD,readFileSync as $E,statSync as kD}from"node:fs";import{dirname as ID,isAbsolute as ME,normalize as ND,resolve as ri}from"node:path";import{marked as AD}from"marked";import xD from"write-excel-file/node";async function RD(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await LD(t,e),o=OD(e.input_format),a=await CD(t,e),l=await $D(t,e.title),d=o==="markdown"?BD(i):PD(i);await HD({sheets:d.length===0?[{name:"Sheet1",headers:[],rows:[]}]:d,outputPath:a,title:l??t.workflow.name});let c=kD(a).size;if(c===0)throw new Error("rendered XLSX file was empty");let u=vD("sha256").update($E(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:c}),G(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),K(t,r,n,{error:o}),G(t.workflow,e.outcomes?.error??"@terminal:error")}}async function LD(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await st(e.source,t,t.stateId)).trim(),n=DD(t.project.local_path,r);if(n!==null){if(!bD(n))throw new Error(`source file not found: ${n}`);return $E(n,"utf8")}return r}function OD(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function CD(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await st(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=MD(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function $D(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await st(e,t,t.stateId)).trim();return r.length===0?null:r}function MD(t,e){let r=ri(t);return ND(ME(e)?ri(e):ri(r,e))}function DD(t,e){return jD(e)?ME(e)?ri(e):ri(t,e):null}function jD(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function PD(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(!fa(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>FD(r,n))}function FD(t,e){if(!fa(t))throw new Error(`sheets[${e}] must be an object`);let r=UD(t.headers,`sheets[${e}].headers`),n=WD(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:qD(t.styles)}}function UD(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 WD(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,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${i}] must be string, number, boolean, or null`)})})}function qD(t){if(!fa(t)||!fa(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 BD(t){let e=AD.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(zD(s)){n=s.text;continue}ZD(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function HD(t){SD(ID(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:KD(n.name,e),data:XD(n),columns:GD(n)}));await xD(r).toFile(t.outputPath)}function XD(t){let e=[];if(t.headers.length>0){let r=YD(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(JD));return e.length===0?[[{}]]:e}function JD(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 GD(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(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function KD(t,e){let r=VD(t),n=r,s=2;for(;e.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return e.add(n.toLowerCase()),n}function VD(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function YD(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 zD(t){return t.type==="heading"&&typeof t.text=="string"}function ZD(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function fa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var DE,jE=T(()=>{"use strict";tt();DE={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=>RD(t,t.state)}});import{spawnSync as QD}from"node:child_process";async function tj(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(QD("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?G(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let i=qn(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,d=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await Wn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
2167
|
+
${a}`:null,d,l,s,e.writes_to_project_path===!0,i);if(l){let _=tE(p.text);if(_!==null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),E=zs(p.text,y);if(E.outcome===null){let S=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let w=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(w.id,E.outcome,"outcomes_from_stance"),K(t,r,n,E.outcome),G(t.workflow,e.outcomes_from_stance[E.outcome])}let _=zs(p.text,ej);if(_.outcome!==null){let y=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,_.outcome,"default_failure_stance"),K(t,r,n,_.outcome),{kind:"escalate",token:_.outcome,reason:`failure_stance:${_.outcome}`}}let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await ar(t,n,y,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(_=>Wn(t,`${n}:reviewer_${_.alias}[${f}]`,_,`CODER OUTPUT:
|
|
2168
2168
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(_=>_.outcome==="approve")){let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve",`loop=${f}`),K(t,r,n,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await ar(t,n,g,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}if(a=h.filter(_=>_.outcome==="request_changes").map(_=>_.text).join(`
|
|
2169
2169
|
|
|
2170
|
-
`),e.loop_feedback_artifact!==void 0){let _=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(c.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?G(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}var ej,PE,FE=T(()=>{"use strict";Eu();tt();ej=["blocked","failed","aborted"],PE={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=>tj(t,t.state)}});import{spawnSync as rj}from"node:child_process";async function nj(t,e){let r=t.stateId,n=t.displayName,s=await st(e.command,t,n),i=bu(t,n),o=mE(s);if(o.matched&&!i){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,d=rj("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof d.stderr=="string"?d.stderr:"",f=d.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:d.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),d.status===null)return l?(t.dal.finishStep(c.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(c.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&&Su(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.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(c.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=d.stdout??"";t.dal.insertStepArtifact({step_id:c.id,kind:e.capture_output_to,content:h})}let m=String(d.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:c.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(c.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(c.id,m,`exit=${d.status}`),K(t,r,n,m),G(t.workflow,p))}var UE,WE=T(()=>{"use strict";tt();UE={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=>nj(t,t.state)}});async function sj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let o=wt(i.definition),a=await ij(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let d=l.terminal_state;if(d===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};K(t,r,n,oj(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,d,`child_run=${l.run_id}`);let c=e.outcomes[d]??e.outcomes.default;return c===void 0?{kind:"terminal",terminal:Z(t.workflow)}:G(t.workflow,c)}async function ij(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await oE(s,t);r[n]=i===s?await la(s,t):i}return r}function oj(t,e,r){let n={};for(let s of r)n[s.name]=aj(t,e,s);return n}function aj(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 i=lj(s,r.source_field);if(i.found)return i.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 lj(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 qE,BE=T(()=>{"use strict";Xs();tt();Zs();qE={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=>sj(t,t.state)}});function dj(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var HE,XE=T(()=>{"use strict";tt();HE={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=>dj(t,t.state)}});async function cj(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 i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=uj(t.cursor),a=i.filter(fj).filter(d=>d.id>o);if(a.length===0)return null;let l=Math.max(...a.map(d=>d.id));return{main:a.map(d=>({trigger_id:t.trigger_id,issue_id:d.id,issue_number:d.number,issue_url:d.html_url,title:d.title,cursor:String(l)}))}}function uj(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function fj(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 JE,GE=T(()=>{"use strict";JE={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=>cj(t)}});async function mj(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 KE,VE=T(()=>{"use strict";KE={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=>mj(t)}});function YE(t){t.register(_E),t.register(PE),t.register(EE),t.register(kE),t.register(NE),t.register(LE),t.register(DE),t.register(UE),t.register(gE),t.register(TE),t.register(qE),t.register(HE),t.register(KE),t.register(JE)}var zE=T(()=>{"use strict";hE();yE();wE();bE();IE();AE();CE();jE();FE();WE();BE();XE();GE();VE()});function ZE(){return ma===null&&(ma=new Iu,YE(ma)),ma}var pj,Iu,ma,QE=T(()=>{"use strict";zE();pj={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"},Iu=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:pj[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ma=null});async function rw(t){aw(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=hj(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ni(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=Ky(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.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:o.id,terminal_state:"aborted",steps_executed:0};let d=new Map(t.members.map(m=>[m.alias,m]));if(ni(n)){let m=Nu({dal:t.dal,workflow:_a(n),job:t.job,project:r,run:o,membersByAlias:d,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Lr(t.job.payload)??{},team_id:t.team.id}),p=await sw(n,m,o.current_state??n.entry_step_id);return tw(t.dal,r.id,o.id,n.name,p),p}let c=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Nu({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:d,outcomes:c,inputs:Lr(t.job.payload)??{},team_id:t.team.id}),f=await nw(u,o.current_state??n.start_at);return tw(t.dal,r.id,o.id,n.name,f),f}function tw(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let c=t.getRun(r);if(c!==null){let u=t.getWorkflow(c.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let g=_.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="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 d=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:d,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function Nu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Au(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{aw(n);let i=ni(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=Nu({dal:t.dal,workflow:ni(n)?_a(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ni(n)?sw(n,a,o.current_state??n.entry_step_id):nw(a,o.current_state??n.start_at)}};return e}async function nw(t,e){let r=e;if(r.startsWith(Qs))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 lr(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=pa(t,Z(t.workflow));if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ge(t);if(l.kind==="terminal")return lr(t,l.terminal);r=l.state;continue}let o,a=ow(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===Ss)return lr(t,sd);let d=i.outcomes?.[a];o=d!==void 0?G(t.workflow,d):ft(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await Au(t,r,i);if(o.kind==="paused")return Ge(t);if(o.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},o.token,o.reason),Ge(t);if(o.kind==="terminal"){let l=pa(t,o.terminal);if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},l.token,l.reason),Ge(t);if(l.kind==="terminal")return lr(t,l.terminal);r=l.state;continue}r=o.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=pa(t,Z(t.workflow));return n.kind==="terminal"?lr(t,n.terminal):lr(t,Z(t.workflow))}async function sw(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return ft(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ge(e);let l=ow(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===Ss)return lr(e,sd);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 ft(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}),Ge(e);i=h;continue}let d=await _j(e,t,a);if(d.kind==="paused")return Ge(e);let c=Object.keys(t.connections[a.id]??{});if(d.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},d.token,d.reason,{declared_outcomes:c}),Ge(e);let u=d.kind==="terminal"?d.terminal:d.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=_a(t,a);try{let p=pa(e,u);if(p.kind==="paused")return Ge(e);if(p.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ge(e);if(p.kind==="terminal")return lr(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ge(e);i=h.id;continue}finally{e.workflow=m}}if(Tn(u))return ft(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);let f=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);i=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})}),lr(e,"aborted")}async function _j(t,e,r){let n=iw(e,r),s=t.workflow;t.workflow=_a(e,r);try{return await Au(t,r.id,n,r.name)}finally{t.workflow=s}}function iw(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={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{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,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{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function Au(t,e,r,n){let s=ZE().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 i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?Ej(t,s):void 0,t.progress_step_id=null;try{return await s.execute(uE(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function hj(t,e){try{let r=JSON.parse(t);if(yj(r)&&r.definition_schema_version===3)return Ut.parse(r)}catch{return e}return e}function ni(t){return t.definition_schema_version===3}function _a(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=iw(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:gj(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 gj(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function yj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ej(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 i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function lr(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Hy(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ge(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function ow(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 i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function pa(t,e){if(!wj(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&&Tj(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function wj(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function Tj(t,e,r){let n=vj(t),s=r.capture_evidence&&n!==null?bj(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 vj(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 bj(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 aw(t){if(!ew.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${ew.join(", ")}`)}var ew,lw=T(()=>{"use strict";Dn();Xy();Vy();tt();QE();ks();ew=[1,2,3]});import{readFileSync as Sj,readdirSync as kj}from"node:fs";import{basename as Ij,join as Nj,resolve as Aj}from"node:path";function uw(t={}){let e=Aj(t.workflowsDir??"workflows"),r=kj(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=>xj(Nj(e,n)))}}function xj(t){let e=Ij(t);try{let r=Sj(t,"utf8"),n=wt(r);return pw(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:_w(r)}}}function fw(t,e){try{let r=wt(e);return pw(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:_w(r)}}}function mw(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 i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
2170
|
+
`),e.loop_feedback_artifact!==void 0){let _=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(c.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?G(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}var ej,PE,FE=T(()=>{"use strict";Eu();tt();ej=["blocked","failed","aborted"],PE={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=>tj(t,t.state)}});import{spawnSync as rj}from"node:child_process";async function nj(t,e){let r=t.stateId,n=t.displayName,s=await st(e.command,t,n),i=bu(t,n),o=mE(s);if(o.matched&&!i){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,d=rj("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof d.stderr=="string"?d.stderr:"",f=d.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:d.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),d.status===null)return l?(t.dal.finishStep(c.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(c.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&&Su(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.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(c.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=d.stdout??"";t.dal.insertStepArtifact({step_id:c.id,kind:e.capture_output_to,content:h})}let m=String(d.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:c.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(c.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(c.id,m,`exit=${d.status}`),K(t,r,n,m),G(t.workflow,p))}var UE,WE=T(()=>{"use strict";tt();UE={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=>nj(t,t.state)}});async function sj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let o=wt(i.definition),a=await ij(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let d=l.terminal_state;if(d===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};K(t,r,n,oj(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,d,`child_run=${l.run_id}`);let c=e.outcomes[d]??e.outcomes.default;return c===void 0?{kind:"terminal",terminal:Z(t.workflow)}:G(t.workflow,c)}async function ij(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await oE(s,t);r[n]=i===s?await la(s,t):i}return r}function oj(t,e,r){let n={};for(let s of r)n[s.name]=aj(t,e,s);return n}function aj(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 i=lj(s,r.source_field);if(i.found)return i.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 lj(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 qE,BE=T(()=>{"use strict";Xs();tt();Zs();qE={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=>sj(t,t.state)}});function dj(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var HE,XE=T(()=>{"use strict";tt();HE={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=>dj(t,t.state)}});async function cj(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 i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=uj(t.cursor),a=i.filter(fj).filter(d=>d.id>o);if(a.length===0)return null;let l=Math.max(...a.map(d=>d.id));return{main:a.map(d=>({trigger_id:t.trigger_id,issue_id:d.id,issue_number:d.number,issue_url:d.html_url,title:d.title,cursor:String(l)}))}}function uj(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function fj(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 JE,GE=T(()=>{"use strict";JE={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=>cj(t)}});async function mj(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 KE,VE=T(()=>{"use strict";KE={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=>mj(t)}});function YE(t){t.register(_E),t.register(PE),t.register(EE),t.register(kE),t.register(NE),t.register(LE),t.register(DE),t.register(UE),t.register(gE),t.register(TE),t.register(qE),t.register(HE),t.register(KE),t.register(JE)}var zE=T(()=>{"use strict";hE();yE();wE();bE();IE();AE();CE();jE();FE();WE();BE();XE();GE();VE()});function ZE(){return ma===null&&(ma=new Iu,YE(ma)),ma}var pj,Iu,ma,QE=T(()=>{"use strict";zE();pj={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"},Iu=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:pj[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ma=null});async function rw(t){aw(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=hj(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ni(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=Ky(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.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:o.id,terminal_state:"aborted",steps_executed:0};let d=new Map(t.members.map(m=>[m.alias,m]));if(ni(n)){let m=Nu({dal:t.dal,workflow:_a(n),job:t.job,project:r,run:o,membersByAlias:d,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Or(t.job.payload)??{},team_id:t.team.id}),p=await sw(n,m,o.current_state??n.entry_step_id);return tw(t.dal,r.id,o.id,n.name,p),p}let c=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Nu({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:d,outcomes:c,inputs:Or(t.job.payload)??{},team_id:t.team.id}),f=await nw(u,o.current_state??n.start_at);return tw(t.dal,r.id,o.id,n.name,f),f}function tw(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let c=t.getRun(r);if(c!==null){let u=t.getWorkflow(c.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let g=_.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="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 d=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:d,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function Nu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Au(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{aw(n);let i=ni(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=Nu({dal:t.dal,workflow:ni(n)?_a(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ni(n)?sw(n,a,o.current_state??n.entry_step_id):nw(a,o.current_state??n.start_at)}};return e}async function nw(t,e){let r=e;if(r.startsWith(Qs))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 lr(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=pa(t,Z(t.workflow));if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ge(t);if(l.kind==="terminal")return lr(t,l.terminal);r=l.state;continue}let o,a=ow(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===Ss)return lr(t,sd);let d=i.outcomes?.[a];o=d!==void 0?G(t.workflow,d):ft(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await Au(t,r,i);if(o.kind==="paused")return Ge(t);if(o.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},o.token,o.reason),Ge(t);if(o.kind==="terminal"){let l=pa(t,o.terminal);if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},l.token,l.reason),Ge(t);if(l.kind==="terminal")return lr(t,l.terminal);r=l.state;continue}r=o.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=pa(t,Z(t.workflow));return n.kind==="terminal"?lr(t,n.terminal):lr(t,Z(t.workflow))}async function sw(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return ft(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ge(e);let l=ow(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===Ss)return lr(e,sd);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 ft(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}),Ge(e);i=h;continue}let d=await _j(e,t,a);if(d.kind==="paused")return Ge(e);let c=Object.keys(t.connections[a.id]??{});if(d.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},d.token,d.reason,{declared_outcomes:c}),Ge(e);let u=d.kind==="terminal"?d.terminal:d.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=_a(t,a);try{let p=pa(e,u);if(p.kind==="paused")return Ge(e);if(p.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ge(e);if(p.kind==="terminal")return lr(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ge(e);i=h.id;continue}finally{e.workflow=m}}if(vn(u))return ft(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);let f=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);i=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})}),lr(e,"aborted")}async function _j(t,e,r){let n=iw(e,r),s=t.workflow;t.workflow=_a(e,r);try{return await Au(t,r.id,n,r.name)}finally{t.workflow=s}}function iw(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={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{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,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{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function Au(t,e,r,n){let s=ZE().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 i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?Ej(t,s):void 0,t.progress_step_id=null;try{return await s.execute(uE(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function hj(t,e){try{let r=JSON.parse(t);if(yj(r)&&r.definition_schema_version===3)return Ut.parse(r)}catch{return e}return e}function ni(t){return t.definition_schema_version===3}function _a(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=iw(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:gj(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 gj(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function yj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ej(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 i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function lr(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Hy(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ge(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function ow(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 i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function pa(t,e){if(!wj(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&&Tj(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function wj(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function Tj(t,e,r){let n=vj(t),s=r.capture_evidence&&n!==null?bj(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 vj(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 bj(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 aw(t){if(!ew.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${ew.join(", ")}`)}var ew,lw=T(()=>{"use strict";jn();Xy();Vy();tt();QE();ks();ew=[1,2,3]});import{readFileSync as Sj,readdirSync as kj}from"node:fs";import{basename as Ij,join as Nj,resolve as Aj}from"node:path";function uw(t={}){let e=Aj(t.workflowsDir??"workflows"),r=kj(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=>xj(Nj(e,n)))}}function xj(t){let e=Ij(t);try{let r=Sj(t,"utf8"),n=wt(r);return pw(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:_w(r)}}}function fw(t,e){try{let r=wt(e);return pw(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:_w(r)}}}function mw(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 i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
2171
2171
|
`)}
|
|
2172
2172
|
`}function pw(t,e){let r=Lj(e),n=Oj(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=Rj(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 Rj(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function Lj(t){return xu(t)?t.entry_step_id:t.start_at}function Oj(t){return xu(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function xu(t){return t.definition_schema_version===3}function _w(t){return t instanceof or?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 hw(t){let e=new Set;if(xu(t))for(let r of t.steps){let n=r.members??{};dw(n,e)}else for(let r of Object.values(t.states))dw(r,e);return[...e].sort()}function dw(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=cw(i);o!==null&&e.add(o)}for(let s of n){let i=t[s];if(Array.isArray(i))for(let o of i){let a=cw(o);a!==null&&e.add(a)}}}function cw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var ha=T(()=>{"use strict";Xs()});function Cj({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,ga)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=$j(t,r,o);if(a<20)continue;let d=o??"initial",c=`${si}:${r.id}:${d}`;t.enqueueJob({project_id:r.id,source:ga,source_ref:si,payload:JSON.stringify({kind:si,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:c})}}function $j(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
2173
2173
|
FROM run r
|
|
2174
2174
|
JOIN job j ON j.id = r.job_id
|
|
2175
2175
|
WHERE j.project_id = ?
|
|
2176
2176
|
AND r.terminal_state IS NOT NULL
|
|
2177
|
-
${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 gw(t){for(let e of Mj)try{e(t)}catch{}}var ga,si,Mj,Ru=T(()=>{"use strict";ga="memory_policy",si="memory_consolidation_request";Mj=[Cj]});var bw={};he(bw,{getOrInsertConsolidationWorkflow:()=>Ew,runJobById:()=>Uj,runOnce:()=>nn,startWorker:()=>Wj});import{createHash as Dj}from"node:crypto";import{readFileSync as jj}from"node:fs";import{pathToFileURL as Pj}from"node:url";function Ew(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{By({swallow:!0});let n=oa(e);if(n===null)return null;let s=jj(n,"utf8"),i=wt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:Pj(n).href,source_sha256:Dj("sha256").update(s).digest("hex")})}catch{return null}}async function nn(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??yw,evaluator:n=>Tw(t.dal,n)}),r===null?null:await ww(t.dal,r,e)}catch(n){if(r!==null)return
|
|
2177
|
+
${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 gw(t){for(let e of Mj)try{e(t)}catch{}}var ga,si,Mj,Ru=T(()=>{"use strict";ga="memory_policy",si="memory_consolidation_request";Mj=[Cj]});var bw={};he(bw,{getOrInsertConsolidationWorkflow:()=>Ew,runJobById:()=>Uj,runOnce:()=>nn,startWorker:()=>Wj});import{createHash as Dj}from"node:crypto";import{readFileSync as jj}from"node:fs";import{pathToFileURL as Pj}from"node:url";function Ew(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{By({swallow:!0});let n=oa(e);if(n===null)return null;let s=jj(n,"utf8"),i=wt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:Pj(n).href,source_sha256:Dj("sha256").update(s).digest("hex")})}catch{return null}}async function nn(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??yw,evaluator:n=>Tw(t.dal,n)}),r===null?null:await ww(t.dal,r,e)}catch(n){if(r!==null)return Mr(t.dal,r,"worker_run_failed",rn(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:ya(rn(n))})})}catch{}return null}finally{t.max_concurrent}}async function Uj(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??yw,evaluator:s=>Tw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ww(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Mr(t.dal,r,"worker_run_failed",rn(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:ya(rn(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ww(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Mr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ga&&e.source_ref===si,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=Ew(t):o=vw(t,e,n),o===null)return Mr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(i?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Mr(t,e,"worker_team_missing","team_not_found",r,n);let d;try{d=wt(o.definition)}catch(u){return Mr(t,e,"worker_workflow_invalid",rn(u),r,n)}let c=qj(d,l);if(c.length>0)return Mr(t,e,"worker_team_missing_aliases",`missing_aliases:${c.join(",")}`,r,n,a);try{let u=await rw({dal:t,job:e,workflow:d,team:a,members:l,workflowRow:o});return t.setJobRun(e.id,u.run_id),u.paused===!0?{job_id:e.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return Mr(t,e,"worker_run_failed",rn(u),r,n,a)}}function Tw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=vw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=wt(n.definition)}catch{s=null}return Ko({workflow:s,job:e,project:r})}function vw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function Wj(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await nn(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:ya(rn(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??Fj))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Mr(t,e,r,n,s,i,o){let a=ya(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function rn(t){return t instanceof Error?t.message:String(t)}function ya(t){return t.length>4096?t.slice(0,4096):t}function qj(t,e){let r=hw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var yw,Fj,Ea=T(()=>{"use strict";pu();lw();Xs();ha();Vc();Ru();yw=6e5,Fj=5e3});import{existsSync as Bj,readFileSync as Hj}from"node:fs";import{marked as Xj}from"marked";function Nw(t,e){t.get("/layman",r=>r.html(Pe("Layman Home",Jj(e.dal)))),t.get("/api/layman",r=>r.json(Lw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Iw(r);return n===null?r.notFound():r.html(Pe(`Start ${Hn(n)}`,Vj(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Iw(r);return n===null?r.notFound():n==="newspaper"?Sw(r,e.dal):Yj(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=zr(e.dal,wa(r,"id"));return n===null?r.notFound():r.html(Pe(`Run ${n.id}`,Qj(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=zr(e.dal,wa(r,"id"));return n===null?r.notFound():r.json(cP(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>tP(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Pe("Newspaper Subscriptions",lP(e.dal)))),t.post("/layman/newspaper",r=>Sw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>kw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>kw(r,e.dal))}function Jj(t){let e=Lw(t);return`<section class="layman-home">
|
|
2178
2178
|
<h1>Welcome</h1>
|
|
2179
2179
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
2180
2180
|
<div class="grid">${Ta.map(Gj).join("")}</div>
|
|
@@ -2189,7 +2189,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2189
2189
|
<h2>${b(t.title)}</h2>
|
|
2190
2190
|
<p>${b(t.description)}</p>
|
|
2191
2191
|
<p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
|
|
2192
|
-
</article>`}function Kj(t){return ye(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(
|
|
2192
|
+
</article>`}function Kj(t){return ye(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(Hn(e.workflow_name)),b(e.terminal_state??e.current_state??"queued"),b(e.started_at)]))}function Vj(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${b(Hn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${b(Hn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=Aw(n);return e==="info-qa"?`<h1>Ask a Question</h1>
|
|
2193
2193
|
<form method="post" action="/layman/start/info-qa">
|
|
2194
2194
|
${s}
|
|
2195
2195
|
<label>Ask anything<textarea name="question" rows="8" required></textarea></label>
|
|
@@ -2202,7 +2202,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2202
2202
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
2203
2203
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
2204
2204
|
<button type="submit">Start Document Wizard</button>
|
|
2205
|
-
</form>`:Rw(n,"/layman/start/newspaper")}function Aw(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 Yj(t,e,r){let n=await t.req.parseBody(),s=$w(e,n);if(s===null)return t.html(
|
|
2205
|
+
</form>`:Rw(n,"/layman/start/newspaper")}function Aw(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 Yj(t,e,r){let n=await t.req.parseBody(),s=$w(e,n);if(s===null)return t.html(Pe("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=e.getWorkflowByName(r);if(i===null)return t.html(Pe("Start workflow",`<p class="error">${b(Hn(r))} is not loaded.</p>`),400);let o=r==="info-qa"?zj(n):Zj(n);if(typeof o=="string")return t.html(Pe("Start workflow",`<p class="error">${b(o)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await nn({dal:e,worker_id:`layman-start-${Date.now()}`}),d=e.getJob(a.id),c=l?.job_id===a.id?l.run_id:d?.run_id??null;return c===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${c}`,302)}function zj(t){let e=it(t.question).trim();if(e.length===0)return"Enter a question.";let r=it(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function Zj(t){let e=it(t.task_description).trim(),r=gP(it(t.slug).trim()),n=it(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 Qj(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(Hn(r))}</h1>
|
|
2206
2206
|
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${nP(t,e,r)}`;let s=Cw(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${eP(e,s)}`:`${n}<section hx-get="/layman/run/${b(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
2207
2207
|
<h2>Running</h2>
|
|
2208
2208
|
<p class="muted">Current stage: <strong>${b(e.current_state??"starting")}</strong></p>
|
|
@@ -2218,7 +2218,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2218
2218
|
<button type="submit" name="done" value="false">Send response</button>
|
|
2219
2219
|
<button type="submit" name="done" value="true">Done with this stage</button>
|
|
2220
2220
|
</form>
|
|
2221
|
-
</section>`}async function tP(t,e){let r=wa(t,"id"),n=await t.req.parseBody(),s=Number(it(n.step_id)),i=it(n.input),o=it(n.done)==="true";if(!Number.isInteger(s))return t.html(
|
|
2221
|
+
</section>`}async function tP(t,e){let r=wa(t,"id"),n=await t.req.parseBody(),s=Number(it(n.step_id)),i=it(n.input),o=it(n.done)==="true";if(!Number.isInteger(s))return t.html(Pe("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(rP(e,a.run.id),await nn({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Pe("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function rP(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Ou(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Ou(o)&&o.name===r.current_state&&typeof o.id=="string");Ou(i)&&typeof i.id=="string"&&t.setRunCurrentState(r.id,i.id)}catch{return}}function nP(t,e,r){let n=pP(e.terminal_state);return`<section class="metric terminal-run">
|
|
2222
2222
|
<h2>${n?"Complete":"Stopped"}</h2>
|
|
2223
2223
|
<p>Status: <strong>${b(e.terminal_state)}</strong></p>
|
|
2224
2224
|
${n?sP(t,e,r):oP(e)}
|
|
@@ -2241,7 +2241,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2241
2241
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
2242
2242
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
2243
2243
|
<button type="submit">Create subscription</button>
|
|
2244
|
-
</form>`}async function Sw(t,e){let r=await t.req.parseBody(),n=$w(e,r);if(n===null)return t.html(
|
|
2244
|
+
</form>`}async function Sw(t,e){let r=await t.req.parseBody(),n=$w(e,r);if(n===null)return t.html(Pe("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Pe("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=it(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return t.html(Pe("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:it(r.output_dir).trim()||"digests",schedule:fP(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function kw(t,e){let r=wa(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function dP(t){return ye(["id","project","topics","status","action"],t.map(e=>{let r=yP(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 Lw(t){let e=Ow(t);return{workflows:Ta,recent_runs:uP(t),newspaper_subscriptions:e.length}}function cP(t,e){let r=Cw(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 uP(t){return t.query(`SELECT r.*, w.name AS workflow_name
|
|
2245
2245
|
FROM run r
|
|
2246
2246
|
JOIN workflow w ON w.id = r.workflow_id
|
|
2247
2247
|
WHERE w.name IN (${Cu.map(()=>"?").join(",")})
|
|
@@ -2251,21 +2251,21 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2251
2251
|
JOIN workflow w ON w.id = pw.workflow_id
|
|
2252
2252
|
JOIN project p ON p.id = pw.project_id
|
|
2253
2253
|
WHERE w.name = ?
|
|
2254
|
-
ORDER BY pw.id DESC`,"newspaper")}function Cw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function $w(t,e){let r=Number(it(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function fP(t){let e=it(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:it(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Iw(t){let e=t.req.param("workflow");return Cu.includes(e)?e:null}function
|
|
2254
|
+
ORDER BY pw.id DESC`,"newspaper")}function Cw(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function $w(t,e){let r=Number(it(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function fP(t){let e=it(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:it(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Iw(t){let e=t.req.param("workflow");return Cu.includes(e)?e:null}function Hn(t){return Ta.find(e=>e.name===t)?.title??t}function mP(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Mu(t){return Xj.parse(t,{async:!1})}function pP(t){return t==="done"||t==="pr_ready"||t==="merged"}function _P(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function hP(t,e){return t.split(`
|
|
2255
2255
|
`).slice(0,e).join(`
|
|
2256
|
-
`)}function gP(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function it(t){return typeof t=="string"?t:""}function yP(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 Ou(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function wa(t,e){return Number(t.req.param(e))}var Ta,Cu,Mw=T(()=>{"use strict";Ea();sr();du();Ta=[{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."}],Cu=Ta.map(t=>t.name)});function wP(t){return t.replace(/^\/+/,"")}function Dw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Hn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=wP(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 Dw(t.userId)&&Dw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${EP}/${t.identityId}/`}function vP(t){return String(Math.max(0,Math.floor(t))).padStart(TP,"0")}function Du(t,e,r){return`${t}${e}${vP(r)}.json`}function va(t,e){return`${t}${e}`}function ba(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 i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var EP,TP,Sa=T(()=>{"use strict";EP="mailbox";TP=12});function dr(t,e){let r=Math.floor(t),n="",s=r;for(let c=0;c<12;c++)n=ka[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let c=0;c<3;c++)o=ka[a&15]+o,a=a>>4;let l=ka[8|Math.floor(e()*4)&3],d="";for(let c=0;c<15;c++)d+=ka[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+d.slice(0,3)+"-"+d.slice(3,15)}var ka,Ia=T(()=>{"use strict";ka="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function Ww(t){return t.conversation_id===Uw&&kP(t.payload)}function kP(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function IP(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Ww(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var jw,Pw,Fw,bP,Uw,SP,ju,sn,Na=T(()=>{"use strict";Sa();Ia();jw=3e3,Pw=1e4,Fw=12e3,bP=1e3,Uw="__lmctl_heartbeat__",SP={kind:"heartbeat"},ju={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},sn=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=Hn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Pu(e.readIntervalMs??e.pollIntervalMs??jw,jw),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??Pw,Pw),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Fw,Fw)}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??ju;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=va(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:bP,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=ba(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.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(),i={message_id:dr(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=Du(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??ju;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=Du(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Fu(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Ww(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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=IP(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??ju;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(Uw,SP)}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 NP}from"@hono/node-server/conninfo";function qw(t,e){let r=e.bucket??AP,n=e.remoteAddressOf??(i=>RP(i)),s=i=>{let o=n(i);return LP(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Uu(i.req.query("key"));if(typeof a!="string")return i.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 i.json({error:"empty_body"},404);let d=await l.Body.transformToString("utf-8");return i.body(d,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fu(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Uu(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(d){return i.json({error:"internal",message:Wu(d)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Uu(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let d=xP(i.req.query("maxKeys")),c=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...d!==void 0?{MaxKeys:d}:{},...c!==void 0&&c!==""?{ContinuationToken:c}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Wu(u)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function xP(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function RP(t){try{return NP(t).remote.address}catch{return}}function LP(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var AP,Bw=T(()=>{"use strict";Na();AP="local"});function Hw(t,e){t.get("/mailbox/workspace",r=>$P(r,e)),t.get("/mailbox/projects",r=>MP(r,e)),t.get("/mailbox/projects/:id",r=>DP(r,e)),t.post("/mailbox/projects",r=>jP(r,e)),t.patch("/mailbox/projects/:id",r=>PP(r,e)),t.delete("/mailbox/projects/:id",r=>FP(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>UP(r,e)),t.get("/mailbox/prompts/:id",r=>WP(r,e))}function $P(t,e){e.dal.ensureWorkspace({id:Jn,name:qu});let r=Xw(e.dal),n={id:Jn,name:qu,created_at:CP,projects:r};return t.json({workspace:n})}function MP(t,e){return t.json({projects:Xw(e.dal)})}function DP(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(Xn)){let s=Bu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ra(s)})}let n=Gw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Jw(n)})}async function jP(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:Jn,name:qu});let s=e.dal.insertWebProject({workspace_id:Jn,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:Ra(s)},201)}async function PP(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(Xn)){let i=Bu(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.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 o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Ra(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function FP(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(Xn)){let n=Bu(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 UP(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 i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=Gw(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${OP}${crypto.randomUUID()}`,d={text:s.text,context_json:s.context_json??null},c;e.enqueueProjectJob!==void 0?c=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:d}):c=await qP({dal:e.dal,project_id:o.id,source_ref:l,payload:d}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:c.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${xa}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function WP(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=BP(e.dal,r);return t.json({result:n})}function Xw(t){let e=t.listProjects().map(Jw),r=t.listWebProjectsActive(Jn).map(Ra);return[...e,...r].sort(QP)}function Jw(t){return{id:`${xa}${t.id}`,workspace_id:Jn,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 Ra(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:`${Xn}${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 Bu(t,e){if(!e.startsWith(Xn))return null;let r=e.slice(Xn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Gw(t,e){if(e.startsWith(xa)){let n=e.slice(xa.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 qP(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(zc(),uy));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function BP(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),i=t.getProject(r.project_id),o=YP(t,i?.team_id??null),a=VP(s),l=zP(n,a,o.length>0),d=ZP(r.created_at,s),c=i===null?{totalEstimatedMs:void 0,perStep:new Map}:HP(t,i.workflow_name),u=c.totalEstimatedMs,f=Kw(r.created_at),m=i?.workflow_name,p=c.perStep.size>0?c.perStep.size:void 0,h=s===null?[]:XP(t,s.id),_=JP(s,a,h,c.perStep,o),g=GP(h,c.perStep),y=KP(_,g,u,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,...Aa(u,f),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:d}: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,...Aa(u,f),...y},errors_json:null,duration_ms:d}):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:o,...Aa(u,f),...y},errors_json:null,duration_ms:d}:{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,...Aa(u,f),...y},errors_json:null,duration_ms:d}}function HP(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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let d=l;if(typeof d.id!="string"||d.id.length===0)continue;let c=typeof d.name=="string"&&d.name.length>0?d.name:d.id,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(d.id,u===void 0?{name:c}:{name:c,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,d]of Object.entries(i.states)){if(d===null||typeof d!="object")continue;let c=d,u=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(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function XP(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function JP(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),d=l?.name??i,c=Kw(a),u={id:i,name:d,started_at:a,elapsed_ms:c};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function GP(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-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:o,status:l})}return r}function KP(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Kw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Aa(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function VP(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 YP(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 zP(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 ZP(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 QP(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 xa,Xn,OP,Jn,qu,CP,Vw=T(()=>{"use strict";xa="project:",Xn="web_project:",OP="prompt:",Jn="default",qu="Default workspace",CP=new Date(0).toISOString()});import{Buffer as Yw}from"node:buffer";function zw(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 Zw(t){return rF[t]}function Qw(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 eF,tF,La,rF,Hu=T(()=>{"use strict";eF=1e4,tF=256*1024,La=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=zw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,eF),this.pushByteCap=zw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,tF),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+=Yw.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=${Yw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
|
|
2256
|
+
`)}function gP(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function it(t){return typeof t=="string"?t:""}function yP(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 Ou(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function wa(t,e){return Number(t.req.param(e))}var Ta,Cu,Mw=T(()=>{"use strict";Ea();sr();du();Ta=[{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."}],Cu=Ta.map(t=>t.name)});function wP(t){return t.replace(/^\/+/,"")}function Dw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Xn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=wP(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 Dw(t.userId)&&Dw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${EP}/${t.identityId}/`}function vP(t){return String(Math.max(0,Math.floor(t))).padStart(TP,"0")}function Du(t,e,r){return`${t}${e}${vP(r)}.json`}function va(t,e){return`${t}${e}`}function ba(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 i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var EP,TP,Sa=T(()=>{"use strict";EP="mailbox";TP=12});function dr(t,e){let r=Math.floor(t),n="",s=r;for(let c=0;c<12;c++)n=ka[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let c=0;c<3;c++)o=ka[a&15]+o,a=a>>4;let l=ka[8|Math.floor(e()*4)&3],d="";for(let c=0;c<15;c++)d+=ka[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+d.slice(0,3)+"-"+d.slice(3,15)}var ka,Ia=T(()=>{"use strict";ka="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function Ww(t){return t.conversation_id===Uw&&kP(t.payload)}function kP(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function IP(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Ww(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var jw,Pw,Fw,bP,Uw,SP,ju,sn,Na=T(()=>{"use strict";Sa();Ia();jw=3e3,Pw=1e4,Fw=12e3,bP=1e3,Uw="__lmctl_heartbeat__",SP={kind:"heartbeat"},ju={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},sn=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=Xn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Pu(e.readIntervalMs??e.pollIntervalMs??jw,jw),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??Pw,Pw),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Fw,Fw)}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??ju;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=va(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:bP,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=ba(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.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(),i={message_id:dr(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=Du(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??ju;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=Du(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Fu(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Ww(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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=IP(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??ju;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(Uw,SP)}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 NP}from"@hono/node-server/conninfo";function qw(t,e){let r=e.bucket??AP,n=e.remoteAddressOf??(i=>RP(i)),s=i=>{let o=n(i);return LP(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Uu(i.req.query("key"));if(typeof a!="string")return i.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 i.json({error:"empty_body"},404);let d=await l.Body.transformToString("utf-8");return i.body(d,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fu(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Uu(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(d){return i.json({error:"internal",message:Wu(d)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Uu(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let d=xP(i.req.query("maxKeys")),c=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...d!==void 0?{MaxKeys:d}:{},...c!==void 0&&c!==""?{ContinuationToken:c}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Wu(u)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function xP(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function RP(t){try{return NP(t).remote.address}catch{return}}function LP(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var AP,Bw=T(()=>{"use strict";Na();AP="local"});function Hw(t,e){t.get("/mailbox/workspace",r=>$P(r,e)),t.get("/mailbox/projects",r=>MP(r,e)),t.get("/mailbox/projects/:id",r=>DP(r,e)),t.post("/mailbox/projects",r=>jP(r,e)),t.patch("/mailbox/projects/:id",r=>PP(r,e)),t.delete("/mailbox/projects/:id",r=>FP(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>UP(r,e)),t.get("/mailbox/prompts/:id",r=>WP(r,e))}function $P(t,e){e.dal.ensureWorkspace({id:Gn,name:qu});let r=Xw(e.dal),n={id:Gn,name:qu,created_at:CP,projects:r};return t.json({workspace:n})}function MP(t,e){return t.json({projects:Xw(e.dal)})}function DP(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(Jn)){let s=Bu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ra(s)})}let n=Gw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Jw(n)})}async function jP(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:Gn,name:qu});let s=e.dal.insertWebProject({workspace_id:Gn,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:Ra(s)},201)}async function PP(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(Jn)){let i=Bu(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.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 o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Ra(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function FP(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(Jn)){let n=Bu(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 UP(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 i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=Gw(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${OP}${crypto.randomUUID()}`,d={text:s.text,context_json:s.context_json??null},c;e.enqueueProjectJob!==void 0?c=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:d}):c=await qP({dal:e.dal,project_id:o.id,source_ref:l,payload:d}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:c.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${xa}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function WP(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=BP(e.dal,r);return t.json({result:n})}function Xw(t){let e=t.listProjects().map(Jw),r=t.listWebProjectsActive(Gn).map(Ra);return[...e,...r].sort(QP)}function Jw(t){return{id:`${xa}${t.id}`,workspace_id:Gn,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 Ra(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:`${Jn}${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 Bu(t,e){if(!e.startsWith(Jn))return null;let r=e.slice(Jn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Gw(t,e){if(e.startsWith(xa)){let n=e.slice(xa.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 qP(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(zc(),uy));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function BP(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),i=t.getProject(r.project_id),o=YP(t,i?.team_id??null),a=VP(s),l=zP(n,a,o.length>0),d=ZP(r.created_at,s),c=i===null?{totalEstimatedMs:void 0,perStep:new Map}:HP(t,i.workflow_name),u=c.totalEstimatedMs,f=Kw(r.created_at),m=i?.workflow_name,p=c.perStep.size>0?c.perStep.size:void 0,h=s===null?[]:XP(t,s.id),_=JP(s,a,h,c.perStep,o),g=GP(h,c.perStep),y=KP(_,g,u,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,...Aa(u,f),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:d}: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,...Aa(u,f),...y},errors_json:null,duration_ms:d}):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:o,...Aa(u,f),...y},errors_json:null,duration_ms:d}:{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,...Aa(u,f),...y},errors_json:null,duration_ms:d}}function HP(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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let d=l;if(typeof d.id!="string"||d.id.length===0)continue;let c=typeof d.name=="string"&&d.name.length>0?d.name:d.id,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(d.id,u===void 0?{name:c}:{name:c,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,d]of Object.entries(i.states)){if(d===null||typeof d!="object")continue;let c=d,u=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(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function XP(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function JP(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),d=l?.name??i,c=Kw(a),u={id:i,name:d,started_at:a,elapsed_ms:c};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function GP(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-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:o,status:l})}return r}function KP(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Kw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Aa(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function VP(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 YP(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 zP(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 ZP(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 QP(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 xa,Jn,OP,Gn,qu,CP,Vw=T(()=>{"use strict";xa="project:",Jn="web_project:",OP="prompt:",Gn="default",qu="Default workspace",CP=new Date(0).toISOString()});import{Buffer as Yw}from"node:buffer";function zw(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 Zw(t){return rF[t]}function Qw(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 eF,tF,La,rF,Hu=T(()=>{"use strict";eF=1e4,tF=256*1024,La=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=zw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,eF),this.pushByteCap=zw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,tF),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+=Yw.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=${Yw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
|
|
2257
2257
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
2258
2258
|
`,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(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};rF={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:[]},kimi:{cmd:"kimi",args:["--auto"]}}});function tT(t,e){t.post("/mailbox/terminal/launch",r=>nF(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>sF(r,e)),t.get("/mailbox/terminal/sessions",r=>iF(r,e))}async function nF(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"||!eT.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=Qw(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Zw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.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 sF(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||!eT.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 iF(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 eT,rT=T(()=>{"use strict";Hu();eT=/^[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 oF}from"node:buffer";function dF(t){try{return oF.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function nT(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 sT(t){return cF[t]}function iT(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let i=e[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;r.push(e.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var aF,lF,Oa,cF,Xu=T(()=>{"use strict";aF=2e3,lF=64*1024,Oa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=nT(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,aF),this.pushByteCap=nT(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,lF),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 i=await r.start(e,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}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 i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}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=dF(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(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,i)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; 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")))})}};cF={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"]},kimi:{cmd:"kimi",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function aT(t,e){t.post("/mailbox/chat/launch",r=>uF(r,e)),t.post("/mailbox/chat/end/:session_id",r=>fF(r,e)),t.get("/mailbox/chat/sessions",r=>mF(r,e))}async function uF(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"||!oT.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=iT(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=sT(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.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 fF(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||!oT.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 mF(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 oT,lT=T(()=>{"use strict";Xu();oT=/^[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 pF}from"node:fs";function cT(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return dT(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=pF(e.path,{encoding:"utf8"});return dT(r)}catch{return[]}}function dT(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 uT=T(()=>{"use strict"});function fT(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 o=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(d=>d.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=o[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 Ca(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
2259
2259
|
WHERE run_id = ?
|
|
2260
2260
|
AND acknowledged_at IS NULL
|
|
2261
2261
|
AND requires_user = 1
|
|
2262
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var $a=T(()=>{"use strict"});function vT(t,e){t.all("/runtime/*",r=>_F(r.req.raw,e))}async function _F(t,e){try{return Response.json(await hF(t,e))}catch(r){if(r instanceof de)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 hF(t,e){let r=new URL(t.url),n=bF(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Ju(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Ma(t,n.id,s[2]),gF(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Ma(t,n.id,s[2]);let i=pT(e.dal,s[4]);return mT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Ju(t),e.dal.listTeams().map(i=>vF(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=_T(e.dal,hT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new de(400,"runtime lead chat body does not match route team");return yT(t,n.id,o.context),gT(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=_T(e.dal,hT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new de(400,"runtime lead message body does not match route team");yT(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new de(400,"runtime lead message requires draft.body");return gT(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Ma(t,n.id,s[2]);let i=pT(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new de(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new de(400,"runtime workflow message requires draft.body");return wF(e.dal,i,a),mT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ii(t,n.id),e.dal.listWorkflows().map(i=>SF(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ii(t,n.id);let i=IF(e.dal,s[2]);return kF(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ii(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new de(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return NF(e.dal,i,o).map(l=>wT(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ii(t,n.id);let i=ET(e.dal,s[2]);return wT(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ii(t,n.id);let i=ET(e.dal,s[2]),o=xF(e.dal,i);return{runId:zu(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new de(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function gF(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>bT(t,e,r))}}function mT(t,e,r){let n=bT(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:yF(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:EF(t,r)}}function bT(t,e,r){let n=ST(t,r.id),s=Ku(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 yF(t,e){let r=ST(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:Ku(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 EF(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 wF(t,e,r){let n=TF(t,e.id);if(n!==null){let s=Ca(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new de(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Ft(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new de(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new de(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function ST(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 TF(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 Ku(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 pT(t,e){let r=t.findProjectByName(e);if(r===null)throw new de(404,`project not found: ${e}`);return r}function _T(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new de(404,`team not found: ${e}`);return r}function hT(t){return t.startsWith("team:")?t.slice(5):t}function vF(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function gT(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??TT}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function bF(t){let e=t.workspaceName??"default";return{id:e,name:e}}function Ju(t){if(t.headers.get("x-lmctl-workspace-id")!==TT)throw new de(400,"runtime request requires global-admin workspace identity")}function Ma(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new de(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new de(400,"runtime workspace identity does not match route")}function ii(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new de(400,"runtime request requires workspace identity");if(r!==e)throw new de(400,"runtime workspace identity does not match server workspace")}function yT(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new de(400,"workspace manager context requires workspace identity");Ma(t,e,r.workspaceId);return}Ju(t)}function Vu(t){return`${Gn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function SF(t){let e=Da(t.definition);return{id:Vu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function kF(t){let e=Da(t.definition);return{id:Vu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Da(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=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=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&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function IF(t,e){if(!e.startsWith(Gn))throw new de(404,`template not found: ${e}`);let r=e.slice(Gn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new de(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new de(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function ET(t,e){if(!e.startsWith(Gu))throw new de(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new de(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new de(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new de(404,`run not found: ${e}`);return s}function NF(t,e,r){if(r!==null){if(!r.startsWith(Gn))return[];let s=r.slice(Gn.length),i=t.listWorkflows().filter(a=>Yu(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}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 wT(t,e){let r=t.getWorkflow(e.workflow_id),n=Ku(e),s=AF(r,e);return{id:zu(e),templateId:r===null?`${Gn}unknown`:Vu(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 AF(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]:[Da(t.definition).nameToId.get(r)??r]}function xF(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Da(r.definition),s=d=>n.nameToId.get(d)??d,i=zu(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let d of a){let c=s(d.state_name);if(o.push({timestamp:d.started_at,type:"step.started",stepId:c,message:`step ${d.state_name} started`}),d.ended_at!==null){let u=RF(d);o.push({timestamp:d.ended_at,type:u,stepId:c,...d.outcome===null?{}:{message:d.outcome},...d.status_detail===null?{}:{payload:{status_detail:d.status_detail}}})}else e.paused_at!==null&&d.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:c})}let l=t.listSessionEvents(e.id);for(let d of l){let c=d.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===d.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(d.timestamp_ms).toISOString(),f={kind:d.kind,session_event_id:d.id};if(d.payload.length>0)try{let m=JSON.parse(d.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...c===void 0?{}:{stepId:c},payload:f})}if(e.terminal_state!==null){let d=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:d,message:e.terminal_state})}return o.sort((d,c)=>d.timestamp.localeCompare(c.timestamp)),o.map((d,c)=>({id:`${i}:evt:${c+1}`,runId:i,sequence:c+1,timestamp:d.timestamp,type:d.type,...d.stepId===void 0?{}:{stepId:d.stepId},...d.message===void 0?{}:{message:d.message},...d.payload===void 0?{}:{payload:d.payload}}))}function RF(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 TT,Gn,Gu,de,kT=T(()=>{"use strict";$a();sr();TT="global-admin";Gn="template:",Gu="run:";de=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as LF,writeFileSync as OF}from"node:fs";import{randomUUID as IT}from"node:crypto";import{dirname as CF,resolve as ja,sep as NT}from"node:path";async function xT(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(!PF(n))return t.text("missing image file",400);if(n.size>$F)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=FF(s);if(i===null||!(i in AT))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=MF(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?ja(jF()):ja(o.local_path),l=ja(a,"uploads",IT()),d=ja(l,`${IT()}${AT[i]}`);if(!DF(d,a))return t.text("invalid upload path",400);LF(l,{recursive:!0});let c=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);OF(d,c);let u={path:d,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function MF(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function DF(t,e){let r=e.endsWith(NT)?e:`${e}${NT}`;return t.startsWith(r)}function jF(){return CF(ne())}function PF(t){return typeof File<"u"&&t instanceof File}function FF(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 $F,AT,RT=T(()=>{"use strict";ze();$F=10*1024*1024,AT={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Pa}from"node:fs";import{basename as UF,dirname as WF,extname as qF,isAbsolute as BF,join as HF,relative as XF}from"node:path";import{fileURLToPath as JF}from"node:url";import{Hono as GF}from"hono";import{serveStatic as Wt}from"@hono/node-server/serve-static";function jT(t){let e=new GF,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):KF();if(t.localWebui!==void 0&&qw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=VF();t.localWebui!==void 0?e.get("/config.json",s,i=>i.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,i=>i.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("*",yy({disabled:t.authDisabled})),e.get("/login",s=>s.html(je("Login",`
|
|
2262
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var $a=T(()=>{"use strict"});function vT(t,e){t.all("/runtime/*",r=>_F(r.req.raw,e))}async function _F(t,e){try{return Response.json(await hF(t,e))}catch(r){if(r instanceof de)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 hF(t,e){let r=new URL(t.url),n=bF(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Ju(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Ma(t,n.id,s[2]),gF(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Ma(t,n.id,s[2]);let i=pT(e.dal,s[4]);return mT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Ju(t),e.dal.listTeams().map(i=>vF(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=_T(e.dal,hT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new de(400,"runtime lead chat body does not match route team");return yT(t,n.id,o.context),gT(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=_T(e.dal,hT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new de(400,"runtime lead message body does not match route team");yT(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new de(400,"runtime lead message requires draft.body");return gT(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Ma(t,n.id,s[2]);let i=pT(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new de(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new de(400,"runtime workflow message requires draft.body");return wF(e.dal,i,a),mT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ii(t,n.id),e.dal.listWorkflows().map(i=>SF(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ii(t,n.id);let i=IF(e.dal,s[2]);return kF(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ii(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new de(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return NF(e.dal,i,o).map(l=>wT(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ii(t,n.id);let i=ET(e.dal,s[2]);return wT(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ii(t,n.id);let i=ET(e.dal,s[2]),o=xF(e.dal,i);return{runId:zu(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new de(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function gF(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>bT(t,e,r))}}function mT(t,e,r){let n=bT(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:yF(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:EF(t,r)}}function bT(t,e,r){let n=ST(t,r.id),s=Ku(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 yF(t,e){let r=ST(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:Ku(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 EF(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 wF(t,e,r){let n=TF(t,e.id);if(n!==null){let s=Ca(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new de(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Ft(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new de(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new de(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function ST(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 TF(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 Ku(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 pT(t,e){let r=t.findProjectByName(e);if(r===null)throw new de(404,`project not found: ${e}`);return r}function _T(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new de(404,`team not found: ${e}`);return r}function hT(t){return t.startsWith("team:")?t.slice(5):t}function vF(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function gT(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??TT}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function bF(t){let e=t.workspaceName??"default";return{id:e,name:e}}function Ju(t){if(t.headers.get("x-lmctl-workspace-id")!==TT)throw new de(400,"runtime request requires global-admin workspace identity")}function Ma(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new de(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new de(400,"runtime workspace identity does not match route")}function ii(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new de(400,"runtime request requires workspace identity");if(r!==e)throw new de(400,"runtime workspace identity does not match server workspace")}function yT(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new de(400,"workspace manager context requires workspace identity");Ma(t,e,r.workspaceId);return}Ju(t)}function Vu(t){return`${Kn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function SF(t){let e=Da(t.definition);return{id:Vu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function kF(t){let e=Da(t.definition);return{id:Vu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Da(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=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=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&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function IF(t,e){if(!e.startsWith(Kn))throw new de(404,`template not found: ${e}`);let r=e.slice(Kn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new de(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new de(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function ET(t,e){if(!e.startsWith(Gu))throw new de(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new de(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new de(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new de(404,`run not found: ${e}`);return s}function NF(t,e,r){if(r!==null){if(!r.startsWith(Kn))return[];let s=r.slice(Kn.length),i=t.listWorkflows().filter(a=>Yu(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}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 wT(t,e){let r=t.getWorkflow(e.workflow_id),n=Ku(e),s=AF(r,e);return{id:zu(e),templateId:r===null?`${Kn}unknown`:Vu(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 AF(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]:[Da(t.definition).nameToId.get(r)??r]}function xF(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Da(r.definition),s=d=>n.nameToId.get(d)??d,i=zu(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let d of a){let c=s(d.state_name);if(o.push({timestamp:d.started_at,type:"step.started",stepId:c,message:`step ${d.state_name} started`}),d.ended_at!==null){let u=RF(d);o.push({timestamp:d.ended_at,type:u,stepId:c,...d.outcome===null?{}:{message:d.outcome},...d.status_detail===null?{}:{payload:{status_detail:d.status_detail}}})}else e.paused_at!==null&&d.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:c})}let l=t.listSessionEvents(e.id);for(let d of l){let c=d.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===d.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(d.timestamp_ms).toISOString(),f={kind:d.kind,session_event_id:d.id};if(d.payload.length>0)try{let m=JSON.parse(d.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...c===void 0?{}:{stepId:c},payload:f})}if(e.terminal_state!==null){let d=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:d,message:e.terminal_state})}return o.sort((d,c)=>d.timestamp.localeCompare(c.timestamp)),o.map((d,c)=>({id:`${i}:evt:${c+1}`,runId:i,sequence:c+1,timestamp:d.timestamp,type:d.type,...d.stepId===void 0?{}:{stepId:d.stepId},...d.message===void 0?{}:{message:d.message},...d.payload===void 0?{}:{payload:d.payload}}))}function RF(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 TT,Kn,Gu,de,kT=T(()=>{"use strict";$a();sr();TT="global-admin";Kn="template:",Gu="run:";de=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as LF,writeFileSync as OF}from"node:fs";import{randomUUID as IT}from"node:crypto";import{dirname as CF,resolve as ja,sep as NT}from"node:path";async function xT(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(!PF(n))return t.text("missing image file",400);if(n.size>$F)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=FF(s);if(i===null||!(i in AT))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=MF(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?ja(jF()):ja(o.local_path),l=ja(a,"uploads",IT()),d=ja(l,`${IT()}${AT[i]}`);if(!DF(d,a))return t.text("invalid upload path",400);LF(l,{recursive:!0});let c=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);OF(d,c);let u={path:d,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function MF(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function DF(t,e){let r=e.endsWith(NT)?e:`${e}${NT}`;return t.startsWith(r)}function jF(){return CF(ne())}function PF(t){return typeof File<"u"&&t instanceof File}function FF(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 $F,AT,RT=T(()=>{"use strict";ze();$F=10*1024*1024,AT={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Pa}from"node:fs";import{basename as UF,dirname as WF,extname as qF,isAbsolute as BF,join as HF,relative as XF}from"node:path";import{fileURLToPath as JF}from"node:url";import{Hono as GF}from"hono";import{serveStatic as Wt}from"@hono/node-server/serve-static";function jT(t){let e=new GF,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):KF();if(t.localWebui!==void 0&&qw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=VF();t.localWebui!==void 0?e.get("/config.json",s,i=>i.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,i=>i.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("*",yy({disabled:t.authDisabled})),e.get("/login",s=>s.html(Pe("Login",`
|
|
2263
2263
|
<h1>Login</h1>
|
|
2264
2264
|
<form method="post" action="/login">
|
|
2265
2265
|
<label>Token <input name="token" type="password"></label>
|
|
2266
2266
|
<button type="submit">Login</button>
|
|
2267
2267
|
</form>
|
|
2268
|
-
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return wy(o)?(nu(s,o),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Ty(s),s.redirect("/login",302))),Nw(e,{dal:t.dal}),vT(e,{dal:t.dal}),Hw(e,{dal:t.dal}),tT(e,{terminalSessionManager:t.terminalSessionManager}),aT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Us(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],d=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.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(!d.ok){let f=d.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let c=[],u=[];for(let f of a)try{await Nc(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),c.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return q(s,{team:i,seeded:c,failed:u},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>`)}),Ay(e,{dal:t.dal}),My(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Ao(t.dal),r1)),e.get("/api/projects",s=>q(s,xo(t.dal),n1)),e.get("/api/teams",s=>q(s,yg(t.dal),o1)),e.get("/api/workflows",s=>q(s,Ro(t.dal),a1)),e.get("/api/workflows/verify",s=>{let i=uw();return s.req.header("accept")?.includes("text/plain")?s.text(mw(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Eg(t.dal,{status:s.req.query("status")}),l1)),e.post("/api/uploads",s=>xT(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Lo(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",d=i.payload,c=d==null?null:typeof d=="string"?d:JSON.stringify(d),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:c,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,u,_e)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ea(),bw)),o=Lo(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.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 i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():q(s,t.dal.listProjectWorkflows(i.id),s1)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Kn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,d=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(d===null)return s.text("workflow not found",404);let c=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(c!==null)try{$n(c)}catch{return s.text("invalid condition",400)}let u=ZF(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:d.id,condition:c,parameters_override:u,priority:f});return q(s,m,_e)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},_e):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():q(s,i,_e)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=OT(s.req.query("status"),QF);if(typeof o=="string")return s.text(o,400);let a=OT(s.req.query("severity"),FT);return typeof a=="string"?s.text(a,400):q(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),i1)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Kn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let d=e1(o.severity);if(typeof d=="object")return s.text(d.error,400);let c=t1(o.labels);if(typeof c=="string"&&c.startsWith("error:"))return s.text(c.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...d!==void 0?{severity:d}:{},labels:c,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return q(s,u,_e)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Kn(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 d=t.dal.claimIssue(i,l);return d===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,d,_e)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):q(s,l,_e)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return q(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return q(s,t.dal.reopenIssue(ie(s,"id"),a),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return q(s,{...i,owner:a,repo:l},_e)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=Zr(t.dal,i,o);return q(s,a,_e)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=Zr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],d=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return d?s.text(l.content):q(s,l,_e);if(l.path!==null&&l.path!==void 0){if(d)try{let{readFileSync:c}=await import("node:fs"),u=YF(l.path);if(zF(u)){let h=c(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=c(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=UF(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(c){return s.text(`failed to read artifact path: ${c.message}`,500)}return q(s,l,_e)}return q(s,l,_e)}),e.get("/api/runs",s=>q(s,On(t.dal,{limit:Zu(s,"limit")??100}),d1)),e.get("/api/runs/:id",s=>{let i=zr(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,c1)}),e.get("/api/runs/:id/where",s=>{let i=Cn(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Co(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=$o(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Mo(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let d=(await s.req.parseBody().catch(()=>({}))).outcome;typeof d=="string"&&d.length>0&&(i=d)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(Fa(t.daemon),q(s,o,CT)):q(s,o,CT,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let c=await s.req.json();typeof c.input=="string"&&(o=c.input),c.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let c=await s.req.parseBody().catch(()=>({}));typeof c.input=="string"&&(o=c.input),(c.done==="true"||c.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=t.dal.resumeInteractive(i,o,a);return!d.resumed&&d.reason==="not_found"?s.notFound():d.resumed?(Fa(t.daemon),s.json({resumed:!0,session_status:d.session.status})):s.json({resumed:!1,reason:d.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>LT(s,t.dal,i=>q(s,i,f1))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=bg(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():PT(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>LT(s,t.dal,i=>{let o=cT(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>q(s,Sg(t.dal,{type:s.req.query("type")}),m1)),e.get("/api/external-signals",s=>q(s,kg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),p1)),e.get("/api/attentions",s=>q(s,Ar(t.dal,{unacked:s.req.query("unacked")==="true"}),_1)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():q(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let d=Oo(t.dal,l);return q(s,d,c=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],c.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Ft(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=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"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=Ft(t.dal,i);if(d===null)return s.notFound();let c=Ar(t.dal).find(m=>m.id===i);if(c===void 0)return s.notFound();if(c.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Fa(t.daemon);let p=Ar(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(c.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:c.kind},400);if(c.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(d.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(d.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:d.step_id},400);let f=t.dal.acknowledgeAttention(i);return Fa(t.daemon),s.json({ok:!0,attention_id:i,step_id:d.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=wg(t.dal,{status:o,pr_url:i});return q(s,a,h1)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=Tg(t.dal,i);return o===null?s.notFound():q(s,o,g1)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),$T)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Us(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),$T)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Us(s.req.param("team_name"));try{let o=await ug(t.dal,i,s.req.param("alias"));return q(s,o,a=>MT("compacted",a.row))}catch(o){if(o instanceof Fs)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Us(s.req.param("team_name")),o=await Nc(t.dal,i,s.req.param("alias"));return q(s,o,a=>MT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,r,DT)),e.post("/api/intake/scan",async s=>(r=await zo(t.dal),q(s,r,DT))),e.get("/api/stats/run-throughput",s=>q(s,Ag(t.dal),y1)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,E1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},_e);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},_e)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=$c(t.dal,i),l=Mc(t.dal,{project_id:i});return s.html(je(`Metrics \u2014 ${o.name}`,w1(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Zu(s,"since_days");return s.json($c(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Zu(s,"since_days");return s.json(Mc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function LT(t,e,r){let n=Cc(e,ie(t,"id"),ie(t,"step_id"));return n===null?t.notFound():r(n)}function Fa(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,r,n=200){return PT(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 PT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function KF(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Pa(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(Pa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Pa(`${r}/index.html`))return r;let n=HF(WF(JF(import.meta.url)),"webui-dist");return Pa(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!BF(t))return t;let e=XF(process.cwd(),t);return e.length===0?".":e}function VF(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function YF(t){switch(qF(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 zF(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Kn(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 ZF(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 OT(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 e1(t){if(t!=null)return typeof t=="string"&&FT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function t1(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 r1(t){return`<h1>Status</h1><div class="grid">
|
|
2268
|
+
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return wy(o)?(nu(s,o),s.redirect("/",302)):s.html(Pe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Ty(s),s.redirect("/login",302))),Nw(e,{dal:t.dal}),vT(e,{dal:t.dal}),Hw(e,{dal:t.dal}),tT(e,{terminalSessionManager:t.terminalSessionManager}),aT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Us(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],d=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.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(!d.ok){let f=d.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let c=[],u=[];for(let f of a)try{await Nc(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),c.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return q(s,{team:i,seeded:c,failed:u},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>`)}),Ay(e,{dal:t.dal}),My(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Ao(t.dal),r1)),e.get("/api/projects",s=>q(s,xo(t.dal),n1)),e.get("/api/teams",s=>q(s,yg(t.dal),o1)),e.get("/api/workflows",s=>q(s,Ro(t.dal),a1)),e.get("/api/workflows/verify",s=>{let i=uw();return s.req.header("accept")?.includes("text/plain")?s.text(mw(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Eg(t.dal,{status:s.req.query("status")}),l1)),e.post("/api/uploads",s=>xT(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Lo(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",d=i.payload,c=d==null?null:typeof d=="string"?d:JSON.stringify(d),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:c,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,u,_e)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ea(),bw)),o=Lo(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.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 i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():q(s,t.dal.listProjectWorkflows(i.id),s1)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Vn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,d=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(d===null)return s.text("workflow not found",404);let c=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(c!==null)try{Mn(c)}catch{return s.text("invalid condition",400)}let u=ZF(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:d.id,condition:c,parameters_override:u,priority:f});return q(s,m,_e)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},_e):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():q(s,i,_e)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=OT(s.req.query("status"),QF);if(typeof o=="string")return s.text(o,400);let a=OT(s.req.query("severity"),FT);return typeof a=="string"?s.text(a,400):q(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),i1)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Vn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let d=e1(o.severity);if(typeof d=="object")return s.text(d.error,400);let c=t1(o.labels);if(typeof c=="string"&&c.startsWith("error:"))return s.text(c.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...d!==void 0?{severity:d}:{},labels:c,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return q(s,u,_e)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Vn(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 d=t.dal.claimIssue(i,l);return d===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,d,_e)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Vn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):q(s,l,_e)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Vn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return q(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Vn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return q(s,t.dal.reopenIssue(ie(s,"id"),a),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return q(s,{...i,owner:a,repo:l},_e)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=Zr(t.dal,i,o);return q(s,a,_e)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=Zr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],d=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return d?s.text(l.content):q(s,l,_e);if(l.path!==null&&l.path!==void 0){if(d)try{let{readFileSync:c}=await import("node:fs"),u=YF(l.path);if(zF(u)){let h=c(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=c(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=UF(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(c){return s.text(`failed to read artifact path: ${c.message}`,500)}return q(s,l,_e)}return q(s,l,_e)}),e.get("/api/runs",s=>q(s,Cn(t.dal,{limit:Zu(s,"limit")??100}),d1)),e.get("/api/runs/:id",s=>{let i=zr(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,c1)}),e.get("/api/runs/:id/where",s=>{let i=$n(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Co(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=$o(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Mo(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let d=(await s.req.parseBody().catch(()=>({}))).outcome;typeof d=="string"&&d.length>0&&(i=d)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(Fa(t.daemon),q(s,o,CT)):q(s,o,CT,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let c=await s.req.json();typeof c.input=="string"&&(o=c.input),c.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let c=await s.req.parseBody().catch(()=>({}));typeof c.input=="string"&&(o=c.input),(c.done==="true"||c.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=t.dal.resumeInteractive(i,o,a);return!d.resumed&&d.reason==="not_found"?s.notFound():d.resumed?(Fa(t.daemon),s.json({resumed:!0,session_status:d.session.status})):s.json({resumed:!1,reason:d.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>LT(s,t.dal,i=>q(s,i,f1))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=bg(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():PT(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>LT(s,t.dal,i=>{let o=cT(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>q(s,Sg(t.dal,{type:s.req.query("type")}),m1)),e.get("/api/external-signals",s=>q(s,kg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),p1)),e.get("/api/attentions",s=>q(s,xr(t.dal,{unacked:s.req.query("unacked")==="true"}),_1)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():q(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let d=Oo(t.dal,l);return q(s,d,c=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],c.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Ft(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=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"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=Ft(t.dal,i);if(d===null)return s.notFound();let c=xr(t.dal).find(m=>m.id===i);if(c===void 0)return s.notFound();if(c.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Fa(t.daemon);let p=xr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(c.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:c.kind},400);if(c.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(d.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(d.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:d.step_id},400);let f=t.dal.acknowledgeAttention(i);return Fa(t.daemon),s.json({ok:!0,attention_id:i,step_id:d.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=wg(t.dal,{status:o,pr_url:i});return q(s,a,h1)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=Tg(t.dal,i);return o===null?s.notFound():q(s,o,g1)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),$T)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Us(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),$T)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Us(s.req.param("team_name"));try{let o=await ug(t.dal,i,s.req.param("alias"));return q(s,o,a=>MT("compacted",a.row))}catch(o){if(o instanceof Fs)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Us(s.req.param("team_name")),o=await Nc(t.dal,i,s.req.param("alias"));return q(s,o,a=>MT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,r,DT)),e.post("/api/intake/scan",async s=>(r=await zo(t.dal),q(s,r,DT))),e.get("/api/stats/run-throughput",s=>q(s,Ag(t.dal),y1)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,E1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},_e);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},_e)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=$c(t.dal,i),l=Mc(t.dal,{project_id:i});return s.html(Pe(`Metrics \u2014 ${o.name}`,w1(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Zu(s,"since_days");return s.json($c(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Zu(s,"since_days");return s.json(Mc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function LT(t,e,r){let n=Cc(e,ie(t,"id"),ie(t,"step_id"));return n===null?t.notFound():r(n)}function Fa(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,r,n=200){return PT(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 PT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function KF(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Pa(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(Pa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Pa(`${r}/index.html`))return r;let n=HF(WF(JF(import.meta.url)),"webui-dist");return Pa(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!BF(t))return t;let e=XF(process.cwd(),t);return e.length===0?".":e}function VF(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function YF(t){switch(qF(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 zF(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Vn(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 ZF(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 OT(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 e1(t){if(t!=null)return typeof t=="string"&&FT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function t1(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 r1(t){return`<h1>Status</h1><div class="grid">
|
|
2269
2269
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
2270
2270
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
2271
2271
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -2317,9 +2317,9 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2317
2317
|
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,S1).length>0))continue;let i=n[0].team_id,o=t.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,BT)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:BT,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 HT(t){for(let e of I1)try{e(t)}catch{}}var S1,BT,I1,XT=T(()=>{"use strict";S1="request_changes",BT="reviewer_rejection_rate_high";I1=[k1]});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=qe({path:ne()});try{return await e(r)}finally{r.close()}}function Q(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let d=t[a+1];if(d===void 0||d.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=d,a+=1}return{positionals:i,flags:o}}function P(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function V(t,e){return t.flags[e]===!0}function re(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
2318
2318
|
`)}function N(t,e){return t.stderr.write(`error: ${e}
|
|
2319
2319
|
`),1}function Ke(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
2320
|
-
`),2}var $e=T(()=>{"use strict";dt();ze()});import{hostname as KT}from"node:os";function VT(t,e,r){let n=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=qe({path:ne()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&He(a.holder_pid)),pollMs:N1,settleMs:A1,maxHoldMs:
|
|
2320
|
+
`),2}var $e=T(()=>{"use strict";dt();ze()});import{hostname as KT}from"node:os";function VT(t,e,r){let n=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=qe({path:ne()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&He(a.holder_pid)),pollMs:N1,settleMs:A1,maxHoldMs:gn(r),onHold:()=>M({event:"delivery_hold_open_started",receiver:n}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&M({event:"delivery_hold_open_released",receiver:n,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Yn(t){let e=t.finalize??"auto";await qa(t.io,t.env);let r=await O(t.io,h=>{if(t.onlyMailboxId!==void 0){let _=h.getMailboxMessage(t.onlyMailboxId);return _!==null&&_.message_type==="request"&&YT(_,t.sender)&&_.receiver_teamfile===t.receiver.teamfile&&_.receiver_alias===t.receiver.alias&&_.delivered_at===null&&_.delivering_at===null?[_]:[]}return h.listEnqueuedRequestMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)}),n=r.length===0?[]:await O(t.io,h=>h.claimMailForDelivery(r.map(_=>_.id),new Date().toISOString(),process.pid,KT())),s=t.newMessage===void 0?Xr(n):null,i=s===null?null:We(s.id);if(i!==null)try{await O(t.io,h=>{h.setCurrentlyHandlingMessage(t.receiver.teamfile,t.receiver.alias,i)})}catch(h){t.io.stderr.write(`warning: failed to set mailbox causal pointer: ${h instanceof Error?h.message:String(h)}
|
|
2321
2321
|
`)}let o=x1(n,t.newMessage,{newMessageFrom:t.newMessageFrom??ZT(t.sender)});if(o.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let a=!1,l=ue(),d=0,c=0,u=0,f={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:o,permissionMode:t.permissionMode,env:t.env,onDelta:h=>{a=!0,l&&(d+=1,u=Buffer.byteLength(h,"utf8"),c+=u),t.onDelta?.(h)},onProgress:h=>t.onProgress?.(h)};t.receiver.model!==void 0&&(f.model=t.receiver.model),t.receiver.effort!==void 0&&(f.effort=t.receiver.effort),f.alias=t.receiver.alias,f.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(f.timeoutMs=t.idleTimeoutMs),f.holdOpen=VT(t.io,t.receiver,t.env);let m;try{cr("mailbox_delivery_attempt_started",n,{batch_ids:n.map(h=>h.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId}),await t.onPromptBuilt?.(o),m=await jt(f)}catch(h){let _=h instanceof Error?h.message:String(h);if(cr("mailbox_delivery_attempt_failed",n,{error_message:_}),e==="auto"&&await GT(t.io,n,"provider-or-preflight-error",_),e==="caller")return{status:"error",receipt:_,prompt:o,queued:n,deliveredIds:[],wroteDelta:a,error:_};throw h}finally{if(i!==null)try{await O(t.io,h=>{h.clearCurrentlyHandlingMessage(t.receiver.teamfile,t.receiver.alias,i)})}catch(h){t.io.stderr.write(`warning: failed to clear mailbox causal pointer: ${h instanceof Error?h.message:String(h)}
|
|
2322
|
-
`)}}if(l&&
|
|
2322
|
+
`)}}if(l&&je(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:a,blockCount:d,streamedBytes:c,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:u,tailPreview:m.text.slice(-200)})),m.status==="stalled")return cr("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:m.stalledAfterMs,duration_ms:m.durationMs}),e==="auto"&&await GT(t.io,n,"provider-stalled"),{status:"stalled",receipt:m.text,prompt:o,queued:n,deliveredIds:[],wroteDelta:a,durationMs:m.durationMs,stalledAfterMs:m.stalledAfterMs};let p=n.map(h=>h.id);return e==="auto"&&await Ua(t.io,n,m.text),{status:"ok",receipt:m.text,prompt:o,queued:n,deliveredIds:p,wroteDelta:a,durationMs:m.durationMs}}async function Wa(t){await qa(t.io,t.env);let e=await O(t.io,i=>{if(t.onlyMailboxId!==void 0){let o=i.getMailboxMessage(t.onlyMailboxId);return o!==null&&o.message_type==="response"&&YT(o,t.sender)&&o.receiver_teamfile===t.receiver.teamfile&&o.receiver_alias===t.receiver.alias&&o.delivered_at===null&&o.delivering_at===null?[o]:[]}return i.listEnqueuedResponseMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)}),r=e.length===0?[]:await O(t.io,i=>i.claimMailForDelivery(e.map(o=>o.id),new Date().toISOString(),process.pid,KT())),n=R1(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,alias:t.receiver.alias,isLead:t.receiver.isLead};t.receiver.model!==void 0&&(s.model=t.receiver.model),t.receiver.effort!==void 0&&(s.effort=t.receiver.effort),t.idleTimeoutMs!==void 0&&(s.timeoutMs=t.idleTimeoutMs),s.holdOpen=VT(t.io,t.receiver,t.env),cr("mailbox_delivery_attempt_started",r,{batch_ids:r.map(i=>i.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId});try{let i=await jt(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
|
|
2323
2323
|
${i.text}`;return cr("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.stalledAfterMs,duration_ms:i.durationMs}),await Ua(t.io,r,a),{status:"stalled",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),durationMs:i.durationMs,stalledAfterMs:i.stalledAfterMs}}let o="response delivered; recipient output discarded";return await Ua(t.io,r,o),{status:"ok",receipt:o,prompt:n,queued:r,deliveredIds:r.map(a=>a.id),durationMs:i.durationMs}}catch(i){let o=i instanceof Error?i.message:String(i),a=`response delivery error: ${o}`;return cr("mailbox_delivery_attempt_failed",r,{error_message:o}),await Ua(t.io,r,a),{status:"error",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),error:o}}}function x1(t,e,r={}){let n=t.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${zT(s)}, sent ${s.created_at}) ---`,s.payload].join(`
|
|
2324
2324
|
`));return e!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,e].join(`
|
|
2325
2325
|
`)),n.join(`
|
|
@@ -2330,18 +2330,18 @@ ${i.text}`;return cr("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.st
|
|
|
2330
2330
|
`)}function zT(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":ZT({teamfile:t.sender_teamfile,alias:t.sender_alias})}function ZT(t){return`${t.teamfile}:${t.alias}`}async function Ua(t,e,r){if(e.length!==0)try{await O(t,n=>{n.markRelayRequestDelivered(e,r,new Date().toISOString())})}catch(n){let s=n instanceof Error?n.message:String(n);cr("mailbox_delivery_finalize_failed",e,{error_message:s}),t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${s}
|
|
2331
2331
|
`)}}async function GT(t,e,r,n){if(e.length!==0)try{let s=await O(t,i=>e.map(o=>({row:o,cleared:i.reclaimMailboxDeliveryIfUnchanged(o)!==null})));for(let i of s)cr(i.cleared?"mailbox_delivery_cleared":"mailbox_delivery_clear_skipped",[i.row],{transition:i.cleared?"delivering->pending":"delivering->delivering",reason:r,...n===void 0?{}:{error_message:n}})}catch(s){let i=s instanceof Error?s.message:String(s);cr("mailbox_delivery_clear_failed",e,{reason:r,error_message:i,...n===void 0?{}:{causing_error:n}}),t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${i}
|
|
2332
2332
|
`)}}async function qa(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-ef(e)).toISOString())})}catch{}}function ef(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return JT;let r=Number(e);return!Number.isFinite(r)||r<=0?JT:r}function cr(t,e,r={}){let n=new Date().toISOString();for(let s of e)M({event:t,event_at:n,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...r})}var JT,N1,A1,Ba=T(()=>{"use strict";Pt();Di();bs();pe();$e();dt();ze();Jr();Lt();JT=60*60*1e3,N1=2e3,A1=5e3});import{basename as L1}from"node:path";function tv(t,e){let r=new Date(e.now.getTime()-qt()).toISOString(),n=sv(t,r).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=M1(e.sender,n),i=D1(e.sender,n);i!==null&&i.teamfile===e.root&&!ev(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(m=>ev(m,o)),d=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,c=d!==null&&e.now.getTime()-d<O1,u=tf(e.sender,n).length;return{stop:l.length>=1&&c&&u>=C1,chain:j1(a)}}function rv(t,e){let r=new Date(e.now.getTime()-qt()).toISOString(),n=sv(t,r),s=tf(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function qt(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return QT;let r=Number(e);return!Number.isFinite(r)||r<=0?QT:r}function nv(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function $1(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function sv(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map($1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function M1(t,e,r={}){let n=new Map;for(let a of e)n.set(on(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([on(t)]);for(let a=0;a<64;a+=1){let l=n.get(on(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let d={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let c=on(l.sender);if(o.has(c))break;s.unshift(d),o.add(c),i=l.sender}return s}function tf(t,e){let r=on(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let d=on(l.sender),c=on(l.receiver);d!==a&&c!==a||(i.includes(l)||i.push(l),n.has(d)||(n.add(d),s.push(d)),n.has(c)||(n.add(c),s.push(c)))}}return i.sort((o,a)=>o.at-a.at)}function D1(t,e){let r=tf(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ev(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function on(t){return`${t.teamfile}\0${t.alias}`}function j1(t){return t.map(e=>`${L1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var O1,C1,QT,oi=T(()=>{"use strict";O1=6e4,C1=2,QT=8*60*60*1e3});function iv(t){if(t.length===0||!t.startsWith("---"))throw new Bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2333
|
-
`);if(e[0]!=="---")throw new Bt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Bt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let d=l[1],c=l[2].trim();if(!P1.has(d))throw new Bt(`unknown frontmatter key "${d}" \u2014 allowed keys: ${Ha.join(", ")}`);r[d]=c}if(n===-1)throw new Bt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Ha)if(r[o]===void 0)throw new Bt(`missing required frontmatter key "${o}" \u2014 required: ${Ha.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var Ha,P1,Bt,ov=T(()=>{"use strict";Ha=["title","description","members"],P1=new Set(Ha),Bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as F1,writeFileSync as v7,renameSync as b7,existsSync as lv}from"node:fs";import{basename as U1,resolve as
|
|
2333
|
+
`);if(e[0]!=="---")throw new Bt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Bt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let d=l[1],c=l[2].trim();if(!P1.has(d))throw new Bt(`unknown frontmatter key "${d}" \u2014 allowed keys: ${Ha.join(", ")}`);r[d]=c}if(n===-1)throw new Bt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Ha)if(r[o]===void 0)throw new Bt(`missing required frontmatter key "${o}" \u2014 required: ${Ha.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var Ha,P1,Bt,ov=T(()=>{"use strict";Ha=["title","description","members"],P1=new Set(Ha),Bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as F1,writeFileSync as v7,renameSync as b7,existsSync as lv}from"node:fs";import{basename as U1,resolve as zn,dirname as rf}from"node:path";function q1(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];e[s]=i}return e}function B1(t){return/^\s*_MEMBER_\s+\S/.test(t)}function H1(t){return/^\s*_SESSION_\s+\S/.test(t)}function X1(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Xa(t){let e=U1(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function ot(t){let e=F1(t,"utf-8"),r=rf(zn(t)),n=sf(e,Xa(t),{baseDir:r,sourcePath:zn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=zn(r,s.sessiondir));return n}function sf(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2334
2334
|
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=iv(i)}catch(l){if(l instanceof Bt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
2335
2335
|
`);for(let l=0;l<a.length;l++){let d=a[l],c=l+1;if(H1(d))throw new Error(`line ${c}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(X1(d)||!B1(d))continue;let u=q1(d);for(let p of Object.keys(u))if(!av.includes(p))throw new Error(`line ${c}: unknown key "${p}" on _MEMBER_ line: ${d.trim()}
|
|
2336
|
-
allowed keys: ${av.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${c}: member line missing provider (or teamfile): ${d.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function of(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===nf.toLowerCase());n.length>1&&r.push({field:nf,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?
|
|
2336
|
+
allowed keys: ${av.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${c}: member line missing provider (or teamfile): ${d.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function of(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===nf.toLowerCase());n.length>1&&r.push({field:nf,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?zn(e,i.teamfile):zn(i.teamfile);if(!lv(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=ot(a),d=Ht(l);d?d.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else W1.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Ht(t){return t.members.find(e=>e.alias.toLowerCase()===nf.toLowerCase())}function af(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=zn(e,t.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!lv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=ot(i),l=Ht(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return af(l,rf(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||rf(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function Ja(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var nf,W1,av,ur=T(()=>{"use strict";ov();nf="Lead",W1=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"]);av=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as J1}from"node:crypto";import{existsSync as df,readFileSync as cv,realpathSync as G1}from"node:fs";import{basename as dv,dirname as K1,resolve as uv}from"node:path";function Se(t,e){let r=uv(t);if(df(r))return G1(r);if(e!==void 0){let n=Y1(t,r,e);if(n!==null)return n}return r}function Ka(t,e){let r=K1(e),n=sf(t,Xa(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=uv(r,s.sessiondir));return n}function Ve(t,e,r=n=>{process.stderr.write(`warning: ${n}
|
|
2337
2337
|
`)}){let n=Se(t,V1(e)?e:void 0);if(df(n)){let i=cv(n,"utf8"),o=Ka(i,n);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(n)===null&&z1(o)&&Q1(e,n,o,i,r),o}let s=e?.getRootTeam(n)??null;throw s!==null?new Error(`teamfile missing on disk: ${n} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function V1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function Y1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=dv(t),i=Xa(t),o=r.listRootTeams().filter(l=>(dv(l.teamfile_path)===s||l.name===i)&&df(l.teamfile_path));if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function z1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=lf)}function cf(t,e,r){let n=Se(e),s=r.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=lf);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=Se(i.teamfile_path),o===n)continue;a=cv(o,"utf8")}catch(d){if(Z1(d))continue;throw d}let l=Ka(a,o);for(let d of s){let c=l.members.find(u=>u.teamfile===void 0&&u.session===d.session&&(u.session?.length??0)>=lf);if(c!==void 0)throw new Ga(`sessionid ownership conflict: ${n}:${d.alias} and ${o}:${c.alias} both use sessionid "${d.session}"`)}}}function Z1(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function Q1(t,e,r,n,s){try{cf(t,e,r)}catch(o){if(!(o instanceof Ga))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:J1("sha256").update(n).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var lf,Ga,fr=T(()=>{"use strict";ur();lf=5,Ga=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as eU}from"node:fs";import{dirname as fv}from"node:path";function nU(t){return tU.test(t)||rU.test(t)}function mv(t){return Va.test(t)}function an(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Va.test(n)?null:{teamfile:r,alias:n}}function Ne(t,e,r){if(!t.endsWith(".lmctl"))throw new ke(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!mv(e))throw new ke(`lmctl: "${e}" is not a valid alias (must match ${Va.source}).`);let n=Se(t,r);if(r===void 0&&!eU(n))throw new ke(`lmctl: teamfile not found: ${t}`);let s;try{s=Ve(n,r)}catch(o){throw new ke(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ke(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=Ja(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ke(`lmctl: alias "${e}" not found in ${t}.
|
|
2338
2338
|
Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=af(i,fv(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ke(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
|
|
2339
|
-
Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??fv(n),isLead:Ht(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function
|
|
2339
|
+
Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??fv(n),isLead:Ht(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function Dr(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 o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=an(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?mv(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Va.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
2340
2340
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(nU(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.
|
|
2341
2341
|
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}".
|
|
2342
2342
|
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 o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${t.name}: a target is required.
|
|
2343
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ke,tU,rU,Va,at=T(()=>{"use strict";ur();fr();ke=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},tU=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,rU=/^ses_[A-Za-z0-9_-]+$/,Va=/^[A-Za-z][A-Za-z0-9_-]*$/});function Ya(t){return iU.has(t)}function ff(){return uf===null&&(uf=Ot(Dt())),uf}function mf(t,e,r={}){if(!Ya(t))return null;try{let n=ff().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?Zi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?sU[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...pv[t]??[]]}catch{return null}}function za(t,e,r={}){let n=mf(t,e,r);return n===null?null:n.join(" ")}function
|
|
2344
|
-
${t.receipt}`:`relay delivery error: ${t.error}`}function pU(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-ef(e)).toISOString())}function _U(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var gv,wv=T(()=>{"use strict";Lt();Ba();oi();at();Za();gv=10});function ai(){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 gU(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(Tv);hU.has(s)&&r.add(s)}}return r}function vv(t){let e=t.intervalMs??ai(),r=t.runOnceFn??nn,n=new Set(t.features??gU()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),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,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,d=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(d=(t.startRollupUpdaterFn??WT)(t.dal));let c=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>c(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=bv(t.dal,n,t.monitorSessionActivityFn??Ac,e,s).finally(()=>{l=null})),l.finally(()=>u(xc(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=yU(t.dal,r,t.collectSessionSizesFn??cg,t.scanIntakeFn??zo,t.monitorSessionActivityFn??Ac,t.mailboxRelayFn??Ev,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),d?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;c(m),n.has("session-monitor")&&u(m)}return f}async function yU(t,e,r,n,s,i,o,a,l,d){d.in_flight=!0,d.last_started_at=new Date().toISOString(),d.last_error=null;let c=[],u=0,f=0,m=[],p=null,h=EU();try{if(l.has("durable-memory-policies")&&gw({dal:t}),l.has("drift-detectors")&&HT({dal:t}),l.has("intake")&&(m=await n(t)),l.has("job-worker"))for(;;){let _=await e({dal:t,worker_id:o,lease_ms:6e5});if(_===null)break;c.push(_)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let _=await r(t);u=_.recorded,f=_.failed}l.has("session-monitor")&&(p=await bv(t,l,s,a,d))}catch(_){d.last_error=_ instanceof Error?_.message:String(_);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:d.last_error})})}catch{}}finally{d.in_flight=!1,d.cycles+=1,d.last_jobs_processed=c.length,d.last_session_sizes_recorded=u,d.last_session_size_failures=f,d.last_intake_scanned=m.reduce((_,g)=>_+g.scanned,0),d.last_intake_new_jobs=m.reduce((_,g)=>_+g.new_jobs,0),d.last_intake_failures=m.filter(_=>_.error!==void 0).length,d.last_session_hung_detected=p?.hung_detected??0,d.last_mailbox_relay_scanned=h.scanned,d.last_mailbox_relay_delivered=h.delivered,d.last_mailbox_relay_errors=h.errors,d.jobs_processed+=c.length,d.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function EU(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function bv(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=xc(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var Tv,hU,pf=T(()=>{"use strict";Qc();Ea();Ru();So();qT();XT();Rc();wv();Tv=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],hU=new Set(Tv)});function Sv(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 kv=T(()=>{"use strict"});import{mkdirSync as wU,readFileSync as TU,readdirSync as vU,statSync as bU,writeFileSync as SU}from"node:fs";import{dirname as kU,join as Nv,sep as Iv}from"node:path";function Qa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Av:return IU(t,s.input);case xv:return NU(t,s.input);case Rv:return AU(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:gf,GetObjectCommand:hf,PutObjectCommand:_f}}}function IU(t,e){let r=Lv(t,e.Key);return wU(kU(r),{recursive:!0}),SU(r,e.Body),{}}function NU(t,e){let r=Lv(t,e.Key),n;try{n=TU(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function AU(t,e){let r=e.Prefix??"";Ov(r);let s=xU(t).sort((c,u)=>c.key<u.key?-1:c.key>u.key?1:0).filter(c=>c.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(c=>c.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let d={Contents:a.map(c=>({Key:c.key,LastModified:c.lastModified})),IsTruncated:l};return l&&(d.NextContinuationToken=a[a.length-1].key),d}function Lv(t,e){return Ov(e),Nv(t,e)}function Ov(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function xU(t){let e=[],r=(n,s)=>{let i;try{i=vU(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=Nv(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let d=Iv==="/"?a:a.split(Iv).join("/");e.push({key:d,lastModified:bU(l).mtime})}}};return r(t,""),e}var Av,xv,Rv,_f,hf,gf,yf=T(()=>{"use strict";Av="localfs-put",xv="localfs-get",Rv="localfs-list",_f=class{input;_localfsTag=Av;constructor(e){this.input=e}},hf=class{input;_localfsTag=xv;constructor(e){this.input=e}},gf=class{input;_localfsTag=Rv;constructor(e){this.input=e}}});function Cv(){return{put:0,get:0,list:0}}function Ef(t,e=RU){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function wf(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var RU,el,Tf=T(()=>{"use strict";RU={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};el=class{counts=Cv();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Cv(),e}estimateCostUsd(e){return Ef(this.counts,e)}}});function $v(t){let e=t.now??Date.now,r=t.timers??LU,n=null,s=null;async function i(){let l=e(),d=wf(l),c=t.meter.drain();(c.put>0||c.get>0||c.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:d,put:c.put,get:c.get,list:c.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,d),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(d,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(d)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Ef(m);if(n!==d&&p>=t.ceilingUsd){n=d,t.log?.(`[usage] quota exceeded period=${d} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:d,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===wf(e())}}}var LU,Mv=T(()=>{"use strict";Tf();LU={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var vf=T(()=>{"use strict";Sa();Ia();Ia()});function OU(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 i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}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 CU(t){return t.reply_to!==void 0&&t.response!==void 0}function $U(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Dv(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 tl,li,jv=T(()=>{"use strict";vf();tl=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},li=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 tl("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=dr(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let d=r?.abortSignal,c;if(d!==void 0){if(d.aborted){l(Dv(d));return}c=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Dv(d)))},d.addEventListener("abort",c,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...c!==void 0?{abortListener:c}:{},...d!==void 0?{abortSignal:d}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{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(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new tl;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=OU(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(CU(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??$U(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let d=l instanceof Error?l.message:String(l),c=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:c,message:d}}}let a={message_id:dr(this.now(),this.random),reply_to:n.message_id,response:i};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 bf(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 Pv=T(()=>{"use strict"});function Sf(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 Fv=T(()=>{"use strict"});function If(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===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(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 kf,Uv=T(()=>{"use strict";kf="daemon:events"});function qv(t){return{kind:"prompt",prompt_id:t.prompt_id??dr(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Nf(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 Wv,Af=T(()=>{"use strict";vf();Wv="prompt:root"});function di(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Hv(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function MU(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Hv(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Bv(t,e=60){if(typeof t!="string"||t==="")return!0;let r=MU(t);return r===null?!0:Date.now()/1e3>=r-e}function Hv(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 xf=T(()=>{"use strict"});async function rl(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":DU},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 d=JSON.parse(s);l=d.message??d.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var DU,Rf=T(()=>{"use strict";DU="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Xv,mkdirSync as Jv,readFileSync as Gv,writeFileSync as Kv}from"node:fs";import{homedir as Vv}from"node:os";import{dirname as Yv,join as zv}from"node:path";function ci(){return process.env.LMCTL_DEVICE_AUTH_PATH??zv(Vv(),".lmctl","device-auth.json")}function Zv(){return process.env.LMCTL_TOKEN_PATH??zv(Vv(),".lmctl","cli-tokens.json")}function Lf(t=ci()){try{let e=JSON.parse(Gv(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 Qv(t,e=ci()){Jv(Yv(e),{recursive:!0,mode:448}),Kv(e,JSON.stringify(t,null,2));try{Xv(e,384)}catch{}}function Of(t,e=Zv()){let r={};try{r=JSON.parse(Gv(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};Jv(Yv(e),{recursive:!0,mode:448}),Kv(e,JSON.stringify(s,null,2));try{Xv(e,384)}catch{}}async function eb(t){let e=t.deviceAuthPath??ci(),r=Lf(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await rl({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Of({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Zv()),{idToken:n.idToken,userId:r.userId}}var Cf=T(()=>{"use strict";Rf()});import{existsSync as jU,realpathSync as PU}from"node:fs";import{dirname as FU}from"node:path";function $f(t){UU(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function UU(t){let e=t.payload.root_teamfile;try{e=PU(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return Qn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return Qn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let r=qU(e);if("error"in r)return Qn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Rt(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:JU(t.env??process.env)});if(!n.acquired){let i=XU(r.alias,n.current);return Qn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=yr(i=>t.store.heartbeatAgentInflight(n.lease,n.leaseId,i),{intervalMs:_n(t.env??process.env)});try{let o=await(t.chat??jt)({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=o.status==="stalled",l=!a&&o.text.trim()==="",d=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,c=a||l?"error":"ok";return c==="ok"?await BU(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:o.text,status:c,error_detail:null,log:t.log}):Qn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:d??"provider failed",reason:a?"stalled":"empty_response"}),{status:c,response:c==="error"?null:o.text,error_detail:d}}catch(i){let o=i instanceof Error?i.message:String(i);return Qn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(n.lease,n.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function Qn(t){M({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:WU(t.message)})}function WU(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function qU(t){if(!jU(t))return{error:`prompt root missing/unreadable: ${t}`};let e=ot(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Ht(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??FU(t)}}async function BU(t,e){let r=nb(e.message),n=e.response===null?null:nb(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,origin:"unknown",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 nb(t){return t.length<=tb?{text:t,truncated:!1}:{text:t.slice(0,tb),truncated:!0}}function HU(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function XU(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:HU(t,e)}function JU(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return rb;let r=Number(e);return!Number.isFinite(r)||r<=0?rb:r}var tb,rb,sb=T(()=>{"use strict";Pt();ur();pe();Lt();tb=256*1024,rb=30*60*1e3});import{chmodSync as cb,existsSync as GU,mkdirSync as ub,readFileSync as ol,writeFileSync as fb}from"node:fs";import{dirname as Mf,resolve as nl,join as mb}from"node:path";import{fileURLToPath as KU}from"node:url";import{homedir as pb}from"node:os";import{CognitoIdentityClient as VU,GetIdCommand as YU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as ib}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as zU,ListObjectsV2Command as ZU,PutObjectCommand as QU,S3Client as ob}from"@aws-sdk/client-s3";function fi(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:sW(t.selfUrl),n={},s;for(let S of r)if(GU(S)){n=nW(S),s=S;break}let i=(...S)=>{for(let x of S)if(typeof x=="string"&&x!=="")return x},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??eW,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??tW,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??rW,d=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",c=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??al,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=il(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=il(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=il(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=il(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(e.LMCTL_MAILBOX_KEY),w=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:c,region:d,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...w!==void 0?{tokenPath:w}:{}},f}function nW(t){try{let e=ol(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function sW(t){let e=Mf(KU(t??import.meta.url));return[nl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),nl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),nl(e,"..","..","..","infra","terraform","terraform.tfstate"),nl(e,"..","..","infra","terraform","terraform.tfstate")]}function il(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function iW(t){let e=oW(t.intervalMs)??_b,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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let d=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let f of u){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()}),i=Math.max(i,f.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},c=setInterval(()=>{d()},e);return typeof c.unref=="function"&&c.unref(),{pollNow:d,stop(){a=!0,clearInterval(c)}}}function oW(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function hb(t){let e=t.tokenPath??mb(pb(),".lmctl","cli-tokens.json"),r=lb(t.tokenPath);if(Bv(r.cognito?.idToken)&&Lf()!==null)try{await eb({region:t.region,clientId:t.cognitoClientId??al,cliTokensPath:e}),r=lb(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Y=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Y}`)}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}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await db({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=ib({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ob({region:t.region,credentials:a}),d={ListObjectsV2Command:ZU,GetObjectCommand:zU,PutObjectCommand:QU},c=di(n),u=c??i,f=t.deviceId,m=Hn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Y=!1,B=0;for(;!Y&&B<2;){B+=1;try{let k=va(m,"web"),I=0,C;do{let W=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let U of W.Contents??[]){let j=ba(U.Key??"",m,"web");j!==void 0&&j>I&&(I=j)}C=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(C!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${u}`),Y=!0}catch(k){let I=k instanceof Error?k.message:String(k);if(o&&B===1&&dW(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),lW(e),o=!1,i=await db({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=ib({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ob({region:t.region,credentials:a}),m=Hn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let _=null,g=t.terminalSessionManager,y=t.persistentSessionManager,E=t.promptTriggerStore,w=new el,S=new sn({bucket:t.mailboxBucket,identityId:i,...c!==null?{userId:c}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:d,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(g!==void 0&&bf(A.payload)){g.onInbound(A.payload);return}if(y!==void 0&&Sf(A.payload)){await y.onInbound(A.payload);return}if(!If(A.payload)){if(E!==void 0&&Nf(A.payload)){$f({store:E,payload:A.payload,log:t.log});return}_!==null&&await _.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,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}:{}});_=new li({client:S,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async A=>S.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>S.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>S.putMessage({conversation_id:kf,payload:A});S.start();let J=t.chatLogTailStore===void 0?void 0:iW({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??_b,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let F=t.deviceId??i,$=`${u}/usage/`,R;return R=t.usageStore===void 0?void 0:$v({meter:w,store:t.usageStore,userId:u,deviceId:F,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Y,ceilingUsd:B})=>{t.log?.(`[usage] month ${A} cost $${Y.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),S.stop().catch(()=>{}),R?.stop()},publishOwnRollup:async(A,Y)=>{await l.send(new d.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${$}${F}-${A}.json`,Body:JSON.stringify({...Y,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Y={put:0,get:0,list:0},B;do{let k=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let I of k.Contents??[]){let C=I.Key??"";if(C.endsWith(`-${A}.json`))try{let W=await l.send(new d.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(W.Body===void 0)continue;let U=JSON.parse(await W.Body.transformToString("utf-8"));Y.put+=U.put??0,Y.get+=U.get??0,Y.list+=U.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Y},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:S,fetchClient:_,publishDaemonEvent:x,async stop(){J?.stop(),R!==void 0&&(await R.flushNow().catch(()=>{}),R.stop()),await _.stop().catch(()=>{}),await S.stop().catch(()=>{})}}}async function gb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Qa(t.rootDir),r=Hn({identityId:ui,userId:ui,deviceId:ab}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new sn({bucket:"local",identityId:ui,userId:ui,deviceId:ab,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async d=>{if(s!==void 0&&bf(d.payload)){s.onInbound(d.payload);return}if(i!==void 0&&Sf(d.payload)){await i.onInbound(d.payload);return}if(!If(d.payload)){if(o!==void 0&&Nf(d.payload)){$f({store:o,payload:d.payload,log:t.log});return}n!==null&&await n.handleIncoming(d.payload,d)}},pollIntervalMs:t.pollIntervalMs??sl,readIntervalMs:t.readIntervalMs??sl,heartbeatIdleMs:t.heartbeatIdleMs??sl,backoffReadIntervalMs:t.backoffReadIntervalMs??sl});n=new li({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async d=>a.putMessage({conversation_id:`terminal:${d.session_id}`,payload:d})),i!==void 0&&i.setPublish(async d=>a.putMessage({conversation_id:`provider:${d.session_id}`,payload:d}));let l=d=>a.putMessage({conversation_id:kf,payload:d});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ui,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function lb(t){let e=t??mb(pb(),".lmctl","cli-tokens.json");try{let r=ol(e,"utf8");return JSON.parse(r)}catch{return{}}}function aW(t,e){if(e===void 0||e==="")return;let r={};try{let s=ol(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};ub(Mf(t),{recursive:!0,mode:448}),fb(t,JSON.stringify(n,null,2));try{cb(t,384)}catch{}}function lW(t){let e={};try{let n=ol(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,ub(Mf(t),{recursive:!0,mode:448}),fb(t,JSON.stringify(r,null,2));try{cb(t,384)}catch{}}async function db(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new VU({region:t.region}).send(new YU({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{aW(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 dW(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 _b,sl,al,eW,tW,rW,ui,ab,Df=T(()=>{"use strict";Na();yf();Tf();Mv();jv();Pv();Fv();Uv();Af();Sa();xf();Cf();sb();_b=3e3,sl=1e3,al="79u5jhkk46qofog661c9i0bdcs",eW="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",tW="us-east-1_4iUdFggDn",rW="lmctl-next-preview-mailbox-254332045686";ui="local",ab="local"});import{spawn as Uf}from"node:child_process";import{createInterface as yb}from"node:readline";var jf,Pf,Ff,Eb,wb=T(()=>{"use strict";to();pe();xs();jf=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=Uf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=yb({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 i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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 i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,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,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
|
|
2343
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ke,tU,rU,Va,at=T(()=>{"use strict";ur();fr();ke=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},tU=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,rU=/^ses_[A-Za-z0-9_-]+$/,Va=/^[A-Za-z][A-Za-z0-9_-]*$/});function Ya(t){return iU.has(t)}function ff(){return uf===null&&(uf=Ot(Dt())),uf}function mf(t,e,r={}){if(!Ya(t))return null;try{let n=ff().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?Zi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?sU[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...pv[t]??[]]}catch{return null}}function za(t,e,r={}){let n=mf(t,e,r);return n===null?null:n.join(" ")}function Fe(t,e){return ff().getSession(t,e)}async function Zn(t){return(await ff().resolveSessions(t)).map(r=>r.provider.name)}var pv,sU,iU,_v,uf,Xt=T(()=>{"use strict";Pt();hd();pv={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},sU={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t]},iU=new Set(Object.keys(pv)),_v=/^[\w.:-]+$/;uf=null});function oU(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return hv;let r=Number(e);return!Number.isFinite(r)||r<=0?hv:r}async function aU(t,e,r){try{let n=Ne(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let d=await Zn(s);if(d.length!==1)return null;i=d[0]}let o=await Fe(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function Qn(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??oU(),o=await aU(t,r,n),a=o!==null&&o>=i;return a&&M({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var hv,Za=T(()=>{"use strict";pe();Xt();at();hv=36e5});function lU(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return gv;let r=Number(e);return!Number.isFinite(r)||r<=0?gv:Math.max(1,Math.trunc(r))}async function Ev(t){let e=t.env??process.env,r=t.maxBatches??lU(e),n=_U(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};pU(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(yv(l)));if(o===void 0)break;i.add(yv(o)),s.scanned+=1;let a=await dU(t.dal,n,e,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function yv(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function dU(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=_t(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await Qn(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null,l=null;try{let d=Ne(n.receiver_teamfile,n.receiver_alias,t),c=Rt(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:qt(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a={row:c.lease,leaseId:c.leaseId},l=Er(f=>t.heartbeatAgentInflight(a.row,a.leaseId,f),{intervalMs:hn(r)}),n.message_type==="response"){let f=await Wa({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},io:e,permissionMode:"yolo",env:r});return fU(f)}let u=await Yn({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return uU(t,u)}catch(d){return cU(t,n,`relay delivery error: ${d instanceof Error?d.message:String(d)}`)}finally{if(l!==null&&clearInterval(l),a!==null)try{t.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function cU(t,e,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=e.message_type==="response"?t.listEnqueuedResponseMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias):t.listEnqueuedRequestMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias),i=e.message_type==="response"?t.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):t.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function uU(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=mU(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function fU(t){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:t.deliveredIds.length,errors:t.status==="ok"?0:1}}function mU(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
|
|
2344
|
+
${t.receipt}`:`relay delivery error: ${t.error}`}function pU(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-ef(e)).toISOString())}function _U(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var gv,wv=T(()=>{"use strict";Lt();Ba();oi();at();Za();gv=10});function ai(){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 gU(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(Tv);hU.has(s)&&r.add(s)}}return r}function vv(t){let e=t.intervalMs??ai(),r=t.runOnceFn??nn,n=new Set(t.features??gU()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),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,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,d=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(d=(t.startRollupUpdaterFn??WT)(t.dal));let c=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>c(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=bv(t.dal,n,t.monitorSessionActivityFn??Ac,e,s).finally(()=>{l=null})),l.finally(()=>u(xc(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=yU(t.dal,r,t.collectSessionSizesFn??cg,t.scanIntakeFn??zo,t.monitorSessionActivityFn??Ac,t.mailboxRelayFn??Ev,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),d?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;c(m),n.has("session-monitor")&&u(m)}return f}async function yU(t,e,r,n,s,i,o,a,l,d){d.in_flight=!0,d.last_started_at=new Date().toISOString(),d.last_error=null;let c=[],u=0,f=0,m=[],p=null,h=EU();try{if(l.has("durable-memory-policies")&&gw({dal:t}),l.has("drift-detectors")&&HT({dal:t}),l.has("intake")&&(m=await n(t)),l.has("job-worker"))for(;;){let _=await e({dal:t,worker_id:o,lease_ms:6e5});if(_===null)break;c.push(_)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let _=await r(t);u=_.recorded,f=_.failed}l.has("session-monitor")&&(p=await bv(t,l,s,a,d))}catch(_){d.last_error=_ instanceof Error?_.message:String(_);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:d.last_error})})}catch{}}finally{d.in_flight=!1,d.cycles+=1,d.last_jobs_processed=c.length,d.last_session_sizes_recorded=u,d.last_session_size_failures=f,d.last_intake_scanned=m.reduce((_,g)=>_+g.scanned,0),d.last_intake_new_jobs=m.reduce((_,g)=>_+g.new_jobs,0),d.last_intake_failures=m.filter(_=>_.error!==void 0).length,d.last_session_hung_detected=p?.hung_detected??0,d.last_mailbox_relay_scanned=h.scanned,d.last_mailbox_relay_delivered=h.delivered,d.last_mailbox_relay_errors=h.errors,d.jobs_processed+=c.length,d.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function EU(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function bv(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=xc(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var Tv,hU,pf=T(()=>{"use strict";Qc();Ea();Ru();So();qT();XT();Rc();wv();Tv=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],hU=new Set(Tv)});function Sv(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 kv=T(()=>{"use strict"});import{mkdirSync as wU,readFileSync as TU,readdirSync as vU,statSync as bU,writeFileSync as SU}from"node:fs";import{dirname as kU,join as Nv,sep as Iv}from"node:path";function Qa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Av:return IU(t,s.input);case xv:return NU(t,s.input);case Rv:return AU(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:gf,GetObjectCommand:hf,PutObjectCommand:_f}}}function IU(t,e){let r=Lv(t,e.Key);return wU(kU(r),{recursive:!0}),SU(r,e.Body),{}}function NU(t,e){let r=Lv(t,e.Key),n;try{n=TU(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function AU(t,e){let r=e.Prefix??"";Ov(r);let s=xU(t).sort((c,u)=>c.key<u.key?-1:c.key>u.key?1:0).filter(c=>c.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(c=>c.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let d={Contents:a.map(c=>({Key:c.key,LastModified:c.lastModified})),IsTruncated:l};return l&&(d.NextContinuationToken=a[a.length-1].key),d}function Lv(t,e){return Ov(e),Nv(t,e)}function Ov(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function xU(t){let e=[],r=(n,s)=>{let i;try{i=vU(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=Nv(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let d=Iv==="/"?a:a.split(Iv).join("/");e.push({key:d,lastModified:bU(l).mtime})}}};return r(t,""),e}var Av,xv,Rv,_f,hf,gf,yf=T(()=>{"use strict";Av="localfs-put",xv="localfs-get",Rv="localfs-list",_f=class{input;_localfsTag=Av;constructor(e){this.input=e}},hf=class{input;_localfsTag=xv;constructor(e){this.input=e}},gf=class{input;_localfsTag=Rv;constructor(e){this.input=e}}});function Cv(){return{put:0,get:0,list:0}}function Ef(t,e=RU){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function wf(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var RU,el,Tf=T(()=>{"use strict";RU={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};el=class{counts=Cv();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Cv(),e}estimateCostUsd(e){return Ef(this.counts,e)}}});function $v(t){let e=t.now??Date.now,r=t.timers??LU,n=null,s=null;async function i(){let l=e(),d=wf(l),c=t.meter.drain();(c.put>0||c.get>0||c.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:d,put:c.put,get:c.get,list:c.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,d),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(d,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(d)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Ef(m);if(n!==d&&p>=t.ceilingUsd){n=d,t.log?.(`[usage] quota exceeded period=${d} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:d,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===wf(e())}}}var LU,Mv=T(()=>{"use strict";Tf();LU={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var vf=T(()=>{"use strict";Sa();Ia();Ia()});function OU(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 i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}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 CU(t){return t.reply_to!==void 0&&t.response!==void 0}function $U(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Dv(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 tl,li,jv=T(()=>{"use strict";vf();tl=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},li=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 tl("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=dr(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let d=r?.abortSignal,c;if(d!==void 0){if(d.aborted){l(Dv(d));return}c=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Dv(d)))},d.addEventListener("abort",c,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...c!==void 0?{abortListener:c}:{},...d!==void 0?{abortSignal:d}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{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(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new tl;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=OU(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(CU(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??$U(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let d=l instanceof Error?l.message:String(l),c=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:c,message:d}}}let a={message_id:dr(this.now(),this.random),reply_to:n.message_id,response:i};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 bf(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 Pv=T(()=>{"use strict"});function Sf(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 Fv=T(()=>{"use strict"});function If(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===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(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 kf,Uv=T(()=>{"use strict";kf="daemon:events"});function qv(t){return{kind:"prompt",prompt_id:t.prompt_id??dr(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Nf(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 Wv,Af=T(()=>{"use strict";vf();Wv="prompt:root"});function di(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Hv(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function MU(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(Hv(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function Bv(t,e=60){if(typeof t!="string"||t==="")return!0;let r=MU(t);return r===null?!0:Date.now()/1e3>=r-e}function Hv(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 xf=T(()=>{"use strict"});async function rl(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":DU},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 d=JSON.parse(s);l=d.message??d.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var DU,Rf=T(()=>{"use strict";DU="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Xv,mkdirSync as Jv,readFileSync as Gv,writeFileSync as Kv}from"node:fs";import{homedir as Vv}from"node:os";import{dirname as Yv,join as zv}from"node:path";function ci(){return process.env.LMCTL_DEVICE_AUTH_PATH??zv(Vv(),".lmctl","device-auth.json")}function Zv(){return process.env.LMCTL_TOKEN_PATH??zv(Vv(),".lmctl","cli-tokens.json")}function Lf(t=ci()){try{let e=JSON.parse(Gv(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 Qv(t,e=ci()){Jv(Yv(e),{recursive:!0,mode:448}),Kv(e,JSON.stringify(t,null,2));try{Xv(e,384)}catch{}}function Of(t,e=Zv()){let r={};try{r=JSON.parse(Gv(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};Jv(Yv(e),{recursive:!0,mode:448}),Kv(e,JSON.stringify(s,null,2));try{Xv(e,384)}catch{}}async function eb(t){let e=t.deviceAuthPath??ci(),r=Lf(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await rl({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Of({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Zv()),{idToken:n.idToken,userId:r.userId}}var Cf=T(()=>{"use strict";Rf()});import{existsSync as jU,realpathSync as PU}from"node:fs";import{dirname as FU}from"node:path";function $f(t){UU(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function UU(t){let e=t.payload.root_teamfile;try{e=PU(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return es({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let r=qU(e);if("error"in r)return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Rt(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:JU(t.env??process.env)});if(!n.acquired){let i=XU(r.alias,n.current);return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=Er(i=>t.store.heartbeatAgentInflight(n.lease,n.leaseId,i),{intervalMs:hn(t.env??process.env)});try{let o=await(t.chat??jt)({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=o.status==="stalled",l=!a&&o.text.trim()==="",d=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,c=a||l?"error":"ok";return c==="ok"?await BU(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:o.text,status:c,error_detail:null,log:t.log}):es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:d??"provider failed",reason:a?"stalled":"empty_response"}),{status:c,response:c==="error"?null:o.text,error_detail:d}}catch(i){let o=i instanceof Error?i.message:String(i);return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(n.lease,n.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function es(t){M({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:WU(t.message)})}function WU(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function qU(t){if(!jU(t))return{error:`prompt root missing/unreadable: ${t}`};let e=ot(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Ht(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??FU(t)}}async function BU(t,e){let r=nb(e.message),n=e.response===null?null:nb(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,origin:"unknown",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 nb(t){return t.length<=tb?{text:t,truncated:!1}:{text:t.slice(0,tb),truncated:!0}}function HU(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function XU(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:HU(t,e)}function JU(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return rb;let r=Number(e);return!Number.isFinite(r)||r<=0?rb:r}var tb,rb,sb=T(()=>{"use strict";Pt();ur();pe();Lt();tb=256*1024,rb=30*60*1e3});import{chmodSync as cb,existsSync as GU,mkdirSync as ub,readFileSync as ol,writeFileSync as fb}from"node:fs";import{dirname as Mf,resolve as nl,join as mb}from"node:path";import{fileURLToPath as KU}from"node:url";import{homedir as pb}from"node:os";import{CognitoIdentityClient as VU,GetIdCommand as YU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as ib}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as zU,ListObjectsV2Command as ZU,PutObjectCommand as QU,S3Client as ob}from"@aws-sdk/client-s3";function fi(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:sW(t.selfUrl),n={},s;for(let S of r)if(GU(S)){n=nW(S),s=S;break}let i=(...S)=>{for(let x of S)if(typeof x=="string"&&x!=="")return x},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??eW,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??tW,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??rW,d=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",c=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??al,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=il(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=il(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=il(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=il(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(e.LMCTL_MAILBOX_KEY),w=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:c,region:d,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...w!==void 0?{tokenPath:w}:{}},f}function nW(t){try{let e=ol(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function sW(t){let e=Mf(KU(t??import.meta.url));return[nl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),nl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),nl(e,"..","..","..","infra","terraform","terraform.tfstate"),nl(e,"..","..","infra","terraform","terraform.tfstate")]}function il(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function iW(t){let e=oW(t.intervalMs)??_b,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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let d=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let f of u){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()}),i=Math.max(i,f.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},c=setInterval(()=>{d()},e);return typeof c.unref=="function"&&c.unref(),{pollNow:d,stop(){a=!0,clearInterval(c)}}}function oW(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function hb(t){let e=t.tokenPath??mb(pb(),".lmctl","cli-tokens.json"),r=lb(t.tokenPath);if(Bv(r.cognito?.idToken)&&Lf()!==null)try{await eb({region:t.region,clientId:t.cognitoClientId??al,cliTokensPath:e}),r=lb(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Y=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Y}`)}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}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await db({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=ib({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ob({region:t.region,credentials:a}),d={ListObjectsV2Command:ZU,GetObjectCommand:zU,PutObjectCommand:QU},c=di(n),u=c??i,f=t.deviceId,m=Xn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Y=!1,B=0;for(;!Y&&B<2;){B+=1;try{let k=va(m,"web"),I=0,C;do{let W=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let U of W.Contents??[]){let j=ba(U.Key??"",m,"web");j!==void 0&&j>I&&(I=j)}C=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(C!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${u}`),Y=!0}catch(k){let I=k instanceof Error?k.message:String(k);if(o&&B===1&&dW(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),lW(e),o=!1,i=await db({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=ib({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ob({region:t.region,credentials:a}),m=Xn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let _=null,g=t.terminalSessionManager,y=t.persistentSessionManager,E=t.promptTriggerStore,w=new el,S=new sn({bucket:t.mailboxBucket,identityId:i,...c!==null?{userId:c}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:d,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(g!==void 0&&bf(A.payload)){g.onInbound(A.payload);return}if(y!==void 0&&Sf(A.payload)){await y.onInbound(A.payload);return}if(!If(A.payload)){if(E!==void 0&&Nf(A.payload)){$f({store:E,payload:A.payload,log:t.log});return}_!==null&&await _.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,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}:{}});_=new li({client:S,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async A=>S.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>S.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>S.putMessage({conversation_id:kf,payload:A});S.start();let J=t.chatLogTailStore===void 0?void 0:iW({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??_b,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let F=t.deviceId??i,$=`${u}/usage/`,R;return R=t.usageStore===void 0?void 0:$v({meter:w,store:t.usageStore,userId:u,deviceId:F,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Y,ceilingUsd:B})=>{t.log?.(`[usage] month ${A} cost $${Y.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),S.stop().catch(()=>{}),R?.stop()},publishOwnRollup:async(A,Y)=>{await l.send(new d.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${$}${F}-${A}.json`,Body:JSON.stringify({...Y,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Y={put:0,get:0,list:0},B;do{let k=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let I of k.Contents??[]){let C=I.Key??"";if(C.endsWith(`-${A}.json`))try{let W=await l.send(new d.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(W.Body===void 0)continue;let U=JSON.parse(await W.Body.transformToString("utf-8"));Y.put+=U.put??0,Y.get+=U.get??0,Y.list+=U.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Y},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:S,fetchClient:_,publishDaemonEvent:x,async stop(){J?.stop(),R!==void 0&&(await R.flushNow().catch(()=>{}),R.stop()),await _.stop().catch(()=>{}),await S.stop().catch(()=>{})}}}async function gb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Qa(t.rootDir),r=Xn({identityId:ui,userId:ui,deviceId:ab}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new sn({bucket:"local",identityId:ui,userId:ui,deviceId:ab,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async d=>{if(s!==void 0&&bf(d.payload)){s.onInbound(d.payload);return}if(i!==void 0&&Sf(d.payload)){await i.onInbound(d.payload);return}if(!If(d.payload)){if(o!==void 0&&Nf(d.payload)){$f({store:o,payload:d.payload,log:t.log});return}n!==null&&await n.handleIncoming(d.payload,d)}},pollIntervalMs:t.pollIntervalMs??sl,readIntervalMs:t.readIntervalMs??sl,heartbeatIdleMs:t.heartbeatIdleMs??sl,backoffReadIntervalMs:t.backoffReadIntervalMs??sl});n=new li({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async d=>a.putMessage({conversation_id:`terminal:${d.session_id}`,payload:d})),i!==void 0&&i.setPublish(async d=>a.putMessage({conversation_id:`provider:${d.session_id}`,payload:d}));let l=d=>a.putMessage({conversation_id:kf,payload:d});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ui,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function lb(t){let e=t??mb(pb(),".lmctl","cli-tokens.json");try{let r=ol(e,"utf8");return JSON.parse(r)}catch{return{}}}function aW(t,e){if(e===void 0||e==="")return;let r={};try{let s=ol(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};ub(Mf(t),{recursive:!0,mode:448}),fb(t,JSON.stringify(n,null,2));try{cb(t,384)}catch{}}function lW(t){let e={};try{let n=ol(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,ub(Mf(t),{recursive:!0,mode:448}),fb(t,JSON.stringify(r,null,2));try{cb(t,384)}catch{}}async function db(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new VU({region:t.region}).send(new YU({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{aW(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 dW(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 _b,sl,al,eW,tW,rW,ui,ab,Df=T(()=>{"use strict";Na();yf();Tf();Mv();jv();Pv();Fv();Uv();Af();Sa();xf();Cf();sb();_b=3e3,sl=1e3,al="79u5jhkk46qofog661c9i0bdcs",eW="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",tW="us-east-1_4iUdFggDn",rW="lmctl-next-preview-mailbox-254332045686";ui="local",ab="local"});import{spawn as Uf}from"node:child_process";import{createInterface as yb}from"node:readline";var jf,Pf,Ff,Eb,wb=T(()=>{"use strict";to();pe();xs();jf=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=Uf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=yb({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 i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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 i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,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,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
|
|
2345
2345
|
`)}catch(a){this.pending.delete(i),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+`
|
|
2346
2346
|
`)}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 o=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);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}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}}}},Pf=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Uf(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 i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
|
|
2347
2347
|
`);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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+`
|
|
@@ -2350,7 +2350,7 @@ ${t.receipt}`:`relay delivery error: ${t.error}`}function pU(t,e){t.reclaimStale
|
|
|
2350
2350
|
`)}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 i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}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+`
|
|
2351
2351
|
`)}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,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.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}})}}},Eb=t=>{switch(t){case"codex":return new jf;case"claude":case"qwen":return new Pf;case"gemini":case"copilot":case"opencode":case"kimi":return new Ff;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as cW}from"node:crypto";import{existsSync as mQ,mkdirSync as uW,readFileSync as fW,writeFileSync as mW}from"node:fs";import{homedir as pW}from"node:os";import{dirname as _W,join as hW}from"node:path";function ll(){return process.env.LMCTL_DEVICE_FILE??hW(pW(),".lmctl","device.json")}function ln(t=ll()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(fW(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 Wf(t=ll()){let e=ln(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:cW(),created_at:new Date().toISOString()};return uW(_W(t),{recursive:!0}),mW(t,`${JSON.stringify(r,null,2)}
|
|
2352
2352
|
`,{encoding:"utf8",mode:384}),r}var qf=T(()=>{"use strict"});import{mkdirSync as gW,readFileSync as Tb,rmSync as yW,writeFileSync as EW}from"node:fs";import{dirname as vb,join as wW}from"node:path";function Jt(t=ne()){return wW(vb(t),"serve.pid")}function bb(t,e){let r=Jt(e);return gW(vb(r),{recursive:!0}),EW(r,`${JSON.stringify(t,null,2)}
|
|
2353
|
-
`,"utf-8"),r}function Bf(t){let e=Jt(t),r;try{r=Tb(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function
|
|
2353
|
+
`,"utf-8"),r}function Bf(t){let e=Jt(t),r;try{r=Tb(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function ts(t){yW(Jt(t),{force:!0})}function dl(t){let e=TW(t),r=Bf(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Up(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function TW(t){let e=Jt(t),r;try{r=Tb(e,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function Sb(){return Kl(process.pid)}var kb=T(()=>{"use strict";Jr();ze()});var Fb={};he(Fb,{_resetStdoutEpipeGuardForTests:()=>NW,bootstrapAgentRestMailbox:()=>$b,installStdoutEpipeGuard:()=>Rb,publishRegisteredWorkflowsOnStart:()=>Cb,resolveLocalMailboxDir:()=>jb,resolveLocalWebuiDir:()=>Db,resolveServeConfig:()=>Mb,runServe:()=>kW,runServeStatus:()=>Lb,runServeStop:()=>Ob,validateServeArgs:()=>Pb});import{randomBytes as vW}from"node:crypto";import{existsSync as Ab}from"node:fs";import{isIP as Ib}from"node:net";import{homedir as bW}from"node:os";import{isAbsolute as xb,resolve as Hf}from"node:path";async function kW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(SW),0;let r=t[0];return r==="status"?Lb(t.slice(1),e):r==="stop"?Ob(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?Nb:`error: unknown serve subcommand: ${r}
|
|
2354
2354
|
|
|
2355
2355
|
${Nb.replace(/^error: [^\n]*\n\n/,"")}`),2):IW(t.slice(1),e)}async function IW(t,e){let r=Pb(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2356
2356
|
`),2;let n=qe({path:ne()}),s={portCli:DW(t)},i;try{i=Mb({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(w){return n.close(),e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
|
|
@@ -2363,7 +2363,7 @@ ${Nb.replace(/^error: [^\n]*\n\n/,"")}`),2):IW(t.slice(1),e)}async function IW(t
|
|
|
2363
2363
|
`);let E=ne();try{let w=dl(E);w.running&&w.entry!==null&&w.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${w.entry.pid}, port ${w.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
|
|
2364
2364
|
`);let S=bb({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:r.bind,dbPath:E,startToken:Sb()},E);e.stdout.write(`pidfile ${S} (pid ${process.pid})
|
|
2365
2365
|
`)}catch(w){e.stderr.write(`warning: could not write serve pidfile: ${w instanceof Error?w.message:String(w)}; \`lmctl serve status\`/\`stop\` will not find this daemon
|
|
2366
|
-
`)}return await new Promise(w=>{let S=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await _.stop(),d!==void 0&&await d.stop(),await c.stop(),n.close();try{let x=Bf(E);x!==null&&x.pid===process.pid&&
|
|
2366
|
+
`)}return await new Promise(w=>{let S=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await _.stop(),d!==void 0&&await d.stop(),await c.stop(),n.close();try{let x=Bf(E);x!==null&&x.pid===process.pid&&ts(E)}catch{}w()})()};process.once("SIGTERM",S),process.once("SIGINT",S)}),0}function Rb(t){if(t.stdout!==process.stdout||Xf)return;Xf=!0;let e=r=>{throw r.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),r};process.stdout.on("error",e)}function NW(){Xf=!1}async function Lb(t,e){return Rb(e),AW(t,e)}async function AW(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
|
|
2367
2367
|
`),2;let r=ne(),n=dl(r);if(n.entry===null)return e.stdout.write(`serve: not running
|
|
2368
2368
|
`),e.stdout.write(n.corrupt?` unreadable pidfile at ${Jt(r)} (could not parse)
|
|
2369
2369
|
run \`lmctl serve stop\` to clear it
|
|
@@ -2383,17 +2383,17 @@ ${Nb.replace(/^error: [^\n]*\n\n/,"")}`),2):IW(t.slice(1),e)}async function IW(t
|
|
|
2383
2383
|
`),o.enabled_features!==void 0){let l=Array.isArray(o.enabled_features)?o.enabled_features.join(", "):String(o.enabled_features);e.stdout.write(` features ${l}
|
|
2384
2384
|
`)}return o.last_error!==void 0&&o.last_error!==null&&e.stdout.write(` last_error ${String(o.last_error)}
|
|
2385
2385
|
`),0}async function RW(t,e){try{let r=t.dal??qe({path:ne()}),n=t.dal===void 0,s=null;try{s=qs(r,process.env,{stdout:{write:()=>{}},stderr:{write:()=>{}}}).token}finally{n&&r.close()}let i={Accept:"application/json"};s!==null&&s.length>0&&(i.Authorization=`Bearer ${s}`);let o=e.bind==="0.0.0.0"||e.bind==="::"||e.bind===""?"127.0.0.1":e.bind,a=new URL(`http://${o.includes(":")?`[${o}]`:o}:${e.port}/api/daemon/state`),l=await fetch(a,{headers:i,signal:AbortSignal.timeout(xW)});return l.ok?await l.json():null}catch{return null}}async function Ob(t,e,r={}){let n=r.timeoutMs??OW;if(t.length>0)return e.stderr.write(`error: lmctl serve stop takes no arguments; got: ${t.join(" ")}
|
|
2386
|
-
`),2;let s=ne(),i=dl(s);if(i.entry===null)return i.corrupt?(
|
|
2386
|
+
`),2;let s=ne(),i=dl(s);if(i.entry===null)return i.corrupt?(ts(s),e.stdout.write(`serve: not running (pidfile was unreadable); cleared it
|
|
2387
2387
|
`),0):(e.stdout.write(`serve: not running (no pidfile); nothing to stop
|
|
2388
|
-
`),0);if(i.stale)return
|
|
2388
|
+
`),0);if(i.stale)return ts(s),e.stdout.write(i.staleReason==="pid-reused"?`serve: not running (pid ${i.entry.pid} belongs to a different process \u2014 pid reused); cleared stale pidfile without signalling it
|
|
2389
2389
|
`:`serve: not running (pid ${i.entry.pid} already gone); cleared stale pidfile
|
|
2390
2390
|
`),0;let{pid:o,port:a}=i.entry;if(i.unverified===!0)return e.stderr.write(`error: refusing to stop pid ${o}: cannot confirm it is this DB's daemon (the pidfile has no usable identity token \u2014 it likely predates identity tracking, or /proc is unreadable here).
|
|
2391
2391
|
verify with: ps -p ${o} -o pid,lstart,args
|
|
2392
2392
|
then either: kill ${o} (if it IS the daemon)
|
|
2393
2393
|
or: rm ${Jt(s)} (if it is not)
|
|
2394
|
-
`),1;try{process.kill(o,"SIGTERM")}catch(d){return(d!==null&&typeof d=="object"&&"code"in d?d.code:void 0)==="ESRCH"?(
|
|
2394
|
+
`),1;try{process.kill(o,"SIGTERM")}catch(d){return(d!==null&&typeof d=="object"&&"code"in d?d.code:void 0)==="ESRCH"?(ts(s),e.stdout.write(`serve: not running (pid ${o} already gone); cleared stale pidfile
|
|
2395
2395
|
`),0):(e.stderr.write(`error: could not signal pid ${o}: ${d instanceof Error?d.message:String(d)}
|
|
2396
|
-
`),1)}let l=Date.now()+n;for(;Date.now()<l;){if(!He(o))return
|
|
2396
|
+
`),1)}let l=Date.now()+n;for(;Date.now()<l;){if(!He(o))return ts(s),e.stdout.write(`serve: stopped (pid ${o}, port ${a})
|
|
2397
2397
|
`),0;await new Promise(d=>setTimeout(d,LW))}return e.stderr.write(`error: pid ${o} did not exit within ${n/1e3}s of SIGTERM; it may be shutting down slowly. Re-run \`lmctl serve stop\`, or \`kill -9 ${o}\` if it is wedged
|
|
2398
2398
|
`),1}function CW(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 Cb(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().filter(r=>Ab(r.teamfile_path)).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)}
|
|
2399
2399
|
`)}}async function $b(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await gb({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
@@ -2459,17 +2459,17 @@ unauthenticated daemon.
|
|
|
2459
2459
|
lmctl serve stop
|
|
2460
2460
|
|
|
2461
2461
|
Run 'lmctl serve --help' for details.
|
|
2462
|
-
`;Xf=!1;xW=2e3;LW=100,OW=1e4});import{existsSync as FW,mkdirSync as UW,readFileSync as WW,renameSync as qW,unlinkSync as BW,writeFileSync as HW}from"node:fs";import{homedir as qb}from"node:os";import{dirname as mi,join as Ye,resolve as XW}from"node:path";function
|
|
2463
|
-
`,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function KW(t,e){mt.mkdirSync(mi(t),{recursive:!0});let r=Ye(mi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{mt.writeFileSync(r,e,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function Gt(t,e,r){try{if(!mt.existsSync(t))return;let n=JSON.parse(mt.readFileSync(t,"utf8"));if(!
|
|
2464
|
-
`)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Wb(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function zW(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=Jb(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),d=ZW(a,r);if(d===null)return null;if(d===void 0||d.length!==3||d[0]!=="mcp_servers"||d[1]!==cl&&d[1]!==ul)continue;let c=e.get(d[1])??{};if(d[2]==="command"){let u=Gb(l);if(u===null)return null;c.command=u}else if(d[2]==="args"){let u=eq(l);if(u===null)return null;c.args=u}e.set(d[1],c)}let n=new Set;for(let[s,i]of e.entries())s===cl&&Vb(i.command,i.args)&&n.add(s),s===ul&&Yb(i.command,i.args)&&n.add(s);return n}function ZW(t,e){if(t.startsWith("mcp_servers"))return fl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=fl(t);return r===null?null:[...e,...r]}function Jb(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:fl(e[1])}function QW(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 fl(r)}function fl(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="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)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 Gb(t){let e=Kb(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function eq(t){let e=Kb(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>Gb(s.trim()));return n.some(s=>s===null)?null:n}function Kb(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function tq(t){return
|
|
2462
|
+
`;Xf=!1;xW=2e3;LW=100,OW=1e4});import{existsSync as FW,mkdirSync as UW,readFileSync as WW,renameSync as qW,unlinkSync as BW,writeFileSync as HW}from"node:fs";import{homedir as qb}from"node:os";import{dirname as mi,join as Ye,resolve as XW}from"node:path";function ns(t,e,r){let n=mi(XW(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Gt(Ye(o,".mcp.json"),"mcpServers",[jr(),Pr()]),a.has("opencode")&&Gt(Ye(o,".opencode","opencode.json"),"mcp",[Hb(),Xb()]),a.has("kimi")&&Gt(Ye(o,".kimi-code","mcp.json"),"mcpServers",[jr(),Pr()]);for(let o of s)VW(o)}function Bb(t=Jf??qb()){return Ye(t,".copilot","mcp-config.json")}function GW(t,e){mt.mkdirSync(mi(t),{recursive:!0});let r=Ye(mi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{mt.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
2463
|
+
`,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function KW(t,e){mt.mkdirSync(mi(t),{recursive:!0});let r=Ye(mi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{mt.writeFileSync(r,e,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function Gt(t,e,r){try{if(!mt.existsSync(t))return;let n=JSON.parse(mt.readFileSync(t,"utf8"));if(!rs(n)||!rs(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,GW(t,n),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function jr(){return{name:ul,shouldRemove:nq}}function Hb(){return{name:ul,shouldRemove:sq}}function Pr(){return{name:cl,shouldRemove:tq}}function Xb(){return{name:cl,shouldRemove:rq}}function VW(t){let e=Jf??qb();switch(t){case"copilot":Gt(Bb(e),"mcpServers",[jr(),Pr()]);return;case"claude":Gt(Ye(e,".claude.json"),"mcpServers",[jr(),Pr()]);return;case"gemini":Gt(Ye(e,".gemini","settings.json"),"mcpServers",[jr(),Pr()]);return;case"qwen":Gt(Ye(e,".qwen","settings.json"),"mcpServers",[jr(),Pr()]);return;case"agy":Gt(Ye(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[jr(),Pr()]);return;case"opencode":Gt(Ye(e,".config","opencode","opencode.json"),"mcp",[Hb(),Xb()]);return;case"kimi":Gt(Ye(Jf===void 0?process.env.KIMI_CODE_HOME??Ye(e,".kimi-code"):Ye(e,".kimi-code"),"mcp.json"),"mcpServers",[jr(),Pr()]);return;case"codex":YW(Ye(e,".codex","config.toml"));return;default:return}}function YW(t){try{if(!mt.existsSync(t))return;let e=mt.readFileSync(t,"utf8"),r=zW(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let d=Jb(l);if(d===null)return;if(d!==void 0){if(Wb(d,r)){o=!0,a=d[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let c=QW(l);if(c===null)return;if(c!==void 0&&Wb(c,r)){i.add(c[1]);continue}s.push(l)}if(i.size===0)return;KW(t,s.join(`
|
|
2464
|
+
`)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Wb(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function zW(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=Jb(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),d=ZW(a,r);if(d===null)return null;if(d===void 0||d.length!==3||d[0]!=="mcp_servers"||d[1]!==cl&&d[1]!==ul)continue;let c=e.get(d[1])??{};if(d[2]==="command"){let u=Gb(l);if(u===null)return null;c.command=u}else if(d[2]==="args"){let u=eq(l);if(u===null)return null;c.args=u}e.set(d[1],c)}let n=new Set;for(let[s,i]of e.entries())s===cl&&Vb(i.command,i.args)&&n.add(s),s===ul&&Yb(i.command,i.args)&&n.add(s);return n}function ZW(t,e){if(t.startsWith("mcp_servers"))return fl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=fl(t);return r===null?null:[...e,...r]}function Jb(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:fl(e[1])}function QW(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 fl(r)}function fl(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="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)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 Gb(t){let e=Kb(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function eq(t){let e=Kb(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>Gb(s.trim()));return n.some(s=>s===null)?null:n}function Kb(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function tq(t){return rs(t)?t.type==="stdio"&&typeof t.command=="string"&&Vb(t.command,t.args):!1}function rq(t){return!rs(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Zb(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&zb(t.command[0],[t.command[1],t.command[2]])}function nq(t){return rs(t)?t.type==="stdio"&&Yb(t.command,t.args):!1}function sq(t){return!rs(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Qb(t.command[0])&&t.command[1]==="mcp"}function Vb(t,e){return Zb(t)&&eS(e)||zb(t,e)}function Yb(t,e){return Qb(t)&&eS(e)}function zb(t,e){return iq(t)&&Array.isArray(e)&&e.length===2&&oq(e[0])&&e[1]==="mcp"}function Zb(t){return typeof t=="string"&&Gf(t)==="lmctl"}function Qb(t){return typeof t=="string"&&Gf(t)==="lmctl0"}function iq(t){if(typeof t!="string")return!1;let e=Gf(t).toLowerCase();return e==="node"||e==="node.exe"}function oq(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Gf(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function eS(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function rs(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var cl,ul,JW,mt,Jf,pi=T(()=>{"use strict";pe();cl="lmctl",ul="lmctl0",JW={existsSync:FW,mkdirSync:UW,readFileSync:WW,writeFileSync:HW,renameSync:qW,unlinkSync:BW},mt=JW});function nS(t){let e=tS(t.registry,t.fromTeamfile);if(e===void 0)return ss(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!rS(e,t.fromAlias))return ss(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=tS(t.registry,t.toTeamfile);return r===void 0?ss(`target team is not registered in policy graph: ${t.toTeamfile}`):rS(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?ss(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?ss(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:ss(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function tS(t,e){return t.teams.find(r=>r.teamfile===e)}function rS(t,e){return t.aliases.some(r=>r===e)}function ss(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var sS=T(()=>{"use strict"});import{randomUUID as aq}from"node:crypto";import{hostname as iS,networkInterfaces as lq}from"node:os";function oS(t){let e=(t.now??new Date).toISOString();return{lock_id:aq(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??iS(),holder_ips:t.ips??mq(),started_at:e,last_heartbeat:e}}function aS(t=process.env){return lS(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,dq)}function uq(t=process.env){return lS(t.LMCTL_TERMINAL_LOCK_STALE_MS,cq)}function Kf(t,e={}){let r=e.now??new Date,n=e.localHost??iS(),s=e.staleMs??uq();if(t.holder_host===n)return(e.isProcessAlive??fq)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Vf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function lS(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function fq(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function mq(){let t=new Set;for(let e of Object.values(lq()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var dq,cq,Yf=T(()=>{"use strict";dq=15e3,cq=12e4});function zf(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2465
2465
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
2466
2466
|
not officially supported.
|
|
2467
|
-
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function
|
|
2467
|
+
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function mr(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
2468
2468
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
2469
2469
|
Consulted ${fs(ne())}
|
|
2470
2470
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function dS(t){return`unknown option --from
|
|
2471
|
-
${zf(t)}`}function cS(t,e){let r=
|
|
2472
|
-
`}),i=await gq(r,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=wq(r,i);try{
|
|
2471
|
+
${zf(t)}`}function cS(t,e){let r=dn(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function dn(t,e){let r=t[As];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=Ve(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var _i=T(()=>{"use strict";gt();ze();fr()});function Me(t){let e=an(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var ml=T(()=>{"use strict";at()});async function hl(t){let e=t.onEvent??(()=>{}),r=pq(t.io,e),n=null,s=null,i=null,o,a,l=null,d=!1,c=null,u=t.prompt;try{let f=await O(r,R=>Ne(t.teamfile,t.alias,R)),m=f.teamfile,p=await O(r,R=>vq(R,t.env??process.env)),h=p.sender,_=await bq(r,{explicitRoot:t.rootFlag,sender:h,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),g=h===null?null:await Sq(r,{rootTeamfile:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias});g!==null&&!g.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${g.reason}
|
|
2472
|
+
`}),i=await gq(r,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=wq(r,i);try{ns(r,ot(m),m)}catch{}n={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:g};let y=await _S(r,m,f.alias);if(y!==null){let R=Vf(y);if(h!==null){let A=await Zf(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=pl(`enqueued mailbox message ${A.id}`,null),Qf(A.id,h,m,f.alias)}return is(i,n,t.prompt,R,"unavailable"),c=em(R,null),{status:"busy",message:R,teamChatLogId:null}}let E=await _q(r,m,f.alias);if(E.busy){if(h!==null){let A=await Zf(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=pl(`enqueued mailbox message ${A.id}`,null),Qf(A.id,h,m,f.alias)}let R=await hq(r,m,f.alias);return is(i,n,t.prompt,R,"unavailable"),c=em(R,null),{status:"busy",message:R,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let R=await O(r,A=>tv(A,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(R.stop){let A=nv(R.chain);return is(i,n,t.prompt,A,"cycle"),c=_l(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null}}}let w=await Nq(r,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...E.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!w.acquired){let R=hS(m,f.alias,w.current);if(h!==null){let A=await Zf(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=pl(`enqueued mailbox message ${A.id}`,null),Qf(A.id,h,m,f.alias)}return is(i,n,t.prompt,R,"unavailable"),c=em(R,null),{status:"busy",message:R,teamChatLogId:null}}s={row:w.lease,leaseId:w.leaseId},a=Er(R=>O(r,A=>A.heartbeatAgentInflight(s.row,s.leaseId,R)),{intervalMs:pS,onError:R=>{ue()&&je(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:R instanceof Error?R.message:String(R)}))}});let S=await Yn({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:R=>e({kind:"delta",chunk:R}),onProgress:R=>e({kind:"progress",alias:f.alias,event:R}),onPromptBuilt:async R=>{u=R,l===null&&(l=await xq(r,{...n,message:R})),i!==null&&await Eq(r,i,R)}});u=S.prompt;let x=S.status==="stalled",J=null,F=x?`provider stalled${S.stalledAfterMs!==void 0?` after ${S.stalledAfterMs}ms`:""}`:S.status==="error"?S.error??S.receipt:n.policy?.outOfPolicy===!0?n.policy.reason:null,$=x||S.status==="error"?"error":n.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await mS(r,l,{...n,message:u,response:S.receipt,status:$,error_detail:F}),d=!0,J=l):J=await Lq(r,{...n,message:u,response:S.receipt,status:$,error_detail:F}),x){let R=F;is(i,n,u,R,"error"),c=_l(R,J,S.receipt)}else c=pl(S.receipt,J);return{status:x?"stalled":"ok",replyText:S.receipt,wroteDelta:S.wroteDelta,teamChatLogId:J,durationMs:S.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!d&&n!==null&&(await mS(r,l,{...n,message:u,response:null,status:"error",error_detail:m}),d=!0),is(i,n,u,m,"error"),c=_l(m,l),{status:"error",errorKind:f instanceof ke?"target":"provider",message:m,teamChatLogId:l}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await Rq(r,n,`msg_tcl_${l}`),s!==null&&await Aq(r,s.row,s.leaseId),i!==null&&await yq(r,i,c??_l("chat turn exited without a terminal outcome",null))}}function pq(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function _q(t,e,r){let n=await O(t,i=>_t(i,e,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>Qn(i,n,e,r));return{busy:!s,idleReclaim:s}}async function hq(t,e,r){let n=await _S(t,e,r);if(n!==null)return Vf(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?hS(e,r,s):`${r} is busy; wait and retry`}async function Zf(t,e){return await qa(t,t.env??process.env),await O(t,r=>{let n=Ne(e.sender.teamfile,e.sender.alias,r);return r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,sender_provider:n.provider,sender_session_id:n.sessionid,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,receiver_provider:e.receiverProvider,receiver_session_id:e.receiverSessionId,root_teamfile:e.rootTeamfile,payload:e.payload})})}function Qf(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function gq(t,e){try{return(await O(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:Tq(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ue()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function yq(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function Eq(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function wq(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ue()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},pS);return r.unref?.(),r}function pl(t,e){return{status:"done",result_summary:hi(t),error:null,team_chat_log_id:e}}function em(t,e){return{status:"busy",result_summary:hi(t),error:t,team_chat_log_id:e}}function _l(t,e,r){return{status:"error",result_summary:hi(r===void 0?t:r),error:t,team_chat_log_id:e}}function hi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Tq(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function vq(t,e){let r=cS(e,t);if(r.ok)return{sender:Me(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(mr("chat"))}async function bq(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>Se(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>rv(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function Sq(t,e){return await O(t,r=>nS({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:kq(r,e.sender.teamfile,e.receiverTeamfile)}))}function kq(t,e,r){return{teams:[e,r].map(s=>Iq(s,t))}}function Iq(t,e){let r=Ve(t,e),n=Ht(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function Nq(t,e){return await O(t,r=>{let n=ue(),s=Rt(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:qt(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:fS(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(n&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:fS(s.current)})),{acquired:!1,current:s.current})})}async function _S(t,e,r){return await O(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(Kf(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:Kf(s).live?s:null})}function fS(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function Aq(t,e,r){try{await O(t,n=>{n.releaseAgentInflight(e,r)})}catch(n){t.stderr.write(`warning: failed to release chat in-flight slot: ${n instanceof Error?n.message:String(n)}
|
|
2473
2473
|
`)}}function hS(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function xq(t,e){let r=gi(e.message);try{return await O(t,n=>n.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:r.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:r.truncated?1:0,created_at:new Date().toISOString()}))}catch(n){return t.stderr.write(`warning: failed to begin chat log: ${n instanceof Error?n.message:String(n)}
|
|
2474
2474
|
`),null}}async function mS(t,e,r){let n=gi(r.message),s=r.response===null?null:gi(r.response);try{await O(t,i=>i.finishTeamChatLog(e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,receiver_provider:r.receiver_provider,receiver_session_id:r.receiver_session_id,provider_prompt:r.message,message:n.text,response:s?.text??null,origin:r.origin,status:r.status,error_detail:r.error_detail,truncated:n.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
|
|
2475
2475
|
`)}}async function Rq(t,e,r){if(e!==null)try{await O(t,n=>{n.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,r)})}catch(n){t.stderr.write(`warning: failed to clear chat causal pointer: ${n instanceof Error?n.message:String(n)}
|
|
@@ -2488,7 +2488,7 @@ ${yS}
|
|
|
2488
2488
|
`),1;let _=f.resumeInteractive(h.step_id,n.prompt,n.done===!0);return _.resumed===!0?(e.stdout.write(`run ${u}: interactive resumed (step ${h.step_id}${n.done===!0?", done":""})
|
|
2489
2489
|
`),0):(e.stderr.write(`error: run ${u}: resumeInteractive failed (${_.reason})
|
|
2490
2490
|
`),1)}return e.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
|
|
2491
|
-
`),1})}let s=
|
|
2491
|
+
`),1})}let s=Dr(Cq,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
|
|
2492
2492
|
`),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
|
|
2493
2493
|
`),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
|
|
2494
2494
|
`),2;let u=await hl({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>Pq(e,f)});return n.json===!0?u.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
|
|
@@ -2504,7 +2504,7 @@ ${yS}
|
|
|
2504
2504
|
`):e.stdout.write(`${u.replyText}${u.replyText.endsWith(`
|
|
2505
2505
|
`)?"":`
|
|
2506
2506
|
`}`),u.status==="stalled"?1:0)}else{if(s.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
|
|
2507
|
-
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ue(),l=0,d=0,c=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,c=Buffer.byteLength(p,"utf8"),d+=c),e.stdout.write(p)},onProgress:p=>TS(e,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let f=await jt(u);a&&
|
|
2507
|
+
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ue(),l=0,d=0,c=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,c=Buffer.byteLength(p,"utf8"),d+=c),e.stdout.write(p)},onProgress:p=>TS(e,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let f=await jt(u);a&&je(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:d,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:c,tailPreview:jq(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
|
|
2508
2508
|
`)||e.stdout.write(`
|
|
2509
2509
|
`):e.stdout.write(`${f.text}${f.text.endsWith(`
|
|
2510
2510
|
`)?"":`
|
|
@@ -2535,15 +2535,15 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
|
|
|
2535
2535
|
your file-writing tool (not echo/heredoc), then pass --prompt-file.
|
|
2536
2536
|
--permission-mode defaults to yolo.
|
|
2537
2537
|
|
|
2538
|
-
Send a prompt to a team member or raw provider session, or answer a paused run.`});function yi(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=Fq.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:Uq(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function Uq(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=Wq(e,n);try{let o=qq(t,s),a=SS(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=Jq(o,1);a=SS(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function Wq(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function qq(t,e){let r=kS(e,!1).formatToParts(t);return{year:
|
|
2538
|
+
Send a prompt to a team member or raw provider session, or answer a paused run.`});function yi(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=Fq.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:Uq(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function Uq(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=Wq(e,n);try{let o=qq(t,s),a=SS(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=Jq(o,1);a=SS(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function Wq(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function qq(t,e){let r=kS(e,!1).formatToParts(t);return{year:pr(r,"year"),month:pr(r,"month"),day:pr(r,"day")}}function SS(t,e,r,n,s,i){let o=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=Bq(new Date(o),i);o=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(o)}function Bq(t,e){let r=kS(e,!0).formatToParts(t);return Date.UTC(pr(r,"year"),pr(r,"month")-1,pr(r,"day"),pr(r,"hour"),pr(r,"minute"),pr(r,"second"),0)-t.getTime()}function kS(t,e){let r=e?Xq:Hq,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function pr(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function Jq(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var Fq,Hq,Xq,rm=T(()=>{"use strict";Fq=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;Hq=new Map,Xq=new Map});var AS={};he(AS,{runRecover:()=>Kq});import{dirname as IS,resolve as NS}from"node:path";async function Kq(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${nm}
|
|
2539
2539
|
`),0;let n=Q(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return N(e,`${n.error}
|
|
2540
2540
|
|
|
2541
2541
|
${nm}`);if(n.positionals.length===0)return N(e,`recover requires a <teamfile>
|
|
2542
2542
|
|
|
2543
2543
|
${nm}`);if(n.positionals.length>2)return N(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=an(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return N(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(V(n,"--all")&&l!==void 0)return N(e,"recover --all is mutually exclusive with <alias>");let d;try{d=await Vq(e,o,l)}catch(p){if(p instanceof ke)return N(e,p.message);throw p}let c=r.now??new Date,u=V(n,"--dry-run"),f=[];for(let p of d)f.push(await Yq(e,p,{now:c,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(V(n,"--json"))re(e,{dryRun:u,now:c.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(zq(p));e.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
|
|
2544
|
-
`)}return m.errors>0?1:0}async function Vq(t,e,r){return await O(t,n=>{let s=Se(e,n);if(r!==void 0){let i=Ve(s,n);if(i.parseErrors.length>0)throw new ke(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=Ja(i,r);return o?.teamfile!==void 0?sm(NS(IS(s),o.teamfile),n,new Set):[Ne(e,r,n)]}return sm(s,n,new Set)})}function sm(t,e,r){let n=Se(t,e);if(r.has(n))return[];r.add(n);let s=Ve(n,e);if(s.parseErrors.length>0)throw new ke(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...sm(NS(IS(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(Ne(n,o.alias,e))}return i}async function Yq(t,e,r){let n;try{let a=await
|
|
2544
|
+
`)}return m.errors>0?1:0}async function Vq(t,e,r){return await O(t,n=>{let s=Se(e,n);if(r!==void 0){let i=Ve(s,n);if(i.parseErrors.length>0)throw new ke(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=Ja(i,r);return o?.teamfile!==void 0?sm(NS(IS(s),o.teamfile),n,new Set):[Ne(e,r,n)]}return sm(s,n,new Set)})}function sm(t,e,r){let n=Se(t,e);if(r.has(n))return[];r.add(n);let s=Ve(n,e);if(s.parseErrors.length>0)throw new ke(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...sm(NS(IS(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(Ne(n,o.alias,e))}return i}async function Yq(t,e,r){let n;try{let a=await Fe(e.sessionid,e.provider);if(a===null)return Kt(e,"session_not_found",null,"session detail not found");n=yi(a.messages)}catch(a){return Kt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Kt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Kt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Kt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Kt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(i!==null)return Kt(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Kt(e,"would_recover",n,null);let o=await hl({teamfile:e.teamfile,alias:e.alias,prompt:Gq,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?Kt(e,"recovered",n,null):Kt(e,o.status==="busy"?"busy":"send_error",n,o.message)}function Kt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function zq(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
|
|
2545
2545
|
`}var Gq,nm,xS=T(()=>{"use strict";rm();Xt();ur();fr();at();tm();$e();Gq="Your session limit reset time has passed. Continue your work from the last actionable point.",nm=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<alias> [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
|
|
2546
|
-
`)});var Ei,jee,im=T(()=>{"use strict";Ei=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],jee=Ei.length});import{spawn as Zq}from"node:child_process";async function LS(t,e,r){let n=eB.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 i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return tB(n.name,s)}function tB(t,e){return t==="lmctl_chat"?rB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function rB(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=["chat",r,n,e];return ue()&&
|
|
2546
|
+
`)});var Ei,jee,im=T(()=>{"use strict";Ei=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],jee=Ei.length});import{spawn as Zq}from"node:child_process";async function LS(t,e,r){let n=eB.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 i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return tB(n.name,s)}function tB(t,e){return t==="lmctl_chat"?rB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function rB(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=["chat",r,n,e];return ue()&&je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),nB(s,process.cwd())}function nB(t,e){return new Promise(r=>{let n=!1,s,i=c=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(c))},o=Zq("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=sB(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",d="";o.stdout?.on("data",c=>{l+=c.toString("utf8")}),o.stderr?.on("data",c=>{d+=c.toString("utf8")}),o.on("error",c=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${c.message}`})}),o.on("exit",c=>{if(c===0){ue()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2547
2547
|
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:c??1,message:d.trim()||`lmctl chat exited with code ${c}`})})})}function sB(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return RS;let r=Number(e);return!Number.isFinite(r)||r<=0?RS:r}function om(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:Qq),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var Qq,RS,eB,am=T(()=>{"use strict";im();pe();Qq="http://127.0.0.1:8787",RS=30*60*1e3,eB=new Map(Ei.map(t=>[t.name,t]))});async function lB(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(lm({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:iB,capabilities:{tools:{listChanged:!1}},serverInfo:{name:oB,version:aB}}}};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:Ei.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:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await LS(i,o,e.dispatch),l=i==="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 lm(t){return`${JSON.stringify(t)}
|
|
2548
2548
|
`}async function OS(t,e){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(c){t.io.write(lm({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${c instanceof Error?c.message:String(c)}`}}));return}l.method==="shutdown"&&(r=!0);let d=await lB(l,t);d.kind==="response"?t.io.write(lm(d.message)):d.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,d=u=>{l||(l=!0,o(u))},c=()=>{let u=n.indexOf(`
|
|
2549
2549
|
`);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&d(0)}),u=n.indexOf(`
|
|
@@ -2583,38 +2583,38 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
|
2583
2583
|
WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2584
2584
|
AND ts >= ?
|
|
2585
2585
|
ORDER BY seq ASC
|
|
2586
|
-
`).all(e.since).map(RB),s=new Map;for(let l of n){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Fr(`${l.stream_id} ${l.event_type} is missing receiver identity`);let d=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},c=LB(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:d,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:c.message_id,parent_link:c.link,orphaned_to_root:c.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let d=s.get(l.parent_message_id);if(d===void 0){l.orphaned_to_root=!0;continue}d.children.push(l)}let i=e.cursorSeq??null,o=[...s.values()].filter(l=>WS(l,e.root)&&!OB(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>qS(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function RB(t){try{let e=JSON.parse(t.payload);if(!BS(e))throw new Fr(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Fr?e:new Fr(`message_event seq ${t.seq} payload is invalid JSON`)}}function LB(t){if(t.event_type==="RESPONSE_CREATE"){let n=FS(t.payload.in_reply_to_message_id);return{message_id:n,link:n===null?null:"in_reply_to_message_id"}}let e=BS(t.payload.causation)?t.payload.causation:null,r=FS(e?.request_message_id);return{message_id:r,link:r===null?null:"invocation_state.request_message_id"}}function WS(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function OB(t,e,r){let n=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(n.has(s))return!1;n.add(s);let i=e.get(s);if(i===void 0)return!1;if(WS(i,r))return!0;s=i.parent_message_id}return!1}function qS(t,e){let{seq:r,children:n,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:n.map(o=>qS(o,i))}}function BS(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function FS(t){return typeof t=="string"&&t.length>0?t:null}var Fr,HS=T(()=>{"use strict";Fr=class extends Error{errorKind="data_error"}});var QS={};he(QS,{runMail:()=>VB});import{hostname as CB}from"node:os";async function VB(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(FB),0;let[r,...n]=t,s=Vt(n);try{switch(r){case"sent":return await YB(n,e);case"history":return await zB(n,e);case"seen":return await ZB(n,e);case"pending":return await QB(n,e);case"read":return await tH(n,e);case"deliver":return await rH(n,e);case"handle":return await aH(n,e);case"ack":return await oH(n,e);case"tree":return await lH(n,e);default:return ee(e,s,"invalid_command",`unknown mail command: ${r}`)}}catch(i){return i instanceof
|
|
2586
|
+
`).all(e.since).map(RB),s=new Map;for(let l of n){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Fr(`${l.stream_id} ${l.event_type} is missing receiver identity`);let d=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},c=LB(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:d,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:c.message_id,parent_link:c.link,orphaned_to_root:c.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let d=s.get(l.parent_message_id);if(d===void 0){l.orphaned_to_root=!0;continue}d.children.push(l)}let i=e.cursorSeq??null,o=[...s.values()].filter(l=>WS(l,e.root)&&!OB(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>qS(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function RB(t){try{let e=JSON.parse(t.payload);if(!BS(e))throw new Fr(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Fr?e:new Fr(`message_event seq ${t.seq} payload is invalid JSON`)}}function LB(t){if(t.event_type==="RESPONSE_CREATE"){let n=FS(t.payload.in_reply_to_message_id);return{message_id:n,link:n===null?null:"in_reply_to_message_id"}}let e=BS(t.payload.causation)?t.payload.causation:null,r=FS(e?.request_message_id);return{message_id:r,link:r===null?null:"invocation_state.request_message_id"}}function WS(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function OB(t,e,r){let n=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(n.has(s))return!1;n.add(s);let i=e.get(s);if(i===void 0)return!1;if(WS(i,r))return!0;s=i.parent_message_id}return!1}function qS(t,e){let{seq:r,children:n,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:n.map(o=>qS(o,i))}}function BS(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function FS(t){return typeof t=="string"&&t.length>0?t:null}var Fr,HS=T(()=>{"use strict";Fr=class extends Error{errorKind="data_error"}});var QS={};he(QS,{runMail:()=>VB});import{hostname as CB}from"node:os";async function VB(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(FB),0;let[r,...n]=t,s=Vt(n);try{switch(r){case"sent":return await YB(n,e);case"history":return await zB(n,e);case"seen":return await ZB(n,e);case"pending":return await QB(n,e);case"read":return await tH(n,e);case"deliver":return await rH(n,e);case"handle":return await aH(n,e);case"ack":return await oH(n,e);case"tree":return await lH(n,e);default:return ee(e,s,"invalid_command",`unknown mail command: ${r}`)}}catch(i){return i instanceof Ee||i instanceof Fr?ee(e,s,i.errorKind,i.message):ee(e,s,"internal",i instanceof Error?i.message:String(i))}}async function YB(t,e){if(gr(t))return e.stdout.write(UB),0;let r=Vt(t),n=Q(yl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return ee(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=um(P(n,"--to"));if("error"in s)return ee(e,r,"invalid_arguments",s.error);let i=EH(P(n,"--since"));if("error"in i)return ee(e,r,"invalid_arguments",i.error);let o=P(n,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return ee(e,r,"invalid_arguments","--status must be queued or delivered");let a=mm(P(n,"--limit"));if("error"in a)return ee(e,r,"invalid_arguments",a.error);let l=zS(P(n,"--cursor"),"sent");if("error"in l)return ee(e,r,"invalid_arguments",l.error);if(l.value!==null&&(P(n,"--to")!==void 0||P(n,"--since")!==void 0||o!==void 0))return ee(e,r,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let d=await O(e,c=>{let u=l.value===null?Me(fm(c,e,"mail sent")):Me(l.value.self),f=l.value===null?s.value:l.value.to===null?null:Me(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,h=dH(c,u,f,m,p??void 0,a.value,l.value?.seq??null),_=h.next_seq===null?null:YS({v:1,kind:"sent",seq:h.next_seq,self:u.value,to:f?.value??null,since:m,status:p});return{schema_version:_r,schema:"event-log-v1",identity:u.value,filters:{to:f?.value??null,since:m,status:p},messages:h.messages,next_cursor:_}});if(V(n,"--json"))re(e,d);else{e.stdout.write(`Messages sent from ${d.identity}
|
|
2587
2587
|
`);for(let c of d.messages)e.stdout.write(`${c.created_at} ${c.message_id} ${c.message_type} ${c.lifecycle_state} -> ${c.receiver.teamfile}:${c.receiver.alias}
|
|
2588
2588
|
`);d.messages.length===0&&e.stdout.write(`(none)
|
|
2589
|
-
`)}return 0}async function zB(t,e){if(
|
|
2589
|
+
`)}return 0}async function zB(t,e){if(gr(t))return e.stdout.write(JB),0;let r=Vt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);let s=os(n.positionals,"history");if("error"in s)return ee(e,r,"invalid_id",s.error);let i=await O(e,a=>GS(a,s.value)),o={schema_version:_r,schema:"event-log-v1",message_id:s.value,events:i};if(V(n,"--json"))re(e,o);else{e.stdout.write(`History for ${s.value}
|
|
2590
2590
|
`);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
|
|
2591
|
-
`)}return 0}async function ZB(t,e){if(
|
|
2591
|
+
`)}return 0}async function ZB(t,e){if(gr(t))return e.stdout.write(GB),0;let r=Vt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);let s=os(n.positionals,"seen");if("error"in s)return ee(e,r,"invalid_id",s.error);let i=await O(e,o=>uH(o,s.value));return V(n,"--json")?re(e,i):(e.stdout.write(`${s.value}
|
|
2592
2592
|
`),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
|
|
2593
2593
|
`),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
|
|
2594
2594
|
`),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
|
|
2595
|
-
`)),0}async function QB(t,e){if(
|
|
2595
|
+
`)),0}async function QB(t,e){if(gr(t))return e.stdout.write(WB),0;let r=Vt(t),n=Q(yl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return ee(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=um(P(n,"--receiver"));if("error"in s)return ee(e,r,"invalid_arguments",s.error);let i=mm(P(n,"--limit"));if("error"in i)return ee(e,r,"invalid_arguments",i.error);let o=await O(e,l=>{let d=s.value;if(d===null){let m=dn(e.env??process.env,l);if(m.ok)d=Me(m.identity);else if(m.reason==="not-found")throw new Ee("self_identity",mr("mail pending"))}let c=d===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",u=d===null?[]:[d.teamfile,d.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
2596
2596
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq
|
|
2597
|
-
FROM message_pending ${
|
|
2598
|
-
ORDER BY created_seq ASC LIMIT ?`).all(...
|
|
2597
|
+
FROM message_pending ${c}
|
|
2598
|
+
ORDER BY created_seq ASC LIMIT ?`).all(...u,i.value);return{receiver:d,messages:f}}),a={schema_version:_r,schema:"event-log-v1",filters:{receiver:o.receiver===null?null:`${o.receiver.teamfile}:${o.receiver.alias}`,limit:i.value},messages:o.messages.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(V(n,"--json"))re(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
|
|
2599
2599
|
`);else for(let l of a.messages){let d=l.sender===null?"operator":`${l.sender.teamfile}:${l.sender.alias}`;e.stdout.write(`${l.message_id} ${l.lifecycle_state} ${d} -> ${l.receiver.teamfile}:${l.receiver.alias}
|
|
2600
2600
|
`)}return 0}function eH(t,e){let r=t.db.prepare(`SELECT event_type, payload FROM message_event
|
|
2601
2601
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2602
|
-
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new
|
|
2602
|
+
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ee("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:_r,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function tH(t,e){if(gr(t))return e.stdout.write(qB),0;let r=Vt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);let s=os(n.positionals,"read");if("error"in s)return ee(e,r,"invalid_id",s.error);let i=await O(e,o=>eH(o,s.value));if(V(n,"--json"))re(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
|
|
2603
2603
|
`),e.stdout.write(`from: ${o}
|
|
2604
2604
|
`),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
|
|
2605
2605
|
`),e.stdout.write(`state: ${i.pending_state??"terminal"}
|
|
2606
2606
|
`),e.stdout.write(`---
|
|
2607
2607
|
${i.content}
|
|
2608
|
-
`)}return 0}async function rH(t,e){if(
|
|
2608
|
+
`)}return 0}async function rH(t,e){if(gr(t))return e.stdout.write(BB),0;let r=Vt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);let s=os(n.positionals,"deliver");if("error"in s)return ee(e,r,"invalid_id",s.error);let i=await O(e,async a=>{let l=nH(a,s.value),d=await sH(a,e,l);return{pending:l,delivery:d}}),o={schema_version:_r,schema:"event-log-v1",message_id:i.pending.messageId,message_type:i.pending.messageType,receiver:i.pending.receiver,outcome:i.delivery.outcome,provider_status:i.delivery.providerStatus,message:i.delivery.message};return V(n,"--json")?re(e,o):e.stdout.write(`${o.message_id} ${o.outcome} -> ${o.receiver.teamfile}:${o.receiver.alias}${o.message===null?"":` ${o.message}`}
|
|
2609
2609
|
`),0}function nH(t,e){let r=t.db.prepare(`SELECT * FROM message_event
|
|
2610
2610
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2611
|
-
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new
|
|
2612
|
-
FROM message_pending WHERE message_id = ?`).get(e);if(s===void 0)throw new
|
|
2613
|
-
${t.receipt}`:`relay delivery error: ${t.error}`}async function oH(t,e){if(
|
|
2614
|
-
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new
|
|
2615
|
-
`),0}async function aH(t,e){if(
|
|
2616
|
-
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new
|
|
2617
|
-
`),0}async function lH(t,e){if(
|
|
2611
|
+
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ee("not_found",`no such message: ${e}`);let n=gl(r),s=t.db.prepare(`SELECT message_type, lifecycle_state
|
|
2612
|
+
FROM message_pending WHERE message_id = ?`).get(e);if(s===void 0)throw new Ee("invalid_state",`${e} is not pending`);if(s.lifecycle_state!=="queued")throw new Ee("invalid_state",`${e} is ${s.lifecycle_state}; only queued messages can be delivered`);let i=cn(n.payload.legacy)?n.payload.legacy:null,o=ZS(i?.id);if(i?.table!=="agent_mailbox"||o===null||!Number.isSafeInteger(o)||o<1)throw new Ee("data_error",`${e} does not reference a deliverable agent_mailbox row`);let a=t.getMailboxMessage(o);if(a===null)throw new Ee("data_error",`${e} references missing mailbox row ${o}`);if(a.message_type!==s.message_type||a.receiver_teamfile!==n.receiver_teamfile||a.receiver_alias!==n.receiver_alias)throw new Ee("data_error",`${e} mailbox/event identity does not match`);if(a.delivered_at!==null||a.delivering_at!==null)throw new Ee("invalid_state",`${e} legacy delivery state is not queued`);if(n.receiver_teamfile===null||n.receiver_alias===null)throw new Ee("data_error",`${e} is missing receiver identity`);return{row:a,messageId:e,messageType:s.message_type,receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias},leaseSender:a.sender_teamfile===null||a.sender_alias===null?{teamfile:a.receiver_teamfile,alias:"operator"}:{teamfile:a.sender_teamfile,alias:a.sender_alias}}}async function sH(t,e,r){let n=_t(t,r.receiver.teamfile,r.receiver.alias),s=!1;if(n.busy){if(n.reason==="terminal-held")return{outcome:"skipped_terminal",providerStatus:null,message:"receiver is terminal-held"};if(!await Qn(t,n,r.receiver.teamfile,r.receiver.alias))return{outcome:"skipped_busy",providerStatus:null,message:"receiver is busy"};s=!0}let i=Ne(r.receiver.teamfile,r.receiver.alias,t),o=Rt(t,{receiver_teamfile:r.receiver.teamfile,receiver_alias:r.receiver.alias,sender_teamfile:r.leaseSender.teamfile,sender_alias:r.leaseSender.alias,ttlMs:qt(),...s?{force:!0,reclaimReason:"session-idle"}:{}});if(!o.acquired)return{outcome:"skipped_busy",providerStatus:null,message:"receiver lease was acquired elsewhere"};let a={row:o.lease,leaseId:o.leaseId},l=e.env??process.env,d=Er(c=>t.heartbeatAgentInflight(a.row,a.leaseId,c),{intervalMs:hn(l)});try{let c={teamfile:r.receiver.teamfile,alias:r.receiver.alias,provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{},...i.isLead!==void 0?{isLead:i.isLead}:{}};if(r.messageType==="response"){let p=await Wa({sender:r.leaseSender,receiver:c,io:e,permissionMode:"yolo",env:l,onlyMailboxId:r.row.id}),h=t.getMailboxMessage(r.row.id),_=h!==null&&h.delivered_at!==null;return p.status==="ok"&&_?{outcome:"delivered",providerStatus:"ok",message:null}:{outcome:"error",providerStatus:p.status,message:p.error??(p.status==="stalled"?"provider stalled during response delivery":"response delivery was not finalized")}}let u=await Yn({sender:r.leaseSender,receiver:c,io:e,permissionMode:"yolo",env:l,finalize:"caller",onlyMailboxId:r.row.id}),f=iH(u),m=0;try{m=t.markRelayRequestDeliveredAndEnqueueResponses(u.queued,f,new Date().toISOString()).marked}catch(p){return{outcome:"error",providerStatus:u.status,message:`delivery finalization failed: ${p instanceof Error?p.message:String(p)}`}}return u.status==="ok"&&m===1?{outcome:"delivered",providerStatus:"ok",message:null}:{outcome:"error",providerStatus:u.status,message:u.status==="stalled"?"provider stalled during request delivery":u.status==="error"?u.error:"request delivery was not finalized"}}catch(c){throw c instanceof Error&&/^no queued (?:response )?mail to deliver/.test(c.message)?new Ee("invalid_state",`${r.messageId} was no longer queued when delivery claimed it`):c}finally{clearInterval(d);try{t.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function iH(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
|
|
2613
|
+
${t.receipt}`:`relay delivery error: ${t.error}`}async function oH(t,e){if(gr(t))return e.stdout.write(HB),0;let r=Vt(t),n=Q(yl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);let s=os(n.positionals,"ack");if("error"in s)return ee(e,r,"invalid_id",s.error);let i=P(n,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
|
|
2614
|
+
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ee("not_found",`no such message: ${s.value}`);let c=dn(e.env??process.env,l);if(!c.ok&&c.reason==="not-found")throw new Ee("self_identity",mr("mail ack"));let u=c.ok?c.identity:"operator",f=l.db.transaction(()=>{let m=t_(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:CB(),terminalizePending:V(n,"--terminalize-pending")});if(c.ok){let p=Me(c.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:u,ack:f}}),a={schema_version:_r,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return V(n,"--json")?re(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
|
|
2615
|
+
`),0}async function aH(t,e){if(gr(t))return e.stdout.write(XB),0;let r=Vt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);let s=os(n.positionals,"handle");if("error"in s)return ee(e,r,"invalid_id",s.error);let i=await O(e,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
|
|
2616
|
+
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ee("not_found",`no such message: ${s.value}`);let d=Me(fm(a,e,"mail handle"));return{identity:d,handling:e_(a.db,{messageId:s.value,handlingBy:d.value,handlingTeamfile:d.teamfile,handlingAlias:d.alias})}}),o={schema_version:_r,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return V(n,"--json")?re(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
|
|
2617
|
+
`),0}async function lH(t,e){if(gr(t))return e.stdout.write(KB),0;let r=Vt(t),n=Q(yl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(n.error!==void 0)return ee(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return ee(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=VS(P(n,"--since"),$B);if("error"in s)return ee(e,r,"invalid_arguments",s.error);let i=um(P(n,"--root"));if("error"in i)return ee(e,r,"invalid_arguments",i.error);let o=mm(P(n,"--limit"));if("error"in o)return ee(e,r,"invalid_arguments",o.error);let a=zS(P(n,"--cursor"),"tree");if("error"in a)return ee(e,r,"invalid_arguments",a.error);if(a.value!==null&&(P(n,"--root")!==void 0||P(n,"--since")!==void 0))return ee(e,r,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await O(e,d=>{let c=a.value===null?i.value??Me(fm(d,e,"mail tree")):Me(a.value.root),u=a.value?.since??s.iso,f=a.value?.since_label??P(n,"--since")??"24h",m=US(d,{root:{teamfile:c.teamfile,alias:c.alias},since:u,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:YS({v:1,kind:"tree",seq:m.next_seq,root:c.value,since:u,since_label:f});return{schema_version:_r,schema:"event-log-v1",root:{teamfile:c.teamfile,alias:c.alias},since:f,since_timestamp:u,sent:m.sent,next_cursor:p,orphan_policy:"Missing causal linkage, including a genuinely fresh or unprompted send before any inbound delivery, is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"External composition is causally linked by calling mail handle before a reactive send. A send remains an orphan root when no handle was declared or the handling pointer exceeded its one-hour TTL."}});if(V(n,"--json"))re(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
|
|
2618
2618
|
`);for(let d of l.sent)KS(e,d,0);l.sent.length===0&&e.stdout.write(`(none)
|
|
2619
2619
|
`),e.stdout.write(`
|
|
2620
2620
|
Note: ${l.orphan_policy}
|
|
@@ -2628,7 +2628,7 @@ Note: ${l.orphan_policy}
|
|
|
2628
2628
|
WHERE ${a.join(" AND ")}
|
|
2629
2629
|
ORDER BY e.seq DESC
|
|
2630
2630
|
LIMIT ?
|
|
2631
|
-
`).all(...l),c=d.length>i,u=d.slice(0,i);return{messages:u.map(m=>{if(m.receiver_teamfile===null||m.receiver_alias===null)throw new
|
|
2631
|
+
`).all(...l),c=d.length>i,u=d.slice(0,i);return{messages:u.map(m=>{if(m.receiver_teamfile===null||m.receiver_alias===null)throw new Ee("data_error",`${m.stream_id} ${m.event_type} is missing receiver identity`);return{message_id:m.stream_id,receiver:{teamfile:m.receiver_teamfile,alias:m.receiver_alias},message_type:m.event_type==="RESPONSE_CREATE"?"response":"request",created_at:m.ts,lifecycle_state:cH(t,m)}}),next_seq:c?u.at(-1).seq:null}}function cH(t,e){return e.pending_message_id!==null?e.delivery_lease_id!==null||e.pending_state==="claimed"?"delivering":"queued":t.db.prepare("SELECT 1 FROM message_event WHERE stream_id = ? AND event_type = 'HANDLED' LIMIT 1").get(e.stream_id)===void 0?"delivered":"handled"}async function uH(t,e){let r=GS(t,e),n=r.find(f=>wH(f.event_type))??r[0],s=[...r].reverse().find(f=>PB.includes(f.event_type))??null,i=[...r].reverse().find(f=>f.event_type==="HANDLED")??null,o=fH(t,e,r),a=gH(t,e),l=wi(n.payload.provider_prompt),d=_H(n.payload),c=await mH(o,{messageId:e,providerPrompt:l,legacyMailboxId:d,evidenceAt:s?.ts??i?.ts??null}),u=a===null&&c.matched_index!==null&&c.messages!==null?hH(c.messages,c.matched_index):null;return{schema_version:_r,schema:"event-log-v1",message_id:e,receiver:n.receiver_teamfile===null||n.receiver_alias===null?null:{teamfile:n.receiver_teamfile,alias:n.receiver_alias},db:{delivered:s!==null,handled:i!==null,delivered_at:s?.ts??i?.ts??null,delivered_by:s===null?null:yH(s.payload)},transcript:{checked:c.checked,found:c.matched_index!==null,seen_at:c.seen_at,session_id:o?.session_id??null,provider:o?.provider??null,reason:c.reason},answered:a!==null?{via:"db_response_event",response_message_id:a.stream_id,at:a.ts}:u===null?null:{via:"transcript_heuristic",response_message_id:null,at:u.timestamp.toISOString()}}}function GS(t,e){let r=t.db.prepare("SELECT * FROM message_event WHERE stream_id = ? ORDER BY seq ASC").all(e);if(r.length===0)throw new Ee("not_found",`message stream not found: ${e}`);return r.map(gl)}function gl(t){try{let e=JSON.parse(t.payload);if(!cn(e))throw new Ee("data_error",`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Ee?e:new Ee("data_error",`message_event seq ${t.seq} payload is invalid JSON`)}}function fH(t,e,r){for(let s of[...r].reverse()){let i=JS(s.payload,null);if(i!==null)return i}let n=t.db.prepare(`
|
|
2632
2632
|
SELECT invocation_id FROM invocation_state
|
|
2633
2633
|
WHERE request_message_id = ?
|
|
2634
2634
|
ORDER BY started_at ASC, invocation_id ASC
|
|
@@ -2636,7 +2636,7 @@ Note: ${l.orphan_policy}
|
|
|
2636
2636
|
SELECT * FROM message_event
|
|
2637
2637
|
WHERE stream_id = ? AND event_type = 'INVOCATION_START'
|
|
2638
2638
|
ORDER BY seq ASC
|
|
2639
|
-
`).all(s.invocation_id);for(let o of i){let a=JS(gl(o).payload,s.invocation_id);if(a!==null)return a}}return null}function JS(t,e){let r=
|
|
2639
|
+
`).all(s.invocation_id);for(let o of i){let a=JS(gl(o).payload,s.invocation_id);if(a!==null)return a}}return null}function JS(t,e){let r=cn(t.receiver)?t.receiver:null,n=cn(t.session)?t.session:null,s=wi(r?.provider,n?.provider,t.provider),i=wi(r?.session_id,n?.session_id,t.session_id);return s===null||!TH(s)||i===null?null:{provider:s,session_id:i,invocation_id:e}}async function mH(t,e){if(t===null)return{checked:!1,matched_index:null,seen_at:null,reason:"historical-session-not-recorded",messages:null};try{let r=await Fe(t.session_id,t.provider);if(r===null)return{checked:!0,matched_index:null,seen_at:null,reason:"session-not-found",messages:null};let n=pH(r.messages,e);return{checked:!0,matched_index:n<0?null:n,seen_at:n<0?null:r.messages[n].timestamp.toISOString(),reason:n<0?"message-id-not-found":null,messages:r.messages}}catch(r){return{checked:!0,matched_index:null,seen_at:null,reason:`read-error: ${r instanceof Error?r.message:String(r)}`,messages:null}}}function pH(t,e){let r=e.evidenceAt===null?Number.NaN:Date.parse(e.evidenceAt),s=t.map((a,l)=>({message:a,index:l})).filter(({message:a})=>a.role==="user").filter(({message:a})=>!Number.isFinite(r)||a.timestamp.getTime()<=r),i=s.find(({message:a})=>vH(a.content,e.messageId));if(i!==void 0)return i.index;if(e.legacyMailboxId!==null){let a=e.legacyMailboxId,l=[...s].reverse().find(({message:d})=>bH(d.content,a));if(l!==void 0)return l.index}return e.providerPrompt===null?-1:[...s].reverse().find(({message:a})=>a.content.includes(e.providerPrompt))?.index??-1}function _H(t){let e=cn(t.legacy)?t.legacy:null;return e?.table==="agent_mailbox"&&typeof e.id=="number"&&Number.isSafeInteger(e.id)&&e.id>0?e.id:null}function hH(t,e){for(let r of t.slice(e+1)){if(r.role==="user")return null;if(r.role==="assistant"&&r.content.trim().length>0)return r}return null}function gH(t,e){let r=t.db.prepare(`
|
|
2640
2640
|
SELECT response.* FROM message_event AS response
|
|
2641
2641
|
WHERE response.event_type = 'RESPONSE_CREATE'
|
|
2642
2642
|
AND (
|
|
@@ -2652,8 +2652,8 @@ Note: ${l.orphan_policy}
|
|
|
2652
2652
|
)
|
|
2653
2653
|
ORDER BY response.seq ASC
|
|
2654
2654
|
LIMIT 1
|
|
2655
|
-
`).get(e,e);return r===void 0?null:gl(r)}function yH(t){let e=
|
|
2656
|
-
`);for(let i of e.children)KS(t,i,r+1)}function os(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return DB.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function um(t){if(t===void 0)return{value:null};try{return{value:
|
|
2655
|
+
`).get(e,e);return r===void 0?null:gl(r)}function yH(t){let e=cn(t.delivered_by)?t.delivered_by:null;return{lease_id:wi(e?.lease_id,t.lease_id),pid:ZS(e?.pid,t.pid,t.holder_pid),host:wi(e?.host,t.host,t.holder_host)}}function KS(t,e,r){let n=" ".repeat(r),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${n}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
|
|
2656
|
+
`);for(let i of e.children)KS(t,i,r+1)}function os(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return DB.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function um(t){if(t===void 0)return{value:null};try{return{value:Me(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function yl(t,e){let r=new Set(e),n=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&r.has(o)?n.push(o,s.slice(i+1)):n.push(s)}return n}function EH(t){return t===void 0?{iso:null}:VS(t,null)}function VS(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let r=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(r!==null){let s=Number(r[1]),i=r[2]==="m"?6e4:r[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function fm(t,e,r){let n=dn(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ee("self_identity",mr(r)):new Ee("self_identity",zf(r))}function gr(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function Vt(t){return t.includes("--json")}function ee(t,e,r,n){return e?(re(t,{status:"error",errorKind:r,message:n}),1):N(t,n)}function mm(t){if(t===void 0)return{value:MB};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>XS?{error:`invalid --limit value: ${t}; expected 1..${XS}`}:{value:e}}function YS(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function zS(t,e){if(t===void 0)return{value:null};try{let r=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!cn(r)||r.v!==1||r.kind!==e||typeof r.seq!="number"||!Number.isSafeInteger(r.seq)||r.seq<1?{error:"invalid --cursor value"}:r.kind==="sent"?typeof r.self!="string"||!cm(r.self)||!(r.to===null||typeof r.to=="string"&&cm(r.to))||!(r.since===null||typeof r.since=="string"&&Number.isFinite(Date.parse(r.since)))||!(r.status===null||r.status==="queued"||r.status==="delivered")?{error:"invalid --cursor value"}:{value:r}:typeof r.root!="string"||!cm(r.root)||typeof r.since!="string"||!Number.isFinite(Date.parse(r.since))||typeof r.since_label!="string"||r.since_label.length===0?{error:"invalid --cursor value"}:{value:r}}catch{return{error:"invalid --cursor value"}}}function cm(t){try{return Me(t),!0}catch{return!1}}function wH(t){return jB.includes(t)}function TH(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","ClaudeMock"].includes(t)}function cn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function vH(t,e){let r=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${r}(?:$|[^A-Za-z0-9_-])`).test(t)}function bH(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function wi(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function ZS(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var $B,MB,XS,_r,DB,jB,PB,hr,FB,UB,WB,qB,BB,HB,XB,JB,GB,KB,Ee,ek=T(()=>{"use strict";oi();Lt();bs();Xt();HS();$e();Ba();Za();ml();_i();at();$B=24*60*60*1e3,MB=100,XS=1e3,_r=1,DB=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,jB=["CREATE","RESPONSE_CREATE"],PB=["DELIVERED","RESPONSE_DELIVERED"],hr=`schema_version is the output-contract version consumers must switch on.
|
|
2657
2657
|
schema identifies the backing event-log substrate; it is not a second output version.`,FB=`usage:
|
|
2658
2658
|
lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
|
|
2659
2659
|
lmctl mail history <message_id> [--json]
|
|
@@ -2679,8 +2679,9 @@ agent_mailbox id and drives that row through the existing delivery machinery.
|
|
|
2679
2679
|
in event payloads. It never reads a teamfile's current session id.
|
|
2680
2680
|
pending List undelivered messages from the message_pending projection \u2014
|
|
2681
2681
|
the event-substrate view, NOT the legacy mailbox tables, so it
|
|
2682
|
-
agrees exactly with what read/ack can operate on.
|
|
2683
|
-
|
|
2682
|
+
agrees exactly with what read/ack can operate on. Defaults to SELF
|
|
2683
|
+
in a member session; from an operator shell it remains fleet-wide.
|
|
2684
|
+
--receiver explicitly selects another identity.
|
|
2684
2685
|
read Return one message's content. A plain read query \u2014 no delivery,
|
|
2685
2686
|
no dispatch, no state change of any kind.
|
|
2686
2687
|
deliver CAS-claim and deliver exactly one queued message through one
|
|
@@ -2719,7 +2720,7 @@ With --json, the stable external contract is:
|
|
|
2719
2720
|
{"schema_version":1,"schema":"event-log-v1","identity":"<teamfile>:<alias>",
|
|
2720
2721
|
"filters":{"to":null,"since":null,"status":null},
|
|
2721
2722
|
"messages":[...],"next_cursor":"<opaque token>"|null}
|
|
2722
|
-
${
|
|
2723
|
+
${hr}
|
|
2723
2724
|
Default text output is human-readable and may change without notice.
|
|
2724
2725
|
`,WB=`usage:
|
|
2725
2726
|
lmctl mail pending [--receiver <teamfile:alias>] [--limit N] [--json]
|
|
@@ -2728,10 +2729,10 @@ Lists undelivered messages (lifecycle queued or claimed) straight from the
|
|
|
2728
2729
|
event-substrate's message_pending projection, oldest first. This is the
|
|
2729
2730
|
discovery primitive for relay scripts: unlike the legacy mailbox view in
|
|
2730
2731
|
"lmctl status", every id it returns is guaranteed readable/ackable via
|
|
2731
|
-
"mail read"/"mail ack" (same substrate).
|
|
2732
|
-
|
|
2732
|
+
"mail read"/"mail ack" (same substrate). Without --receiver, a member session
|
|
2733
|
+
defaults to SELF; a plain operator shell with no SELF marker remains fleet-wide.
|
|
2733
2734
|
|
|
2734
|
-
--receiver <teamfile:alias>
|
|
2735
|
+
--receiver <teamfile:alias> explicitly select this identity instead of SELF
|
|
2735
2736
|
--limit N default 100, maximum 1000
|
|
2736
2737
|
|
|
2737
2738
|
With --json, the stable external contract is:
|
|
@@ -2742,7 +2743,7 @@ With --json, the stable external contract is:
|
|
|
2742
2743
|
"sender":{"teamfile":"...","alias":"..."}|null,
|
|
2743
2744
|
"receiver":{"teamfile":"...","alias":"..."},
|
|
2744
2745
|
"lifecycle_state":"queued"|"claimed","created_seq":N}]}
|
|
2745
|
-
${
|
|
2746
|
+
${hr}
|
|
2746
2747
|
Default text output is human-readable and may change without notice.
|
|
2747
2748
|
`,qB=`usage:
|
|
2748
2749
|
lmctl mail read <message_id> [--json]
|
|
@@ -2761,7 +2762,7 @@ With --json, the stable external contract is:
|
|
|
2761
2762
|
"pending_state":"queued"|"claimed"|null}
|
|
2762
2763
|
pending_state null means the message is terminal (delivered or acknowledged);
|
|
2763
2764
|
read never changes it.
|
|
2764
|
-
${
|
|
2765
|
+
${hr}
|
|
2765
2766
|
Default text output is human-readable and may change without notice.
|
|
2766
2767
|
`,BB=`usage:
|
|
2767
2768
|
lmctl mail deliver <message_id> [--json]
|
|
@@ -2786,7 +2787,7 @@ With --json, the stable external contract is:
|
|
|
2786
2787
|
Delivery-attempt outcomes use this envelope and exit successfully so relay
|
|
2787
2788
|
consumers can branch on outcome. Invalid ids/state and command failures use
|
|
2788
2789
|
the uniform {"status":"error","errorKind":"...","message":"..."} envelope.
|
|
2789
|
-
${
|
|
2790
|
+
${hr}
|
|
2790
2791
|
Default text output is human-readable and may change without notice.
|
|
2791
2792
|
`,HB=`usage:
|
|
2792
2793
|
lmctl mail ack <message_id> [--terminalize-pending] [--note <text>] [--json]
|
|
@@ -2822,7 +2823,7 @@ appended false means this actor had already acknowledged (deduplicated
|
|
|
2822
2823
|
repeat). pending_outcome "record-only" = terminalize not requested;
|
|
2823
2824
|
"removed" = this ack terminalized the queued message; "claimed" = a delivery
|
|
2824
2825
|
in flight won instead; "not-pending" = the message was already terminal.
|
|
2825
|
-
${
|
|
2826
|
+
${hr}
|
|
2826
2827
|
Default text output is human-readable and may change without notice.
|
|
2827
2828
|
`,XB=`usage:
|
|
2828
2829
|
lmctl mail handle <message_id> [--json]
|
|
@@ -2843,7 +2844,7 @@ With --json, the stable external contract is:
|
|
|
2843
2844
|
"appended":true|false}
|
|
2844
2845
|
appended false means this actor had already declared handling for this message;
|
|
2845
2846
|
the causal pointer and its one-hour freshness timestamp are still refreshed.
|
|
2846
|
-
${
|
|
2847
|
+
${hr}
|
|
2847
2848
|
Default text output is human-readable and may change without notice.
|
|
2848
2849
|
`,JB=`usage:
|
|
2849
2850
|
lmctl mail history <message_id> [--json]
|
|
@@ -2853,7 +2854,7 @@ Returns one message stream in message_event.seq order.
|
|
|
2853
2854
|
With --json, the stable external contract is:
|
|
2854
2855
|
{"schema_version":1,"schema":"event-log-v1",
|
|
2855
2856
|
"message_id":"msg_...","events":[...]}
|
|
2856
|
-
${
|
|
2857
|
+
${hr}
|
|
2857
2858
|
Default text output is human-readable and may change without notice.
|
|
2858
2859
|
`,GB=`usage:
|
|
2859
2860
|
lmctl mail seen <message_id> [--json]
|
|
@@ -2869,7 +2870,7 @@ combination means "handled inline," not an inconsistency.
|
|
|
2869
2870
|
With --json, the stable external contract is:
|
|
2870
2871
|
{"schema_version":1,"schema":"event-log-v1","message_id":"msg_...",
|
|
2871
2872
|
"receiver":{...}|null,"db":{...},"transcript":{...},"answered":...}
|
|
2872
|
-
${
|
|
2873
|
+
${hr}
|
|
2873
2874
|
Default text output is human-readable and may change without notice.
|
|
2874
2875
|
`,KB=`usage:
|
|
2875
2876
|
lmctl mail tree [--root <teamfile:alias>] [--since <duration|ISO>]
|
|
@@ -2884,9 +2885,9 @@ With --json, the stable external contract is:
|
|
|
2884
2885
|
"since":"24h","since_timestamp":"<ISO>","sent":[...],
|
|
2885
2886
|
"next_cursor":"<opaque token>"|null,"orphan_policy":"...",
|
|
2886
2887
|
"incomplete_capture_note":"..."}
|
|
2887
|
-
${
|
|
2888
|
+
${hr}
|
|
2888
2889
|
Default text output is human-readable and may change without notice.
|
|
2889
|
-
`,
|
|
2890
|
+
`,Ee=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as tk,mkdirSync as SH,readdirSync as kH,readFileSync as rk,writeFileSync as IH}from"node:fs";import{join as as}from"node:path";import{fileURLToPath as NH}from"node:url";function xH(t){try{return AH.some(e=>tk(as(t,e)))}catch{return!1}}function RH(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function nk(t,e){t.durable_memory_mode!=="db"?LH(t):OH(t,e)}function sk(t){let e=xH(t),r;try{r=kH(El).filter(n=>n.endsWith(".template")).sort()}catch(n){return M({event:"bootstrap_templates_unreadable",path:El,error_message:n instanceof Error?n.message:String(n)}),[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function LH(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),M({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=as(e,"durable-memory");try{SH(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),M({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=sk(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=as(r,o);if(!tk(a))try{let l=rk(as(El,i),"utf8");IH(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),M({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function OH(t,e){let r=t.local_path??"",n=sk(r),s=[];for(let i of n){let o=as(El,i),a;try{a=rk(o,"utf8")}catch(d){console.error(`[bootstrap] failed to read ${i}:`,d),M({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:d instanceof Error?d.message:String(d)});continue}let l=RH(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),M({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path: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(d){console.error(`[bootstrap] failed to upsert ${l.name}:`,d),M({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:d instanceof Error?d.message:String(d)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var El,AH,ik=T(()=>{"use strict";pe();El=as(NH(import.meta.url),"../../config/durable_memory_templates"),AH=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as CH}from"node:crypto";import{existsSync as $H,mkdirSync as MH,writeFileSync as DH}from"node:fs";import{dirname as jH,join as ls}from"node:path";function pm(t){return typeof t=="string"&&t.startsWith(ok)}function BH(t){if(!pm(t))throw new It(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(ok.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(!WH.has(n))throw new It(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));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,...i!==void 0&&i.length>0?{ref:i}:{}}}function HH(t,e,r){if(t==="workflow")return oa(e,r);let n=t==="mcp"?ls("templates","mcp",`${e}.json`):ls("templates","skills",e,"SKILL.md");for(let s of mu(r)){let i=ls(s,n);if($H(i))return i}return null}function XH(t,e,r){let n=ls(fu(r),FH,t);return t==="skill"?ls(n,e,"SKILL.md"):ls(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function JH(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 ak(t,e){let{kind:r,name:n,ref:s}=BH(t),i=HH(r,n,e);if(i!==null)return i;let o=`${PH}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(UH)})}catch(c){throw new It(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${c instanceof Error?c.message:String(c)}). Failing closed.`,"missing")}if(!a.ok)throw new It(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let c=qH.exec(s);if(c!==null){let u=CH("sha256").update(l).digest("hex");if(u.toLowerCase()!==c[1].toLowerCase())throw new It(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${c[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!JH(r,l))throw new It(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let d=XH(r,n,e);return MH(jH(d),{recursive:!0}),DH(d,l,"utf8"),d}var ok,PH,FH,UH,WH,It,qH,lk=T(()=>{"use strict";pu();ok="lmctl://",PH="https://lmctl.com/templates/",FH=".cache",UH=8e3,WH=new Set(["workflow","mcp","skill"]),It=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},qH=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as GH}from"node:child_process";import{cpSync as dk,existsSync as KH,mkdirSync as VH,mkdtempSync as YH,readFileSync as Dte,statSync as zH,writeFileSync as ck}from"node:fs";import{homedir as ZH,tmpdir as QH}from"node:os";import{basename as uk,join as Nt}from"node:path";function _m(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function hm(t,e,r){if(Array.isArray(t)){for(let n of t)hm(n,e,r);return}if(_m(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))hm(n,e,r)}}function n2(t,e){let r={mcp:[],skills:[]},n=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!_m(a)||!Array.isArray(a.steps)))for(let l of a.steps)_m(l)&&l.members!==void 0&&hm(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(r2(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function s2(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function i2(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(e2)})}catch(s){throw new Ur(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Ur(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>fk)throw new Ur(e,`fetched ${t} exceeds ${fk} bytes`);return n}function o2(t,e,r,n){let s=GH(t,e,{cwd:r,env:Tr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new Ur(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Ur(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function a2(t){if(typeof t!="string")return t.name;let e=uk(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?uk(t.replace(/\/skill\.md$/i,"")):e}async function mk(t,e,r){let n=a2(t),s=Nt(e,n);if(VH(s,{recursive:!0}),typeof t!="string")return ck(Nt(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(pm(t)&&(t=await ak(t)),_k.test(t))return ck(Nt(s,"SKILL.md"),await i2(t,r),"utf8"),{name:n,dir:s};if(!KH(t))throw new Ur(r,`skill path not found: ${t}`);return zH(t).isDirectory()?(dk(t,s,{recursive:!0}),{name:n,dir:s}):(dk(t,Nt(s,"SKILL.md")),{name:n,dir:s})}async function hk(t){let{dal:e,member:r,stderr:n}=t,s=n2(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Qe(r),o=r.sessiondir||t.baseDir||s2(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
2890
2891
|
`)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(t2.has(i))a(`skills for ${i} 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(i==="gemini"||i==="agy"){let l=YH(Nt(QH(),`lmctl-skill-${r.alias}-`));for(let d of s.skills){let c=typeof d=="string"&&!_k.test(d)?d:(await mk(d,l,r.alias)).dir;o2(i,["skills","install",c,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(pk[i]!==void 0){let l=pk[i]();for(let d of s.skills)await mk(d,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Ur,_k,e2,fk,t2,r2,Ti,pk,gk=T(()=>{"use strict";dt();lk();gt();pi();Ur=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},_k=/^https?:\/\//i,e2=8e3,fk=1e6,t2=new Set(["opencode"]),r2=t=>JSON.stringify(t),Ti=()=>process.env.HOME??ZH();pk={claude:()=>Nt(Ti(),".claude","skills"),qwen:()=>Nt(Ti(),".qwen","skills"),codex:()=>Nt(Ti(),".codex","skills"),copilot:()=>Nt(Ti(),".copilot","skills"),kimi:()=>Nt(process.env.KIMI_CODE_HOME??Nt(Ti(),".kimi-code"),"skills")}});var gm,yk=T(()=>{"use strict";gm=`---
|
|
2891
2892
|
|
|
2892
2893
|
# Durable memory \u2014 how to use it
|
|
@@ -2926,8 +2927,8 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
|
2926
2927
|
refresh to create/update native provider sessions for team members.
|
|
2927
2928
|
team refresh rejects Lead members (alias matching is case-insensitive).
|
|
2928
2929
|
`});var Ak={};he(Ak,{applyMaxBytes:()=>wl,renderMessage:()=>Ik,runTail:()=>b2});async function b2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${v2}
|
|
2929
|
-
`),0;let r=Q(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return N(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return N(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?w2:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return N(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=V(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?T2:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return N(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let d=P(r,"--run");if(d!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return N(e,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(d,10);if(!Number.isFinite(m)||m<=0||String(m)!==d)return N(e,`invalid --run "${d}" (expected a positive integer run id)`);try{return await O(e,async p=>S2(e,p,m,i,o,l))}catch(p){return Ke(e,p)}}let c=
|
|
2930
|
-
`)}},h=setInterval(()=>{p()},l*1e3),_=()=>{clearInterval(h),m(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function vk(t,e,r,n,s){let i;try{i=await
|
|
2930
|
+
`),0;let r=Q(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return N(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return N(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?w2:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return N(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=V(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?T2:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return N(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let d=P(r,"--run");if(d!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return N(e,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(d,10);if(!Number.isFinite(m)||m<=0||String(m)!==d)return N(e,`invalid --run "${d}" (expected a positive integer run id)`);try{return await O(e,async p=>S2(e,p,m,i,o,l))}catch(p){return Ke(e,p)}}let c=Dr(E2,{target:r.positionals[0],alias:r.positionals[1],flags:{session:P(r,"--session"),provider:P(r,"--provider")}});if(c.mode==="error")return N(e,c.message);if(c.mode==="managed")return N(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let m;try{m=await O(e,_=>Se(c.teamfile,_))}catch(_){return N(e,`tail: ${_ instanceof Error?_.message:String(_)}`)}let p;try{p=ot(m)}catch(_){return N(e,`tail: ${_ instanceof Error?_.message:String(_)}`)}let h=Ht(p);if(h===void 0)return N(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let _=await O(e,g=>Ne(c.teamfile,h.alias,g));u={provider:_.provider,sessionId:_.sessionid,cwd:_.sessiondir}}catch(_){return _ instanceof ke?N(e,_.message):Ke(e,_)}}else try{let m=await O(e,p=>Ne(c.teamfile,c.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ke?N(e,m.message):Ke(e,m)}else{let m=c.sessionid,p=c.provider;if(p===void 0){let h=await Zn(m);if(h.length===0)return N(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return N(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:m}}let f=await vk(e,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let g=await vk(e,u.provider,u.sessionId,i,f);g>=0&&(f=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
|
|
2931
|
+
`)}},h=setInterval(()=>{p()},l*1e3),_=()=>{clearInterval(h),m(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function vk(t,e,r,n,s){let i;try{i=await Fe(r,e)}catch(d){return t.stderr.write(`tail: failed to load session: ${d instanceof Error?d.message:String(d)}
|
|
2931
2932
|
`),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
2932
2933
|
`),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let d=a;d<o.length;d+=1)l+=`${Ik(o[d])}
|
|
2933
2934
|
`;return t.stdout.write(n.kind==="bytes"?wl(l,n.maxBytes):l),o.length-1}function Ik(t){let e=Nk(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
|
|
@@ -2946,8 +2947,8 @@ ${o.map(a=>` ${a}`).join(`
|
|
|
2946
2947
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
2947
2948
|
A bare <teamfile> with no alias tails that team's Lead member.
|
|
2948
2949
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;bk=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2949
|
-
`});var Rk,Lk=T(()=>{"use strict";Rk=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"])});var Fk={};he(Fk,{buildSessionInspection:()=>Dk,runSession:()=>R2});import{readFile as k2}from"node:fs/promises";async function R2(t,e,r=N2){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return re(e,{schema_version:Em,usage:$k}),0;let n=Q(t,["--query-file"],[]);if(n.error!==void 0)return Wr(e,n.error,!0);if(n.positionals.length>0)return Wr(e,"positional and inline JSON arguments are not supported; use --query-file",!0);let s=P(n,"--query-file");if(s===void 0)return Wr(e,"missing required --query-file",!0);let i;try{i=s==="-"?await X2(e.stdin??process.stdin):await k2(s,"utf8")}catch(u){return Wr(e,`cannot read query file ${JSON.stringify(s)}: ${vi(u)}`)}let o;try{o=O2(i)}catch(u){return Wr(e,vi(u))}let a,l,d;try{if(o.teamfile!==void 0&&o.alias!==void 0){let u=await r.resolveTeamTarget(o.teamfile,o.alias,e);a=u.provider,l=u.sessionid,d=u.alias}else a=o.provider,l=o.sessionId}catch(u){return Wr(e,vi(u))}let c;try{c=await r.loadSession(l,a)}catch(u){return Wr(e,`failed to load session: ${vi(u)}`)}return c===null?Wr(e,`session not found: ${l} (provider=${a})`):(re(e,Dk(c,d)),0)}function Dk(t,e){let r=q2(t.messages),n=B2(r,I2),s=j2(t,r!==null),i=C2(t),o=e?.toLowerCase()==="lead",a=i.filter(u=>u.kind==="file_write").length,l=i.filter(u=>u.kind==="file_edit").length,d=bi[t.provider],c=e===void 0?d==="none"?"none":"partial":d;return{schema_version:Em,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:n.text,lastPromptTruncated:n.truncated,handled:s.value,handledSignal:s.signal,tokens:P2(t),toolCalls:i,authorship:{alias:e??null,isLeadAlias:o,selfFileWriteCount:a,selfFileEditCount:l,flag:o&&a+l>0?"lead_self_authoring":null},coverage:{toolCalls:bi[t.provider],resultPairing:Mk[t.provider],backgroundTaskCorrelation:L2(t.provider),authorship:c,tokens:A2[t.provider],handled:s.coverage}}}function L2(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function O2(t){let e;try{e=JSON.parse(t)}catch(l){throw new Error(`query is not valid JSON: ${vi(l)}`)}if(!Pk(e))throw new Error("query must be a JSON object");let r=Tl(e.teamfile),n=Tl(e.alias),s=Tl(e.provider),i=Tl(e.sessionId),o=r!==void 0||n!==void 0,a=s!==void 0||i!==void 0;if(o&&a)throw new Error("query must use exactly one target form: teamfile+alias or provider+sessionId");if(o){if(r===void 0||n===void 0)throw new Error("team target requires both teamfile and alias");return{teamfile:r,alias:n}}if(a){if(s===void 0||i===void 0)throw new Error("raw target requires both provider and sessionId");if(!Rk.has(s))throw new Error(`invalid provider ${JSON.stringify(s)}`);return{provider:s,sessionId:i}}throw new Error("query requires teamfile+alias or provider+sessionId")}function C2(t){if(bi[t.provider]==="none")return[];let e=x2[t.provider]??{},r=new Set,n=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??H2(i.toolInput),l=o===void 0?void 0:$2(o,a),d=D2(t.messages,s,i.toolCallId,r,t.provider==="agy"),c=d===void 0?void 0:t.messages[d];d!==void 0&&r.add(d);let u=o===void 0?[]:M2(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)n.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:c?.timestamp.toISOString()??null,result:c===void 0?null:c.toolDetailedContent??c.content})}return n}function $2(t,e){if(e!==void 0)for(let r of[t.inputKey,...t.fallbackInputKeys??[]]){let n=ym(e[r]);if(n!==void 0)return n}}function M2(t,e){if(t.multi===void 0||e===void 0)return[];let r=e[t.multi.pathsKey],n=e[t.multi.kindsKey];if(!Array.isArray(r)||!Array.isArray(n))return[];let s=[];for(let i=0;i<Math.min(r.length,n.length);i+=1){let o=ym(r[i]),a=ym(n[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function D2(t,e,r,n,s){if(r===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!n.has(o)&&a.role==="tool_result"&&a.toolCallId===r)return o}}function j2(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let r=jk(t.messages,"user");return{value:r>=0&&t.messages.slice(r+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function P2(t){let e=t.lastTokenUsage,r=U2(t),n=W2(t.provider);return{lastTurn:F2(e),aggregate:{input:r,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:n}}function F2(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function U2(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function W2(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function q2(t){let e=jk(t,"user");return e<0?null:t[e].content}function jk(t,e){for(let r=t.length-1;r>=0;r-=1)if(t[r].role===e)return r;return-1}function B2(t,e){if(t===null)return{text:null,truncated:!1};let r=Buffer.from(t,"utf8");if(r.length<=e)return{text:t,truncated:!1};let n=e;for(;n>0&&(r[n]&192)===128;)n-=1;return{text:r.subarray(0,n).toString("utf8"),truncated:!0}}function H2(t){if(t!==void 0)try{let e=JSON.parse(t);return Pk(e)?e:void 0}catch{return}}function Pk(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Tl(t){return typeof t=="string"&&t.trim().length>0?t:void 0}function ym(t){return typeof t=="string"?t:void 0}async function X2(t){let e="";for await(let r of t)e+=Buffer.isBuffer(r)?r.toString("utf8"):String(r);return e}function Wr(t,e,r=!1){return re(t,{schema_version:Em,error:e,...r?{usage:$k}:{}}),1}function vi(t){return t instanceof Error?t.message:String(t)}var Em,I2,$k,N2,bi,Mk,Ok,A2,Ck,x2,Uk=T(()=>{"use strict";Lk();Xt();$e();at();Em=1,I2=32*1024,$k="usage: lmctl session --query-file <path> (- reads JSON from stdin)",N2={loadSession:Pe,resolveTeamTarget:(t,e,r)=>O(r,n=>Ne(t,e,n))},bi={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Mk={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},Ok={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(bi))if(Ok[Mk[t]]>Ok[bi[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);A2={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Ck={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},x2={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:Ck,lmplayer:Ck,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});var Kk={};he(Kk,{runInfo:()=>Y2});import{execFileSync as wm}from"node:child_process";import{dirname as Wk,resolve as J2}from"node:path";function V2(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function Y2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${K2}
|
|
2950
|
-
`),0;let r=Q(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=V(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return N(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>Z2(e,u,c,n))}catch(u){return Ke(e,u)}}let i=
|
|
2950
|
+
`});var Rk,Lk=T(()=>{"use strict";Rk=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"])});var Fk={};he(Fk,{buildSessionInspection:()=>Dk,runSession:()=>R2});import{readFile as k2}from"node:fs/promises";async function R2(t,e,r=N2){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return re(e,{schema_version:Em,usage:$k}),0;let n=Q(t,["--query-file"],[]);if(n.error!==void 0)return Wr(e,n.error,!0);if(n.positionals.length>0)return Wr(e,"positional and inline JSON arguments are not supported; use --query-file",!0);let s=P(n,"--query-file");if(s===void 0)return Wr(e,"missing required --query-file",!0);let i;try{i=s==="-"?await X2(e.stdin??process.stdin):await k2(s,"utf8")}catch(u){return Wr(e,`cannot read query file ${JSON.stringify(s)}: ${vi(u)}`)}let o;try{o=O2(i)}catch(u){return Wr(e,vi(u))}let a,l,d;try{if(o.teamfile!==void 0&&o.alias!==void 0){let u=await r.resolveTeamTarget(o.teamfile,o.alias,e);a=u.provider,l=u.sessionid,d=u.alias}else a=o.provider,l=o.sessionId}catch(u){return Wr(e,vi(u))}let c;try{c=await r.loadSession(l,a)}catch(u){return Wr(e,`failed to load session: ${vi(u)}`)}return c===null?Wr(e,`session not found: ${l} (provider=${a})`):(re(e,Dk(c,d)),0)}function Dk(t,e){let r=q2(t.messages),n=B2(r,I2),s=j2(t,r!==null),i=C2(t),o=e?.toLowerCase()==="lead",a=i.filter(u=>u.kind==="file_write").length,l=i.filter(u=>u.kind==="file_edit").length,d=bi[t.provider],c=e===void 0?d==="none"?"none":"partial":d;return{schema_version:Em,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:n.text,lastPromptTruncated:n.truncated,handled:s.value,handledSignal:s.signal,tokens:P2(t),toolCalls:i,authorship:{alias:e??null,isLeadAlias:o,selfFileWriteCount:a,selfFileEditCount:l,flag:o&&a+l>0?"lead_self_authoring":null},coverage:{toolCalls:bi[t.provider],resultPairing:Mk[t.provider],backgroundTaskCorrelation:L2(t.provider),authorship:c,tokens:A2[t.provider],handled:s.coverage}}}function L2(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function O2(t){let e;try{e=JSON.parse(t)}catch(l){throw new Error(`query is not valid JSON: ${vi(l)}`)}if(!Pk(e))throw new Error("query must be a JSON object");let r=Tl(e.teamfile),n=Tl(e.alias),s=Tl(e.provider),i=Tl(e.sessionId),o=r!==void 0||n!==void 0,a=s!==void 0||i!==void 0;if(o&&a)throw new Error("query must use exactly one target form: teamfile+alias or provider+sessionId");if(o){if(r===void 0||n===void 0)throw new Error("team target requires both teamfile and alias");return{teamfile:r,alias:n}}if(a){if(s===void 0||i===void 0)throw new Error("raw target requires both provider and sessionId");if(!Rk.has(s))throw new Error(`invalid provider ${JSON.stringify(s)}`);return{provider:s,sessionId:i}}throw new Error("query requires teamfile+alias or provider+sessionId")}function C2(t){if(bi[t.provider]==="none")return[];let e=x2[t.provider]??{},r=new Set,n=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??H2(i.toolInput),l=o===void 0?void 0:$2(o,a),d=D2(t.messages,s,i.toolCallId,r,t.provider==="agy"),c=d===void 0?void 0:t.messages[d];d!==void 0&&r.add(d);let u=o===void 0?[]:M2(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)n.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:c?.timestamp.toISOString()??null,result:c===void 0?null:c.toolDetailedContent??c.content})}return n}function $2(t,e){if(e!==void 0)for(let r of[t.inputKey,...t.fallbackInputKeys??[]]){let n=ym(e[r]);if(n!==void 0)return n}}function M2(t,e){if(t.multi===void 0||e===void 0)return[];let r=e[t.multi.pathsKey],n=e[t.multi.kindsKey];if(!Array.isArray(r)||!Array.isArray(n))return[];let s=[];for(let i=0;i<Math.min(r.length,n.length);i+=1){let o=ym(r[i]),a=ym(n[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function D2(t,e,r,n,s){if(r===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!n.has(o)&&a.role==="tool_result"&&a.toolCallId===r)return o}}function j2(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let r=jk(t.messages,"user");return{value:r>=0&&t.messages.slice(r+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function P2(t){let e=t.lastTokenUsage,r=U2(t),n=W2(t.provider);return{lastTurn:F2(e),aggregate:{input:r,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:n}}function F2(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function U2(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function W2(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function q2(t){let e=jk(t,"user");return e<0?null:t[e].content}function jk(t,e){for(let r=t.length-1;r>=0;r-=1)if(t[r].role===e)return r;return-1}function B2(t,e){if(t===null)return{text:null,truncated:!1};let r=Buffer.from(t,"utf8");if(r.length<=e)return{text:t,truncated:!1};let n=e;for(;n>0&&(r[n]&192)===128;)n-=1;return{text:r.subarray(0,n).toString("utf8"),truncated:!0}}function H2(t){if(t!==void 0)try{let e=JSON.parse(t);return Pk(e)?e:void 0}catch{return}}function Pk(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Tl(t){return typeof t=="string"&&t.trim().length>0?t:void 0}function ym(t){return typeof t=="string"?t:void 0}async function X2(t){let e="";for await(let r of t)e+=Buffer.isBuffer(r)?r.toString("utf8"):String(r);return e}function Wr(t,e,r=!1){return re(t,{schema_version:Em,error:e,...r?{usage:$k}:{}}),1}function vi(t){return t instanceof Error?t.message:String(t)}var Em,I2,$k,N2,bi,Mk,Ok,A2,Ck,x2,Uk=T(()=>{"use strict";Lk();Xt();$e();at();Em=1,I2=32*1024,$k="usage: lmctl session --query-file <path> (- reads JSON from stdin)",N2={loadSession:Fe,resolveTeamTarget:(t,e,r)=>O(r,n=>Ne(t,e,n))},bi={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Mk={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},Ok={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(bi))if(Ok[Mk[t]]>Ok[bi[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);A2={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Ck={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},x2={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:Ck,lmplayer:Ck,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});var Kk={};he(Kk,{runInfo:()=>Y2});import{execFileSync as wm}from"node:child_process";import{dirname as Wk,resolve as J2}from"node:path";function V2(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function Y2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${K2}
|
|
2951
|
+
`),0;let r=Q(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=V(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return N(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>Z2(e,u,c,n))}catch(u){return Ke(e,u)}}let i=Dr(G2,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return N(e,i.message);if(i.mode==="managed")return N(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let c;try{c=await O(e,u=>Se(i.teamfile,u))}catch(u){return N(e,`health: ${u instanceof Error?u.message:String(u)}`)}return Q2(e,c,n)}let o,a,l,d;if(i.mode==="ai-team")try{let c=await O(e,u=>Ne(i.teamfile,i.alias,u));o=c.provider,a=c.sessionid,l=c.alias,d={teamfile:c.teamfile,alias:c.alias}}catch(c){return c instanceof ke?N(e,c.message):Ke(e,c)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let c=await Zn(a);if(c.length===0)return N(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return N(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);o=c[0]}return z2(e,o,a,l,n,d)}async function z2(t,e,r,n,s,i){let o;try{o=await Fe(r,e)}catch(c){return N(t,`health: failed to load session: ${c instanceof Error?c.message:String(c)}`)}if(o===null)return N(t,`health: session not found: ${r} (provider=${e})`);let a=yi(o.messages),l=i===void 0?null:await eX(t,i,o),d={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(re(t,d),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2951
2952
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
2952
2953
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
2953
2954
|
`),l!==null&&t.stdout.write(` Liveness: ${Tm(l.liveness)}
|
|
@@ -2961,7 +2962,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
2961
2962
|
`),a!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${Hk(a)}
|
|
2962
2963
|
`),t.stdout.write(` Created: ${d.createdAt}
|
|
2963
2964
|
`),t.stdout.write(` Modified: ${d.modifiedAt}
|
|
2964
|
-
`),0)}async function Z2(t,e,r,n){let s=zr(e,r);if(s===null)return N(t,`health: run ${r}: not found`);let i
|
|
2965
|
+
`),0)}async function Z2(t,e,r,n){let s=zr(e,r);if(s===null)return N(t,`health: run ${r}: not found`);let i=$n(e,r),o=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let d=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(d,(a.get(d)??0)+1)}return n?(re(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
|
|
2965
2966
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
2966
2967
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
2967
2968
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -2971,7 +2972,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
2971
2972
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
2972
2973
|
`),t.stdout.write(` AgentCalls: ${o.agentCallCount}
|
|
2973
2974
|
`),t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
|
|
2974
|
-
`),0)}async function Q2(t,e,r){let n,s;try{let E=await O(t,w=>{let S=Ve(e,w);if(S.parseErrors.length>0)throw new Error(S.parseErrors.join("; "));return{teamName:S.name,targets:qk(e,w,new Set,[])}});s=E.teamName,n=E.targets}catch(E){return N(t,`health: ${E instanceof Error?E.message:String(E)}`)}let i=Xk(e),o=i.kind==="repo"?i:null,a=await Bk(t,n),l=[],d=0,c=o===null?void 0:0,u=o===null?void 0:0;for(let E of n){let w=null;try{w=await
|
|
2975
|
+
`),0)}async function Q2(t,e,r){let n,s;try{let E=await O(t,w=>{let S=Ve(e,w);if(S.parseErrors.length>0)throw new Error(S.parseErrors.join("; "));return{teamName:S.name,targets:qk(e,w,new Set,[])}});s=E.teamName,n=E.targets}catch(E){return N(t,`health: ${E instanceof Error?E.message:String(E)}`)}let i=Xk(e),o=i.kind==="repo"?i:null,a=await Bk(t,n),l=[],d=0,c=o===null?void 0:0,u=o===null?void 0:0;for(let E of n){let w=null;try{w=await Fe(E.sessionid,E.provider)}catch($){t.stderr.write(`warning: failed to load session "${E.sessionid}" for ${E.reportPath} (${E.provider}): ${$ instanceof Error?$.message:String($)}
|
|
2975
2976
|
`)}let S=w?.messageCount,x=o===null?void 0:w===null?null:Jk(w,o.since),J=o===null?void 0:w===null?null:Gk(w)??"n/a",F=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:E.alias,reportPath:E.reportPath,teamfile:E.teamfile,provider:E.provider,sessionid:E.sessionid,messageCount:S??null,model:w?.model??"(unknown)",lastContext:w?.lastInputTokens,detailLoaded:w!==null,liveness:a.get(vm(E.teamfile,E.alias))??bm(),sessionLimit:w===null?null:yi(w.messages),...o!==null?{activitySinceLastCommit:F,cumulativeTokens:J}:{}}),S===void 0?d=void 0:d!==void 0&&(d+=S),o!==null&&(x==null?c=void 0:c!==void 0&&(c+=x),J==null||J==="n/a"?u=void 0:u!==void 0&&(u+=J))}if(r)return re(t,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(E=>({ref:E.ref,timestamp:E.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:E,cumulativeTokens:w,...S})=>({...S,lastContext:S.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:d??null}}),0;let f=Math.max(7,...l.map(E=>E.sessionid.length)),m=Math.max(5,...l.map(E=>E.reportPath.length))+1,p=Math.max(8,...l.map(E=>E.provider.length))+1,h=Math.max(5,...l.map(E=>E.model.length))+1,_=Math.max(4,...l.map(E=>Tm(E.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
|
|
2976
2977
|
`),i.kind==="repo"){t.stdout.write(`Git progress:
|
|
2977
2978
|
`);for(let E of i.commits)t.stdout.write(` ${E.ref}: ${E.timestamp.toISOString()}
|
|
@@ -2999,21 +3000,21 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
2999
3000
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
3000
3001
|
`);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
|
|
3001
3002
|
`);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()}
|
|
3002
|
-
`)}return 0}async function dX(t,e,r,n){let s=
|
|
3003
|
+
`)}return 0}async function dX(t,e,r,n){let s=Cn(e,{limit:r});if(n==="json")return re(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
|
|
3003
3004
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
3004
3005
|
`);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);t.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
|
|
3005
3006
|
`)}return 0}function cX(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 iX,oX,Yk,Zk=T(()=>{"use strict";Pt();$e();sr();iX=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
3006
3007
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
3007
3008
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
3008
3009
|
|
|
3009
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,oX=50,Yk=500});import{existsSync as ds,readFileSync as Nm}from"node:fs";import{homedir as eI}from"node:os";import{dirname as tI,resolve as qr}from"node:path";import{fileURLToPath as uX}from"node:url";function Am(t,e={}){let r=[],n=pX(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="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=vX(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(d=>d.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(i==="kimi"){if(!s.model)continue;let a=wX(e.kimiConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${Qk(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(bl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${Qk(o)}`)}return r}function pX(t){if(!t&&Si)return Si;let e=new Map,r,n=t??_X();if(!ds(n))return r=`${n} not found`,t||km(e),t||(Si=e),t||(bl=r),e;let s;try{s=Nm(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||km(e),t||(Si=e),t||(bl=r),e}for(let[i,o]of Object.entries(fX)){let a=yX(s,o),l=EX(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&km(e),t||(Si=e),t||(bl=r),e}function _X(){return hX(tI(uX(import.meta.url)))}function hX(t){let e=gX(t);if(e){let n=qr(e,"durable-memory","model_selection.md");if(ds(n))return n}let r=[qr(t,"..","..","durable-memory","model_selection.md"),qr(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(ds(n))return n;return r[r.length-1]}function gX(t){let e=qr(t);for(;;){if(ds(qr(e,"package.json")))return e;let r=tI(e);if(r===e)return null;e=r}}function km(t){for(let[e,r]of Object.entries(mX))t.set(e,r)}function yX(t,e){let n=new RegExp(`^## ${SX(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function EX(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 i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function wX(t){let e=process.env.KIMI_CODE_HOME||qr(eI(),".kimi-code"),r=t??qr(e,"config.toml");if(!ds(r))return{available:!1,models:[],reason:`${r} not found`};let n;try{n=Nm(r,"utf-8")}catch(i){return{available:!1,models:[],reason:`${r} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of n.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${r} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=TX(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${r} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${r} has no [models] entries`}:{available:!0,models:[...s].sort()}}function TX(t){let e=[],r=0;for(;r<t.length;){for(;/\s/.test(t[r]??"");)r++;if(r>=t.length)break;let n="",s=t[r]==='"'||t[r]==="'"?t[r++]:void 0;if(s){for(;r<t.length&&t[r]!==s;)s==='"'&&t[r]==="\\"&&r+1<t.length&&r++,n+=t[r++];if(t[r]!==s)return null;r++}else{for(;r<t.length&&t[r]!==".";)n+=t[r++];n=n.trim()}if(!n)return null;for(e.push(n);/\s/.test(t[r]??"");)r++;if(r>=t.length)break;if(t[r]!==".")return null;r++}return e.length>0?e:null}function vX(t){let e=t??qr(eI(),".config","opencode","opencode.json");if(!ds(e))return{available:!0,models:[]};let r;try{r=JSON.parse(Nm(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:bX(r)}}function bX(t){if(!Im(t))return[];let e=vl(t.provider)??vl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Im(s))continue;let i=vl(s.models)??vl(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function vl(t){return Im(t)?t:null}function Im(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Qk(t){return t.length>0?t.join(", "):"(none)"}function SX(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var fX,mX,Si,bl,rI=T(()=>{"use strict";fX={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},mX={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","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 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Si=null});import{homedir as kX}from"node:os";import{basename as IX}from"node:path";function Sl(t,e){let r=new Set;return{text:t.replace(AX,(s,i)=>{let o=i.trim(),a=NX[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function kl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:xX(t.date)}}function xX(t){return t.toISOString().slice(0,10)}var NX,AX,xm=T(()=>{"use strict";NX={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=IX(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>kX(),date:t=>t.date},AX=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ni={};he(Ni,{GEMINI_PROVIDER_NOTICE:()=>oI,_setLintOpenCodeConfigProbeForTests:()=>PX,_setLintSessiondirFsOpsForTests:()=>jX,_setTeamfileSeedForTests:()=>DX,buildRootTeamRegistrationRow:()=>fI,registerRootTeam:()=>mI,runHire:()=>GX,runLint:()=>JX,runRefresh:()=>KX,runSeed:()=>cI,sha256Text:()=>uI});import{createHash as RX}from"node:crypto";import{accessSync as LX,constants as nI,existsSync as OX,readFileSync as Al,realpathSync as Om,statSync as CX,writeFileSync as Nl}from"node:fs";import{dirname as Br,resolve as iI}from"node:path";function DX(t){aI=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Pt(),wc)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function jX(t){cn=t===null?Cm:{...Cm,...t}}function PX(t){lI=t??Ad}async function FX(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await lI({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function UX(t,e){let r=Br(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=iI(o);if(n.has(a))continue;let l=WX(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function WX(t){try{if(cn.existsSync(t)){if(!cn.statSync(t).isDirectory())return"ENOTDIR";cn.accessSync(t,nI.W_OK);return}let e=HX(t);if(e===void 0)return;if(!cn.statSync(e).isDirectory())return"ENOTDIR";cn.accessSync(e,nI.W_OK);return}catch(e){return XX(e)??"permission check failed"}}function qX(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||dI(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function BX(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!dI(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=pI(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function dI(t,e){return sI(t)===sI(e)}function sI(t){let e=iI(t);try{return Om(e)}catch{return e}}function HX(t){let e=t;for(;;){try{if(cn.existsSync(e))return e}catch{return}let r=Br(e);if(r===e)return;e=r}}function XX(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 JX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write($X),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3010
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,oX=50,Yk=500});import{existsSync as ds,readFileSync as Nm}from"node:fs";import{homedir as eI}from"node:os";import{dirname as tI,resolve as qr}from"node:path";import{fileURLToPath as uX}from"node:url";function Am(t,e={}){let r=[],n=pX(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="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=vX(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(d=>d.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(i==="kimi"){if(!s.model)continue;let a=wX(e.kimiConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${Qk(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(bl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${Qk(o)}`)}return r}function pX(t){if(!t&&Si)return Si;let e=new Map,r,n=t??_X();if(!ds(n))return r=`${n} not found`,t||km(e),t||(Si=e),t||(bl=r),e;let s;try{s=Nm(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||km(e),t||(Si=e),t||(bl=r),e}for(let[i,o]of Object.entries(fX)){let a=yX(s,o),l=EX(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&km(e),t||(Si=e),t||(bl=r),e}function _X(){return hX(tI(uX(import.meta.url)))}function hX(t){let e=gX(t);if(e){let n=qr(e,"durable-memory","model_selection.md");if(ds(n))return n}let r=[qr(t,"..","..","durable-memory","model_selection.md"),qr(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(ds(n))return n;return r[r.length-1]}function gX(t){let e=qr(t);for(;;){if(ds(qr(e,"package.json")))return e;let r=tI(e);if(r===e)return null;e=r}}function km(t){for(let[e,r]of Object.entries(mX))t.set(e,r)}function yX(t,e){let n=new RegExp(`^## ${SX(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function EX(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 i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function wX(t){let e=process.env.KIMI_CODE_HOME||qr(eI(),".kimi-code"),r=t??qr(e,"config.toml");if(!ds(r))return{available:!1,models:[],reason:`${r} not found`};let n;try{n=Nm(r,"utf-8")}catch(i){return{available:!1,models:[],reason:`${r} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of n.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${r} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=TX(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${r} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${r} has no [models] entries`}:{available:!0,models:[...s].sort()}}function TX(t){let e=[],r=0;for(;r<t.length;){for(;/\s/.test(t[r]??"");)r++;if(r>=t.length)break;let n="",s=t[r]==='"'||t[r]==="'"?t[r++]:void 0;if(s){for(;r<t.length&&t[r]!==s;)s==='"'&&t[r]==="\\"&&r+1<t.length&&r++,n+=t[r++];if(t[r]!==s)return null;r++}else{for(;r<t.length&&t[r]!==".";)n+=t[r++];n=n.trim()}if(!n)return null;for(e.push(n);/\s/.test(t[r]??"");)r++;if(r>=t.length)break;if(t[r]!==".")return null;r++}return e.length>0?e:null}function vX(t){let e=t??qr(eI(),".config","opencode","opencode.json");if(!ds(e))return{available:!0,models:[]};let r;try{r=JSON.parse(Nm(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:bX(r)}}function bX(t){if(!Im(t))return[];let e=vl(t.provider)??vl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Im(s))continue;let i=vl(s.models)??vl(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function vl(t){return Im(t)?t:null}function Im(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Qk(t){return t.length>0?t.join(", "):"(none)"}function SX(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var fX,mX,Si,bl,rI=T(()=>{"use strict";fX={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},mX={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","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 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Si=null});import{homedir as kX}from"node:os";import{basename as IX}from"node:path";function Sl(t,e){let r=new Set;return{text:t.replace(AX,(s,i)=>{let o=i.trim(),a=NX[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function kl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:xX(t.date)}}function xX(t){return t.toISOString().slice(0,10)}var NX,AX,xm=T(()=>{"use strict";NX={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=IX(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>kX(),date:t=>t.date},AX=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ni={};he(Ni,{GEMINI_PROVIDER_NOTICE:()=>oI,_setLintOpenCodeConfigProbeForTests:()=>PX,_setLintSessiondirFsOpsForTests:()=>jX,_setTeamfileSeedForTests:()=>DX,buildRootTeamRegistrationRow:()=>fI,registerRootTeam:()=>mI,runHire:()=>GX,runLint:()=>JX,runRefresh:()=>KX,runSeed:()=>cI,sha256Text:()=>uI});import{createHash as RX}from"node:crypto";import{accessSync as LX,constants as nI,existsSync as OX,readFileSync as Al,realpathSync as Om,statSync as CX,writeFileSync as Nl}from"node:fs";import{dirname as Br,resolve as iI}from"node:path";function DX(t){aI=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Pt(),wc)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function jX(t){un=t===null?Cm:{...Cm,...t}}function PX(t){lI=t??Ad}async function FX(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await lI({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function UX(t,e){let r=Br(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=iI(o);if(n.has(a))continue;let l=WX(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function WX(t){try{if(un.existsSync(t)){if(!un.statSync(t).isDirectory())return"ENOTDIR";un.accessSync(t,nI.W_OK);return}let e=HX(t);if(e===void 0)return;if(!un.statSync(e).isDirectory())return"ENOTDIR";un.accessSync(e,nI.W_OK);return}catch(e){return XX(e)??"permission check failed"}}function qX(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||dI(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function BX(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!dI(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=pI(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function dI(t,e){return sI(t)===sI(e)}function sI(t){let e=iI(t);try{return Om(e)}catch{return e}}function HX(t){let e=t;for(;;){try{if(un.existsSync(e))return e}catch{return}let r=Br(e);if(r===e)return;e=r}}function XX(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 JX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write($X),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3010
3011
|
`),2;let r=t[0],n;try{n=await O(e,d=>Se(r,d))}catch(d){return Ue(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let s;try{s=ot(n)}catch(d){return Ue(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=of(s,Br(n)),o=Am(s.members),a=Al(n,"utf8"),l=Sl(a,kl({workdir:Br(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(d=>`{{${d}}}`).join(", ")}`),o.push(...Sd(s.members,Br(n))),o.push(...UX(s.members,n)),o.push(...qX(s.members,Br(n))),o.push(...await FX(s.members,Br(n),e.env));for(let d of i)e.stderr.write(`error: ${d.field}: ${d.message}
|
|
3011
3012
|
`);for(let d of s.members)Mm([d],e),d.session!==void 0&&d.session.length<ki&&o.push(`${d.alias}: sessionid is shorter than ${ki} chars; run lmctl seed to refresh it`);for(let d of o)e.stderr.write(`warning: ${d}
|
|
3012
3013
|
`);return i.length>0?1:(e.stdout.write(`ok
|
|
3013
3014
|
`),0)}async function cI(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(MX),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
3014
3015
|
`),2;let r=t[0],n;try{n=await O(e,g=>Se(r,g))}catch(g){return Ue(e,`${r}: ${g instanceof Error?g.message:String(g)}`)}let s;try{s=Om(n)}catch(g){return Ue(e,`${r}: ${g instanceof Error?g.message:String(g)}`)}let i=Br(n),o;try{o=ot(n)}catch(g){return Ue(e,`${r}: ${g instanceof Error?g.message:String(g)}`)}let l=Al(n,"utf8").split(`
|
|
3015
3016
|
`),d=zX(l),c=BX(o.members,l,d,i),u=of(o,i);if(u.length>0){Mm(o.members,e);for(let g of u)e.stderr.write(`error: ${g.field}: ${g.message}
|
|
3016
|
-
`);return 1}try{
|
|
3017
|
+
`);return 1}try{ns(e,o,n)}catch{}Mm(o.members,e);for(let g of Am(o.members))e.stderr.write(`warning: ${g}
|
|
3017
3018
|
`);for(let g of Sd(o.members,i))e.stderr.write(`warning: ${g}
|
|
3018
3019
|
`);let f=0,m=o.members.filter(g=>g.teamfile!==void 0?!1:g.session===void 0||g.session.length<ki);for(let g of m)if(!_I(g.provider))return e.stderr.write(`error: ${g.alias}: invalid provider "${g.provider}"
|
|
3019
3020
|
`),1;for(let g of o.members){if(g.teamfile!==void 0)continue;if(g.session!==void 0&&g.session.length>=ki){e.stderr.write(`warning: ${g.alias}: existing sessionid preserved; skipping
|
|
@@ -3049,7 +3050,7 @@ ${t}`:`${r}
|
|
|
3049
3050
|
`),1}function Lm(t,e,r){return t.stderr.write(`error: ${e}
|
|
3050
3051
|
${r}`),2}function Mm(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_
|
|
3051
3052
|
`),r.provider==="gemini"&&e.stderr.write(`${oI.replace("%s",r.alias)}
|
|
3052
|
-
`)}var ki,$X,MX,Il,Rm,oI,Cm,aI,
|
|
3053
|
+
`)}var ki,$X,MX,Il,Rm,oI,Cm,aI,un,lI,Ai=T(()=>{"use strict";ur();rI();to();gt();xd();$e();at();fr();xm();pi();ki=5,$X=`usage: lmctl lint <teamfile.lmctl>
|
|
3053
3054
|
|
|
3054
3055
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
3055
3056
|
For opencode members with model=, lint also asks the local ACP provider to
|
|
@@ -3071,7 +3072,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
3071
3072
|
re-seed.
|
|
3072
3073
|
A member cannot refresh its own running session; run the refresh from a
|
|
3073
3074
|
different member session or a plain operator shell.
|
|
3074
|
-
`,oI='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Cm={existsSync:OX,statSync:CX,accessSync:LX},aI=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Pt(),wc)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},
|
|
3075
|
+
`,oI='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Cm={existsSync:OX,statSync:CX,accessSync:LX},aI=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Pt(),wc)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},un=Cm,lI=Ad});var TI={};he(TI,{runClone:()=>uJ});import{existsSync as Dm,mkdirSync as sJ,readFileSync as iJ,readdirSync as oJ,statSync as EI,writeFileSync as aJ}from"node:fs";import{basename as hI,dirname as lJ,extname as dJ,join as wI,resolve as gI}from"node:path";async function uJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(cJ),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
3075
3076
|
`),2;let[r,n]=t,s,i=r;try{if(/^http:\/\//i.test(r))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(r))s=await mJ(r);else{let d=gI(r);if(!Dm(d))throw new Error(`source not found: ${r}`);let u=EI(d).isDirectory()?pJ(d):d;s=iJ(u,"utf8"),i=u}}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
|
|
3076
3077
|
`),1}let o=gI(n),a=_J(o,i,n);if(Dm(a))return e.stderr.write(`error: ${a} already exists.
|
|
3077
3078
|
`),1;let l=gJ(hJ(s));return sJ(lJ(a),{recursive:!0}),aJ(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
@@ -3127,8 +3128,8 @@ Examples:
|
|
|
3127
3128
|
|
|
3128
3129
|
# Same shape, codex for the Lead and Reviewer2
|
|
3129
3130
|
lmctl plan ./backend --provider codex
|
|
3130
|
-
`});import{execFileSync as AJ}from"node:child_process";import{resolve as NI}from"node:path";function xJ(t){return t.filter(e=>e.state!=="retired")}function AI(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?N(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=AJ("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return N(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=NI(s),o=e.listProjects().find(a=>NI(a.local_path)===i);return o===void 0?N(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function xI(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?N(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?N(t,`project ${r.name} has no assigned team; use --team <name>`):s}function RI(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?N(t,`member not found: ${n}`):i}let s=xJ(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?N(t,`team ${r.name} has no active agent member`):s}var LI=T(()=>{"use strict";$e()});var $I={};he($I,{SIZE_WARN_EST_TOKENS:()=>xi,estimateTokens:()=>CI,runTerminal:()=>CJ});import{spawn as RJ}from"node:child_process";import{statSync as LJ}from"node:fs";async function CJ(t,e){if(t.includes("--help")||t.includes("-h"))return UJ(e);let r=Q(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return N(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?V(r,o):P(r,o)!==void 0)return N(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=P(r,"--alias"),l=fT(o,s,a);return"err"in l?N(e,l.err):jm(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Ke(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?V(r,l):P(r,l)!==void 0)return N(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=
|
|
3131
|
-
`),
|
|
3131
|
+
`});import{execFileSync as AJ}from"node:child_process";import{resolve as NI}from"node:path";function xJ(t){return t.filter(e=>e.state!=="retired")}function AI(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?N(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=AJ("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return N(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=NI(s),o=e.listProjects().find(a=>NI(a.local_path)===i);return o===void 0?N(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function xI(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?N(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?N(t,`project ${r.name} has no assigned team; use --team <name>`):s}function RI(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?N(t,`member not found: ${n}`):i}let s=xJ(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?N(t,`team ${r.name} has no active agent member`):s}var LI=T(()=>{"use strict";$e()});var $I={};he($I,{SIZE_WARN_EST_TOKENS:()=>xi,estimateTokens:()=>CI,runTerminal:()=>CJ});import{spawn as RJ}from"node:child_process";import{statSync as LJ}from"node:fs";async function CJ(t,e){if(t.includes("--help")||t.includes("-h"))return UJ(e);let r=Q(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return N(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?V(r,o):P(r,o)!==void 0)return N(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=P(r,"--alias"),l=fT(o,s,a);return"err"in l?N(e,l.err):jm(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Ke(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?V(r,l):P(r,l)!==void 0)return N(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=Dr(OJ,{target:i,alias:o,flags:{}});return a.mode==="error"?N(e,a.message):a.mode!=="ai-team"?N(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?N(e,"terminal: alias required for the teamfile target"):await O(e,l=>$J(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let i=jJ(e,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return V(r,"--size")?FJ(e,s,i,o,V(r,"--json")):PJ(e,s,i,o)})}catch(s){return Ke(e,s)}}async function $J(t,e,r,n){let s;try{s=Ne(e,r,n)}catch(c){return c instanceof ke?N(t,c.message):Ke(t,c)}let i=Rt(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:qt()});if(!i.acquired)return N(t,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=oS({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,d=null;try{n.setTerminalLock(o),l=MJ(n,s),a=setInterval(()=>{try{let c=new Date().toISOString(),u=n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,c);u&&n.heartbeatAgentInflight(i.lease,i.leaseId,c),!u&&a!==null&&(clearInterval(a),a=null)}catch{}},aS()),a.unref?.();try{ns(t,ot(s.teamfile),s.teamfile)}catch{}return d=await jm(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),d}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease,i.leaseId),DJ(n,l,d)}}function MJ(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function DJ(t,e,r){if(e!==null)try{t.finishTrackedInvocation(e,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function jm(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!Ya(r))return N(t,`no resume incantation for provider "${r}"`);if(!_v.test(n))return N(t,"refusing to resume: malformed sessionid");let o=mf(r,n,{isLead:e.isLead,model:i,onModelIgnored:d=>{let c=`warning: ${d.provider} terminal ignored model=${d.model}: ${d.reason}`;t.stderr.write(`${c}
|
|
3132
|
+
`),De({event:"model_ignored",provider:d.provider,model:d.model,reason:d.reason})}});if(o===null||o.length===0)return N(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(d=>{let c=RJ(a,l,{stdio:"inherit",cwd:s,env:Je(process.env,s,n,"terminal")});c.on("error",u=>{d(N(t,`failed to launch ${a}: ${u.message}`))}),c.on("exit",u=>d(u??0))})}function jJ(t,e,r){let n=P(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?N(t,`team not found: ${n}`):o}let s=AI(t,e,P(r,"--project"));return typeof s=="number"?s:xI(t,e,s,void 0)}async function PJ(t,e,r,n){let s=RI(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?N(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):jm(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function CI(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=LJ(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 FJ(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return N(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let d=Qe(a),c=a.model??null,u=null;Ya(d)&&(u=await Fe(l,d));let f=CI(u),m=f.est>xi;o.push({alias:a.alias,provider:d,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:c,resume_incantation:m?za(d,l,c!==null?{model:c}:{}):null})}if(s)return re(t,{estimate:!0,legend:OI,guide_tokens:xi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
3132
3133
|
`),t.stdout.write(`${OI}
|
|
3133
3134
|
`);for(let a of o){let l=a.messages===null?"?":String(a.messages),d=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${d} ~${a.est_tokens} tok (rough estimate)
|
|
3134
3135
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -3207,7 +3208,7 @@ Examples:
|
|
|
3207
3208
|
`),2;let n=r[0];try{return await O(e,s=>(e.stdout.write(zI(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
3208
3209
|
`),1}}function Wm(){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(`
|
|
3209
3210
|
`)}var YI,qm,Bm,rN=T(()=>{"use strict";pf();$e();YI=["Coder","Reviewer1","Polisher"],qm=3e4,Bm=new Set(["attention_needed","paused","escalation"])});var kN={};he(kN,{appendIntent:()=>hN,resolveIntentLogPath:()=>_N,runStatus:()=>y4});import{appendFileSync as a4,existsSync as l4,mkdirSync as d4}from"node:fs";import{homedir as c4,hostname as nN}from"node:os";import{basename as u4,dirname as pN,isAbsolute as f4,join as m4,resolve as p4}from"node:path";function _N(){return process.env.LMCTL_INTENT_LOG??m4(c4(),".lmctl","recent-intents.log")}function hN(t){try{let e=_N();d4(pN(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});a4(e,`${r}
|
|
3210
|
-
`)}catch{}}async function y4(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(_4),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return N(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(t,["--since"],["--json"]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,`unknown argument: ${n.positionals[0]}`);let s=V(n,"--json"),i=Y4(P(n,"--since"));if("error"in i)return N(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>lN(l,o));re(e,a)}else{let a=await O(e,async l=>M4(await lN(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return hN({verb:"status",args:t}),0}catch(o){return N(e,o instanceof Error?o.message:String(o))}}async function lN(t,e){let r=
|
|
3211
|
+
`)}catch{}}async function y4(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(_4),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return N(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(t,["--since"],["--json"]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,`unknown argument: ${n.positionals[0]}`);let s=V(n,"--json"),i=Y4(P(n,"--since"));if("error"in i)return N(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>lN(l,o));re(e,a)}else{let a=await O(e,async l=>M4(await lN(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return hN({verb:"status",args:t}),0}catch(o){return N(e,o instanceof Error?o.message:String(o))}}async function lN(t,e){let r=dn(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(mr("status"));return await w4(t)}return await E4(t,r.identity)}async function E4(t,e){let r=Me(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(mr("status"));let s=Ve(n.teamfile_path,t),i=Xm(Rl(t,{from:r.value})),o=Xm(Rl(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=S4([...Hm(t,{from:r.value}),...Hm(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...gN(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>v4(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>Jm(l,t)),to_me:o.map(l=>Jm(l,t))},transcript_harvest:await EN(a),mailbox:{outbound:Ll(k4(t,r.teamfile,r.alias),"outbound"),inbound_pending:Ll(I4(t,r.teamfile,r.alias),"inbound")},waiting_on:N4(t,r.teamfile,r.alias).map(l=>yN(l,t))}}function gN(){let t=null;try{t=k_(S_())}catch{}return{db_path:ne(),site_name:t}}async function w4(t){let e=t.listRootTeams();return{scope:"db",identity:null,...gN(),teams:e.map(r=>T4(t,r)),activity:Xm(Rl(t)).map(r=>Jm(r,t)),transcript_harvest:await EN(Hm(t)),mailbox:{pending_outbound:Ll(dN(t,"sender"),"outbound"),pending_inbound:Ll(dN(t,"receiver"),"inbound")},waiting_on:A4(t).map(r=>yN(r,t))}}function T4(t,e){if(!l4(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let r=0;try{r=Ve(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function v4(t,e,r){let n=r.teamfile===void 0?null:Se(f4(r.teamfile)?r.teamfile:p4(pN(e),r.teamfile),t),s=_t(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?b4(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function b4(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
|
|
3211
3212
|
SELECT * FROM tracked_invocation
|
|
3212
3213
|
WHERE kind = 'chat'
|
|
3213
3214
|
AND status = 'running'
|
|
@@ -3284,11 +3285,11 @@ Examples:
|
|
|
3284
3285
|
ELSE delivered_at
|
|
3285
3286
|
END ASC,
|
|
3286
3287
|
id ASC
|
|
3287
|
-
`).all()}function Xm(t){return t.filter(e=>Pi(e)!=="dead")}function yN(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:SN(t.payload),receiver_availability:x4(_t(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function x4(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${lt(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===nN()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let e=t.terminalInvocation,r=e.holder_host===null?"unknown host":e.holder_host===nN()?"this host":e.holder_host,n=e.holder_pid===null?"":` holder pid ${e.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${e.id}${n} alive on ${r})`}}async function EN(t){let e=[];for(let r of t)e.push(await R4(r));return e}async function R4(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,r={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return
|
|
3288
|
+
`).all()}function Xm(t){return t.filter(e=>Pi(e)!=="dead")}function yN(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:SN(t.payload),receiver_availability:x4(_t(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function x4(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${lt(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===nN()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let e=t.terminalInvocation,r=e.holder_host===null?"unknown host":e.holder_host===nN()?"this host":e.holder_host,n=e.holder_pid===null?"":` holder pid ${e.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${e.id}${n} alive on ${r})`}}async function EN(t){let e=[];for(let r of t)e.push(await R4(r));return e}async function R4(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,r={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return fn(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return fn(r,"missing-request-payload",null,null);let n=L4(t.meta);if(n.provider===null||n.sessionid===null)return fn(r,"missing-session-metadata",n.provider,n.sessionid);if(!O4(n.provider))return fn(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await Fe(n.sessionid,n.provider)}catch{return fn(r,"read-error",n.provider,n.sessionid)}if(s===null)return fn(r,"session-not-found",n.provider,n.sessionid);let i=C4(t.request_payload,s.messages);return i.state!=="completed"?fn(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:bN(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function fn(t,e,r,n){return{...t,state:"unreconciled",reason:e,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function L4(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function O4(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","ClaudeMock"].includes(t)}function C4(t,e){let r=e.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===t);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of e.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
|
|
3288
3289
|
|
|
3289
3290
|
`),assistantTimestamp:$4(s[s.length-1]?.timestamp)}}function $4(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function Jm(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:Pi(t),mailbox_delivery:null,from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:mN(t.result_summary),error:mN(t.error)};return r.mailbox_delivery=H4(r,e),r}function Ll(t,e){let r=new Map;for(let n of t){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=e==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function M4(t,e){return t.scope==="self"?j4(t,e):P4(t,e)}function D4(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",r=t.reason==="dead-pid"?"appears dead":"stale";return`idle (reclaimable lock: ${e} ${r})`}function j4(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?D4(n.reclaimable):`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),TN(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),vN(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Gm(r,Km(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Gm(r,Km(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Cl(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Cl(r,t.mailbox.inbound_pending),r.push(""),r.push(wN(t)),r.join(`
|
|
3290
3291
|
`)}function P4(t,e){let r=[];r.push("scope: db"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),TN(r,t.waiting_on,"db"),r.push(""),r.push("transcript harvest:"),vN(r,t.transcript_harvest,"db"),r.push(""),r.push("recent activity:"),Gm(r,Km(t.activity,e.sinceIso),"db"),r.push(""),r.push("mailbox pending outbound:"),Cl(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Cl(r,t.mailbox.pending_inbound),r.push(""),r.push(wN(t)),r.join(`
|
|
3291
|
-
`)}function wN(t){return fs(t.db_path)}function Gm(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(fN).sort(q4),s=n.length===0?e:e.filter(i=>!fN(i));for(let i of n.slice(0,sN))uN(t,i,r);Ol(t,n.length,sN,"more open delegations");for(let i of s.slice(0,xl))uN(t,i,r);Ol(t,s.length,xl,"older")}function TN(t,e,r){if(e.length===0){t.push(" none");return}let n=F4(e,h4);for(let s of n){let i=r==="db"&&s.sender!==null?`${lt(s.sender)} -> ${lt(s.receiver)}`:lt(s.receiver);t.push(` ${i} - ${s.state} ${V4(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}W4(t,e,n)}function vN(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,xl)){let s=r==="db"?` from ${lt(n.from_identity)} -> ${lt(n.target)}`:` -> ${lt(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}Ol(t,e.length,xl,"more transcript harvest rows")}function F4(t,e){let r=[...t].sort(cN);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=U4(n);a>=0&&(n[a]=o)}return n.sort(cN)}function U4(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function W4(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function cN(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function Km(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function uN(t,e,r){let n=K4(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${bN(i)}"`;t.push(` #${e.id} ${B4(e)} ${e.kind}${n} ${s}${o}`)}function fN(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function q4(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function B4(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function H4(t,e){let r=X4(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function X4(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=
|
|
3292
|
+
`)}function wN(t){return fs(t.db_path)}function Gm(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(fN).sort(q4),s=n.length===0?e:e.filter(i=>!fN(i));for(let i of n.slice(0,sN))uN(t,i,r);Ol(t,n.length,sN,"more open delegations");for(let i of s.slice(0,xl))uN(t,i,r);Ol(t,s.length,xl,"older")}function TN(t,e,r){if(e.length===0){t.push(" none");return}let n=F4(e,h4);for(let s of n){let i=r==="db"&&s.sender!==null?`${lt(s.sender)} -> ${lt(s.receiver)}`:lt(s.receiver);t.push(` ${i} - ${s.state} ${V4(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}W4(t,e,n)}function vN(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,xl)){let s=r==="db"?` from ${lt(n.from_identity)} -> ${lt(n.target)}`:` -> ${lt(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}Ol(t,e.length,xl,"more transcript harvest rows")}function F4(t,e){let r=[...t].sort(cN);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=U4(n);a>=0&&(n[a]=o)}return n.sort(cN)}function U4(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function W4(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function cN(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function Km(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function uN(t,e,r){let n=K4(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${bN(i)}"`;t.push(` #${e.id} ${B4(e)} ${e.kind}${n} ${s}${o}`)}function fN(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function q4(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function B4(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function H4(t,e){let r=X4(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function X4(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=Me(t.from_identity),n=Me(t.target)}catch{return null}for(let s of J4(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&G4(i,t))return i}return null}function J4(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function G4(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function K4(t,e){if(e==="from-me")return t.target===null?"":` -> ${lt(t.target)}`;if(e==="to-me")return` from ${lt(t.from_identity)}`;let r=t.target===null?"":` -> ${lt(t.target)}`;return` from ${lt(t.from_identity)}${r}`}function Ol(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function Cl(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,iN)){let n=r.sender??"operator";t.push(` ${lt(n)} -> ${lt(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ol(t,e.length,iN,"more lanes")}function mN(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function bN(t){let e=t.replace(/\s+/g," ").trim();return e.length<=oN?e:`${e.slice(0,oN-3)}...`}function SN(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=aN?e:`${e.slice(0,aN-3)}...`}function V4(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function lt(t){if(t==="operator")return t;try{let e=Me(t);return`${u4(e.teamfile)}:${e.alias}`}catch{return t}}function Y4(t){if(t===void 0)return{iso:new Date(Date.now()-g4).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var _4,xl,sN,iN,h4,g4,oN,aN,IN=T(()=>{"use strict";Lt();$e();ml();ze();_i();fr();dd();Xt();_4=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
3292
3293
|
|
|
3293
3294
|
Show this member's team, busy/idle roster, recent tracked activity, and mailbox
|
|
3294
3295
|
state. From a plain operator shell, show a DB-wide team/activity summary.
|
|
@@ -3296,7 +3297,7 @@ state. From a plain operator shell, show a DB-wide team/activity summary.
|
|
|
3296
3297
|
Text output shows recent activity from the last 24h by default. Use --since 7d
|
|
3297
3298
|
or an ISO timestamp to widen the investigation window. --json returns complete,
|
|
3298
3299
|
uncapped data.
|
|
3299
|
-
`,xl=5,sN=5,iN=5,h4=5,g4=24*60*60*1e3,oN=72,aN=80});var AN={};he(AN,{backfillEventLog:()=>nG,rebuildProjections:()=>NN});import{createHash as z4}from"node:crypto";function
|
|
3300
|
+
`,xl=5,sN=5,iN=5,h4=5,g4=24*60*60*1e3,oN=72,aN=80});var AN={};he(AN,{backfillEventLog:()=>nG,rebuildProjections:()=>NN});import{createHash as z4}from"node:crypto";function mn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function Z4(t,e,r){return`lease_${z4("sha256").update(`${t}\0${e}\0${r}`).digest("hex").slice(0,16)}`}function $l(t,e,r,n){r.forEach((s,i)=>{Ie(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?n.appended+=1:n.skipped+=1})}function Q4(t){let e=`msg_tcl_${t.id}`,r=mn(t.sender_teamfile,t.sender_alias),n=mn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:r,receiver:n,root_teamfile:t.root_teamfile,legacy:s},o=[{event_type:oe.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}}];return t.status!=="running"&&o.push({event_type:oe.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}),{streamId:e,events:o}}function eG(t){let e=`msg_mbx_${t.id}`,r=mn(t.sender_teamfile,t.sender_alias),n=mn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:r,receiver:n,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:oe.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:oe.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:oe.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:oe.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:oe.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:oe.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:oe.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:oe.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function tG(t){let e=`inv_${t.id}`,r=mn(t.target_teamfile,t.target_alias),n={table:"tracked_invocation",id:t.id},s=[{event_type:oe.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:r,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:n}}];return t.notified_by!==null&&s.push({event_type:oe.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:n}}),t.status!=="running"&&s.push({event_type:oe.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:n}}),{streamId:e,events:s}}function rG(t){let e=Z4(t.receiver_teamfile,t.receiver_alias,t.started_at),r=mn(t.receiver_teamfile,t.receiver_alias),n=mn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:oe.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:r,sender:n,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function nG(t){let e={appended:0,skipped:0},r={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Q4(i);$l(t,a,l,e),r.team_chat_log+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=eG(i);$l(t,a,l,e),r.agent_mailbox+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=tG(i);$l(t,a,l,e),r.tracked_invocation+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=rG(i);$l(t,a,l,e),r.agent_inflight+=e.appended+e.skipped-o}NN(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:r,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function NN(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let r of e){let n=JSON.parse(r.payload);sG(t,r.seq,r.stream_id,r.event_type,n)}}function Le(t,e,r){let n=t[e];return n!=null?n[r]??null:null}function sG(t,e,r,n,s){switch(n){case oe.ENQUEUE:case oe.RESPONSE_ENQUEUE:{let i=n===oe.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
|
|
3300
3301
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
3301
3302
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
3302
3303
|
VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
|
|
@@ -3373,7 +3374,7 @@ ${cs}Run 'lmctl help' for usage.
|
|
|
3373
3374
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
3374
3375
|
${cs}Run 'lmctl help' for usage.
|
|
3375
3376
|
`),1)}async function aG(t,e={stdout:process.stdout,stderr:process.stderr}){let r=fp();try{return await lG(t,e)}finally{mp(r)}}async function lG(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let d=t[++a];if(d===void 0||d.startsWith("--"))return oG(e,"missing value for --db");process.env.LMCTL_DB=d;continue}if(l==="--debug"){up();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${xt()}
|
|
3376
|
-
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Vm),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(Vm),0):RN.has(a)?LN(a,[...l,"--help"],e):ON(e,a)}Dl(ne(),e.stderr);let[s,...i]=r;if(s===void 0)return e.stdout.write(Vm),0;let o=Date.now();Ym(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await LN(s,i,e);return Ym(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),RN.has(s)&&!Wl(r,e)&&await yp(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Ym(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:cG(l)}),dG(a,s,i,e)}}function Ym(t,e,r){
|
|
3377
|
+
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Vm),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(Vm),0):RN.has(a)?LN(a,[...l,"--help"],e):ON(e,a)}Dl(ne(),e.stderr);let[s,...i]=r;if(s===void 0)return e.stdout.write(Vm),0;let o=Date.now();Ym(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await LN(s,i,e);return Ym(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),RN.has(s)&&!Wl(r,e)&&await yp(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Ym(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:cG(l)}),dG(a,s,i,e)}}function Ym(t,e,r){De({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:ne(),lmctl_version:xt(),node_version:process.version,...r})}function dG(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
|
|
3377
3378
|
`),pp()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
3378
3379
|
`),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
3379
3380
|
`),1)}function cG(t){let e=[],r=t.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return e}async function LN(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(jc(),Xg));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(bS(),vS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(xS(),AS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(PS(),jS));return n(e,r)}case"mail":{let{runMail:n}=await Promise.resolve().then(()=>(ek(),QS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Tk(),wk));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(xk(),Ak));return n(e,r)}case"session":{let{runSession:n}=await Promise.resolve().then(()=>(Uk(),Fk));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Vk(),Kk));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(Zk(),zk));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ai(),Ni));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ai(),Ni));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ai(),Ni));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ai(),Ni));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(vI(),TI));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(II(),kI));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(MI(),$I));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(VI(),KI));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(rN(),tN));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(IN(),kN));return n(e,r)}case"db":return uG(e,r);default:return ON(r,t)}}async function uG(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
|