@lmctl-ai/lmctl 0.1.266 → 0.1.267
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +157 -157
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{for(var n in e)qx(t,n,{get:e[n],enumerable:!0})};var gp={};me(gp,{defaultDbPath:()=>_p,describeStateLocation:()=>ps,isSlowWslMount:()=>hp,lmctlNextHome:()=>$i,resolveDbPath:()=>z,warnIfSlowDbPath:()=>ql});import{platform as mp}from"node:os";import{homedir as Bx}from"node:os";import{join as pp}from"node:path";function $i(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:pp(Bx(),Hx)}function _p(){return pp($i(),Xx)}function z(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:_p()}function ps(t){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function hp(t,e=mp()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function ql(t,e=process.stderr,n=mp()){hp(t,n)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
2
|
`)}var Hx,Xx,qe=w(()=>{"use strict";Hx=".lmctl",Xx="state.db"});function Vx(t){for(let e of Kx)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 Yx(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Qx(t){let e=t.split(".");if(e.length!==4)return!1;for(let n of e){if(n.length===0||n.length>3)return!1;let r=Number(n);if(!Number.isFinite(r)||r<0||r>255)return!1}return!0}function _s(t){let e=t;for(let{re:n,replacement:r}of Gx)e=e.replace(n,r);return e=e.replace(zx,n=>!Qx(n)||Vx(n)?n:yp),e=e.replace(Zx,n=>Yx(n)?n:yp),e}function hs(t){return t.split(`
|
|
3
3
|
`).map(e=>_s(e)).join(`
|
|
4
|
-
`)}function wp(t,e){let n=t.toUpperCase();return n.includes("TOKEN")||n.includes("SECRET")||n.includes("KEY")||n.includes("PASSWORD")||n.includes("PASSWD")||n.includes("CREDENTIAL")||n.includes("AUTH")?{key:t,value:ht}:{key:t,value:_s(e)}}function gn(t){if(typeof t=="string")return _s(t);if(Array.isArray(t))return t.map(e=>gn(e));if(t!==null&&typeof t=="object"){let e={};for(let[n,r]of Object.entries(t)){let s=n.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[n]=typeof r=="string"?ht:gn(r):e[n]=gn(r)}return e}return t}function Tp(t,e){for(let{name:n,re:r}of eA){let s=e.match(r);if(s!==null&&!s[0].includes(ht))throw new
|
|
4
|
+
`)}function wp(t,e){let n=t.toUpperCase();return n.includes("TOKEN")||n.includes("SECRET")||n.includes("KEY")||n.includes("PASSWORD")||n.includes("PASSWD")||n.includes("CREDENTIAL")||n.includes("AUTH")?{key:t,value:ht}:{key:t,value:_s(e)}}function gn(t){if(typeof t=="string")return _s(t);if(Array.isArray(t))return t.map(e=>gn(e));if(t!==null&&typeof t=="object"){let e={};for(let[n,r]of Object.entries(t)){let s=n.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[n]=typeof r=="string"?ht:gn(r):e[n]=gn(r)}return e}return t}function Tp(t,e){for(let{name:n,re:r}of eA){let s=e.match(r);if(s!==null&&!s[0].includes(ht))throw new Jn(t,n)}}var ht,Jx,yp,Ep,Gx,Kx,zx,Zx,eA,Jn,Mi=w(()=>{"use strict";ht="[REDACTED]",Jx="[REDACTED_EMAIL]",yp="[REDACTED_IP]",Ep="[USER]",Gx=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${ht}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${ht}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${ht}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:ht},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:ht},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:ht},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:ht},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${ht}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Ep}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Ep}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Jx}],Kx=["127.","10.","192.168.","0.0.0.0"];zx=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Zx=/\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;eA=[{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"'`]+/}],Jn=class extends Error{bundlePath;patternName;constructor(e,n){super(`sanitization failed: ${n} pattern matched in ${e}`),this.bundlePath=e,this.patternName=n,this.name="SanitizationError"}}});import{spawnSync as Bl}from"node:child_process";import{readFileSync as tA}from"node:fs";import{readFile as Xl,stat as vp}from"node:fs/promises";import{homedir as nA}from"node:os";import{join as rA}from"node:path";import{fileURLToPath as sA}from"node:url";function Ct(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(tA(sA(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Sp(t){let e=new Set(t.include??Di),n={};return e.has("serve")&&(n.serve=await oA(t)),e.has("db")&&(n.db=aA(t)),e.has("runs")&&(n.runs=lA(t)),e.has("jobs")&&(n.jobs=cA(t)),e.has("attentions")&&(n.attentions=dA(t)),e.has("env")&&(n.env=await uA(t)),e.has("intents")&&(n.intents=await mA(t)),n}async function oA(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,n=t.serveLog??process.env.LMCTL_SERVE_LOG,r=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let d=(await Xl(e,"utf8")).trim(),u=Number.parseInt(d,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,c=0;if(n===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await Xl(n,"utf8")).split(`
|
|
5
5
|
`),f=u.slice(Math.max(0,u.length-r));c=f.length,a=hs(f.join(`
|
|
6
6
|
`))}catch(d){l=`serve log unreadable: ${d instanceof Error?d.message:String(d)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:c,log_tail:a,log_note:l}}function aA(t){let{dal:e}=t,n="unknown";try{n=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
|
|
7
7
|
`)}catch(i){n=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let r=0;try{r=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{r=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:n,schema_version:r,table_counts:s}}function lA(t){let{dal:e}=t,n=(t.now??new Date).toISOString(),r=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(n)-r).toISOString(),i=e.query(`SELECT ${Hl} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${Hl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Hl} FROM run
|
|
8
8
|
WHERE terminal_state IS NULL
|
|
9
9
|
AND started_at < ?
|
|
10
10
|
ORDER BY started_at ASC LIMIT 50`,s);return{last_50:gn(i),stale:gn(a),paused:gn(o)}}function cA(t){let{dal:e}=t,n=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),r={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:o,c:a}of n)o==="queued"?r.pending+=a:o==="running"?r.running+=a:o==="done"||o==="succeeded"?r.done+=a:o==="failed"?r.failed+=a:o==="paused"&&(r.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:r,pending_ids:s.map(o=>o.id),running_ids:i.map(o=>o.id)}}function dA(t){let{dal:e}=t,n=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:gn(n)}}async function uA(t){let e=
|
|
11
|
+
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:gn(n)}}async function uA(t){let e=Ct(),n=process.version,r=Bl("uname",["-a"],{encoding:"utf8"}),s=hs((r.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await vp(o);let d=Bl("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await vp(a);let d=Bl("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":hs(i.join(`
|
|
12
12
|
`)),c=[];for(let d of iA){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(wp(d,u))}return{lmctl_next_version:e,node_version:n,os_info:s,disk_usage:l,env_keys_present:c}}function fA(){return process.env.LMCTL_INTENT_LOG??rA(nA(),".lmctl","recent-intents.log")}async function mA(t){let e=t.intentLog??fA(),n=t.intentLogTailLines??500;try{let s=(await Xl(e,"utf8")).split(`
|
|
13
13
|
`).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-n));return{source_path:e,tail_lines:i.length,tail:hs(i.join(`
|
|
14
|
-
`)),note:null}}catch(r){return r.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: ${r instanceof Error?r.message:String(r)}`}}}var Di,iA,Hl,gs=w(()=>{"use strict";Mi();Di=["serve","db","runs","jobs","attentions","env","intents"];iA=["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"];Hl=["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 Ip,appendFileSync as pA,mkdirSync as _A,existsSync as JV,readdirSync as GV,unlinkSync as KV}from"node:fs";import{join as Pi,dirname as hA}from"node:path";import{homedir as gA}from"node:os";function Jl(){return Pi(gA(),".lmctl")}function Np(){
|
|
14
|
+
`)),note:null}}catch(r){return r.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: ${r instanceof Error?r.message:String(r)}`}}}var Di,iA,Hl,gs=w(()=>{"use strict";Mi();Di=["serve","db","runs","jobs","attentions","env","intents"];iA=["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"];Hl=["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 Ip,appendFileSync as pA,mkdirSync as _A,existsSync as JV,readdirSync as GV,unlinkSync as KV}from"node:fs";import{join as Pi,dirname as hA}from"node:path";import{homedir as gA}from"node:os";function Jl(){return Pi(gA(),".lmctl")}function Np(){gr=!0,process.env.LMCTL_DEBUG="1"}function xp(){return{cliDebug:gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Ap(t){gr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function le(){if(gr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-kp>=yA&&(bp=TA(),kp=t),bp}function Rp(){return gr||process.env.LMCTL_DEBUG==="1"}function EA(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=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",`${n}${r}:${s}`)}function je(t,e){if(e?.verbose){if(!gr)return}else if(!e?.always&&!le())return;try{wA();let n={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};pA(ji,JSON.stringify(n)+`
|
|
15
15
|
`)}catch{}}function wA(){if(!ji){let e=EA().slice(0,13).replace("T","-");ji=Pi(Jl(),`debug-${e}.log`)}_A(hA(ji),{recursive:!0})}function Me(...t){je({event:"legacy",msg:t.join(" ")})}function Ge(...t){je({event:"legacy",msg:t.join(" ")},{verbose:!0})}function M(t){je(t,{always:!0})}function TA(){return vA()||SA()}function vA(){try{let t=Ip(Pi(Jl(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
16
|
-
`)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function SA(){try{let t=Ip(Pi(Jl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var
|
|
16
|
+
`)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function SA(){try{let t=Ip(Pi(Jl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var gr,bp,kp,yA,ji,ce=w(()=>{"use strict";gr=!1,bp=!1,kp=0,yA=5e3;ji=null});import{existsSync as qA}from"node:fs";import{createRequire as BA}from"node:module";function HA(){return Kl===null&&(Kl=BA(import.meta.url)("node:sqlite").DatabaseSync),Kl}function Vl(t){return t.length===1&&XA(t[0])?[t[0]]:t}function XA(t){if(!Zl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Zl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kl,Yl,ys,zl,Ql=w(()=>{"use strict";Kl=null;Yl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!qA(e))throw new Error("unable to open database file");this.name=e,this.handle=new(HA())(e,{readOnly:n.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new zl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}let s=this.prepare(r).get();return n?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...n)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...n);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let r=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${r}`);try{let s=e(...n);return this.exec(`RELEASE ${r}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${r}`),this.exec(`RELEASE ${r}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let n=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(n!==void 0){if(n==="BEGIN"||n==="SAVEPOINT"){this.transactionDepth+=1;return}if(n==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(n==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}n==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},ys=Yl,zl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let n=this.handle.get(...Vl(e));return this.normalizeRow(n)}all(...e){return this.handle.all(...Vl(e)).map(n=>this.normalizeRow(n))}run(...e){let n=this.handle.run(...Vl(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Zl(e)?Object.values(e):Zl(e)?{...e}:e}}});var Bp={};me(Bp,{CURRENT_USER_VERSION:()=>Wp,migrate:()=>Fi});import{existsSync as JA,mkdirSync as GA,readFileSync as Dp}from"node:fs";import{homedir as KA}from"node:os";import{dirname as jp,join as VA,resolve as Pp}from"node:path";import{fileURLToPath as YA,pathToFileURL as zA}from"node:url";function Fi(t){t.dbPath!==":memory:"&&GA(jp(t.dbPath),{recursive:!0});let e=new ys(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=qp(e);return n===0&&(e.exec(Dp(Up,"utf8")),e.pragma(`user_version = ${Wp}`)),QA(e,n),e}function QA(t,e){let n=e;if(n<2&&n!==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,
|
|
@@ -427,7 +427,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
427
427
|
updated_at TEXT NOT NULL,
|
|
428
428
|
PRIMARY KEY(user_id, device_id, period)
|
|
429
429
|
);
|
|
430
|
-
`),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(
|
|
430
|
+
`),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(yr(t,"team_connection")&&t.exec(`
|
|
431
431
|
CREATE TABLE IF NOT EXISTS team_connection_v37 (
|
|
432
432
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
433
433
|
source_teamfile TEXT NOT NULL,
|
|
@@ -552,7 +552,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
552
552
|
ON agent_mailbox(sender_teamfile, sender_alias, created_at);
|
|
553
553
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_created
|
|
554
554
|
ON agent_mailbox(created_at);
|
|
555
|
-
`),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(
|
|
555
|
+
`),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(yr(t,"team_chat_log")?Mp(t):t.exec(`
|
|
556
556
|
CREATE TABLE IF NOT EXISTS team_chat_log (
|
|
557
557
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
558
558
|
root_teamfile TEXT NOT NULL,
|
|
@@ -571,7 +571,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
571
571
|
`),t.exec(`
|
|
572
572
|
CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
|
|
573
573
|
ON team_chat_log(root_teamfile, created_at);
|
|
574
|
-
`),t.pragma("user_version = 46"),n=46),n>=46&&
|
|
574
|
+
`),t.pragma("user_version = 46"),n=46),n>=46&&yr(t,"team_chat_log")&&!se(t,"team_chat_log").has("origin")&&Mp(t),n<47&&n!==0){zt(t,"agent_mailbox"),zt(t,"tracked_invocation");let r=se(t,"agent_mailbox");r.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),r.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=se(t,"tracked_invocation");s.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),n=47}if(n<48&&n!==0){zt(t,"agent_mailbox");let r=se(t,"agent_mailbox");r.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),r.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),r.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),r.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),r.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
|
|
575
575
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
|
|
576
576
|
ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
|
|
577
577
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
|
|
@@ -680,7 +680,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
680
680
|
ON invocation_state(target_teamfile, target_alias, status, launch_source);
|
|
681
681
|
CREATE INDEX IF NOT EXISTS idx_invocation_state_from_time
|
|
682
682
|
ON invocation_state(from_identity, started_at DESC);
|
|
683
|
-
`),t.pragma("user_version = 53"),n=53),n<54&&n!==0&&(zt(t,"agent_state"),se(t,"agent_state").has("currently_handling_message_id")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_message_id TEXT;"),t.pragma("user_version = 54"),n=54),n<55&&n!==0&&(zt(t,"agent_state"),se(t,"agent_state").has("currently_handling_since")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_since TEXT;"),t.pragma("user_version = 55"),n=55),n<56&&n!==0&&(
|
|
683
|
+
`),t.pragma("user_version = 53"),n=53),n<54&&n!==0&&(zt(t,"agent_state"),se(t,"agent_state").has("currently_handling_message_id")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_message_id TEXT;"),t.pragma("user_version = 54"),n=54),n<55&&n!==0&&(zt(t,"agent_state"),se(t,"agent_state").has("currently_handling_since")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_since TEXT;"),t.pragma("user_version = 55"),n=55),n<56&&n!==0&&(yr(t,"tracked_invocation")&&t.exec(`
|
|
684
684
|
CREATE TABLE tracked_invocation_v56 (
|
|
685
685
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
686
686
|
kind TEXT NOT NULL CHECK(kind IN ('chat', 'exec')),
|
|
@@ -734,7 +734,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
734
734
|
ON tracked_invocation(scope_teamfile, status, started_at);
|
|
735
735
|
CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_ended
|
|
736
736
|
ON tracked_invocation(status, ended_at);
|
|
737
|
-
`),t.pragma("user_version = 56"),n=56),JA(ZA)}function se(t,e){let n=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(n.map(r=>r.name))}function
|
|
737
|
+
`),t.pragma("user_version = 56"),n=56),JA(ZA)}function se(t,e){let n=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(n.map(r=>r.name))}function yr(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function zt(t,e){if(!yr(t,e)&&(t.exec(Dp(Up,"utf8")),!yr(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function Mp(t){let e=se(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
|
|
738
738
|
DROP TABLE IF EXISTS team_chat_log_v46;
|
|
739
739
|
CREATE TABLE team_chat_log_v46 (
|
|
740
740
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -974,7 +974,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
974
974
|
AND holder_host IS ?
|
|
975
975
|
AND started_at = ?
|
|
976
976
|
AND last_heartbeat_at IS ?
|
|
977
|
-
`)}}function
|
|
977
|
+
`)}}function $t(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let n=Buffer.byteLength(Jp,"utf8"),r=Math.max(0,65536-n),s=Buffer.from(t,"utf8"),i=r;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${Jp}`}var Jp,Kp=w(()=>{"use strict";Jp=`
|
|
978
978
|
...[truncated]`});function Ui(t){return[...t].sort((e,n)=>e.created_at.localeCompare(n.created_at)||e.id-n.id).at(-1)??null}function Yp(t){return{insertMailboxMessage:t.prepare(`
|
|
979
979
|
INSERT INTO agent_mailbox (
|
|
980
980
|
receiver_teamfile, receiver_alias, sender_teamfile, sender_alias,
|
|
@@ -1106,16 +1106,16 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
1106
1106
|
AND delivering_at IS NULL
|
|
1107
1107
|
ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
|
|
1108
1108
|
`),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Es(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let n=Buffer.byteLength(Vp,"utf8"),r=Math.max(0,65536-n),s=Buffer.from(t,"utf8"),i=r;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${Vp}`}var Vp,zp=w(()=>{"use strict";Vp=`
|
|
1109
|
-
...[truncated]`});function vs(t,e){return JSON.stringify([t,e])}function Zp(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(n=>typeof n=="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 ws,Ts,Qp=w(()=>{"use strict";ws="terminal_lock",Ts="member"});import{readFileSync as e_}from"node:fs";function ke(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 tc(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=tR();if(e===null)return null;try{let n=e_(`/proc/${t}/stat`,"utf-8"),r=n.lastIndexOf(")");if(r<0)return null;let i=n.slice(r+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function tR(){try{let t=e_("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function nR(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function t_(t,e){if(!ke(t))return"gone";if(!nR(e))return"unverified";let n=tc(t);return n===null?"unverified":n===e?"same":"different"}var
|
|
1109
|
+
...[truncated]`});function vs(t,e){return JSON.stringify([t,e])}function Zp(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(n=>typeof n=="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 ws,Ts,Qp=w(()=>{"use strict";ws="terminal_lock",Ts="member"});import{readFileSync as e_}from"node:fs";function ke(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 tc(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=tR();if(e===null)return null;try{let n=e_(`/proc/${t}/stat`,"utf-8"),r=n.lastIndexOf(")");if(r<0)return null;let i=n.slice(r+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function tR(){try{let t=e_("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function nR(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function t_(t,e){if(!ke(t))return"gone";if(!nR(e))return"unverified";let n=tc(t);return n===null?"unverified":n===e?"same":"different"}var Mt=w(()=>{"use strict"});import{createHash as rR}from"node:crypto";function sR(t,e,n){return rR("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function Ie(t,e,n){let r=sR(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)
|
|
1110
1110
|
VALUES (?, ?, ?, ?, ?)
|
|
1111
|
-
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,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(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var Wi=w(()=>{"use strict"});import{hostname as
|
|
1111
|
+
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,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(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var Wi=w(()=>{"use strict"});import{hostname as Er}from"node:os";function s_(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return nc;let n=Number(e);return!Number.isFinite(n)||n<=0?nc:Math.max(1,Math.trunc(n))}function qi(t,e={}){let n=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(r=>{r||clearInterval(n)}).catch(r=>e.onError?.(r))},e.intervalMs??nc);return n.unref?.(),n}function wr(t,e){let n=new Date().toISOString(),r=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:n},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:r}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let c=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<r?"stale":null;return{acquired:!0,lease:a.current??s,leaseId:a.lease_id,previous:i,reclaimReason:c}}if(!Bi(a.current,r))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:r}:{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 yn(t){return t.status!=="running"?null:t.holder_host===Er()&&t.holder_pid!==null&&t.holder_pid>0?ke(t.holder_pid)?"live":"dead":"unknown"}function Tr(t,e,n){let r,s=t.getTerminalLock(e,n);if(s!==null){if(iR(s))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:s};r??={source:"terminal-lock",holder_pid:s.holder_pid,holder_host:s.holder_host,reason:s.holder_host===Er()?"dead-pid":"stale"}}let i=oR(t,e,n);if(i!==null){if(aR(i))return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:i};r??={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===Er())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,n);if(o!==null){let a=new Date(Date.now()-En()).toISOString();if(!Bi(o,a))return{busy:!0,reason:"in-flight",inFlight:o};r??={source:"in-flight",holder_pid:o.holder_pid,holder_host:o.holder_pid===null?null:Er(),reason:o.holder_pid===null?"stale":"dead-pid"}}return r===void 0?{busy:!1}:{busy:!1,reclaimable:r}}function iR(t){if(t.holder_host===Er())return ke(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=cR():!1}function oR(t,e,n){return t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
|
|
1112
1112
|
FROM tracked_invocation
|
|
1113
1113
|
WHERE target_teamfile = ?
|
|
1114
1114
|
AND target_alias = ?
|
|
1115
1115
|
AND status = 'running'
|
|
1116
1116
|
AND launch_source = 'terminal'
|
|
1117
1117
|
ORDER BY started_at DESC, id DESC
|
|
1118
|
-
LIMIT 1`,e,n)[0]??null}function aR(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===
|
|
1118
|
+
LIMIT 1`,e,n)[0]??null}function aR(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===Er())?ke(t.holder_pid):lR(t)}function lR(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=En():!1}function Bi(t,e){return t.holder_pid===null?t.started_at<e:!ke(t.holder_pid)}function En(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return n_;let n=Number(e);return!Number.isFinite(n)||n<=0?n_:n}function cR(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return r_;let n=Number(e);return!Number.isFinite(n)||n<=0?r_:n}var n_,r_,nc,gt=w(()=>{"use strict";Mt();n_=8*60*60*1e3,r_=12e4,nc=3e4});import{randomUUID as o_}from"node:crypto";import{hostname as dR}from"node:os";function Zt(t,e){return{teamfile:t,alias:e}}function Hi(t,e,n={}){return{teamfile:t,alias:e,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function Xi(t,e){return t===null?null:Zt(t,e??"")}function rt(t){return`msg_mbx_${t}`}function Qt(t){return`msg_tcl_${t}`}function Gn(t){return`inv_${t}`}function Sr(t,e,n){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
|
|
1119
1119
|
holder_pid, holder_host, started_at, terminal_lock_id,
|
|
1120
1120
|
terminal_invocation_id, currently_handling_message_id,
|
|
1121
1121
|
currently_handling_since, last_seq
|
|
@@ -1132,7 +1132,7 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
1132
1132
|
SET currently_handling_message_id = NULL,
|
|
1133
1133
|
currently_handling_since = NULL
|
|
1134
1134
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1135
|
-
AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function mR(t,e){let n=e??new Date(Date.now()-
|
|
1135
|
+
AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function mR(t,e){let n=e??new Date(Date.now()-En()).toISOString();return Bi({holder_pid:t.holder_pid,started_at:t.started_at??""},n)}function pR(t,e,n){return e==="force"||e==="session-idle"?e:n?"force":t.holder_pid!==null&&!ke(t.holder_pid)?"dead-pid":"stale"}function _R(t){return{sender:Xi(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function vr(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
|
|
1136
1136
|
FROM message_pending WHERE message_id = ?`).get(e)??null}function en(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function rc(t,e={},n={}){return{message_id:rt(t.id),message_type:t.message_type,sender:t.sender_teamfile===null?null:Hi(t.sender_teamfile,t.sender_alias??"",n),receiver:Hi(t.receiver_teamfile,t.receiver_alias,e),root_teamfile:t.root_teamfile,legacy:{table:"agent_mailbox",id:t.id}}}function sc(t,e,n={},r={},s=[]){let i=rt(e.id),o=e.message_type==="response",a=o&&e.request_mailbox_id!==null?hR(t,e.request_mailbox_id):{},l={provider:a.provider??n.provider,sessionId:a.sessionId??n.sessionId},c=e.request_mailbox_id===null?null:rt(e.request_mailbox_id),d=rc(e,l,r);Ie(t,{stream_id:i,event_type:o?"RESPONSE_CREATE":"CREATE",observedLastSeq:0,ts:e.created_at,payload:{...d,content:e.payload,...o?{}:a_(t,e.sender_teamfile,e.sender_alias),...o?{in_reply_to_message_id:c,...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:{...d,...o?{in_reply_to_message_id:c}:{}}},u=>{t.prepare(`INSERT INTO message_pending
|
|
1137
1137
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
1138
1138
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
@@ -1206,14 +1206,14 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
1206
1206
|
AND json_extract(payload, '$.acked_by') = ?
|
|
1207
1207
|
ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),r=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(i_(t,e.messageId,e.ackedBy,e.ts),"removed"):vr(t,e.messageId)===null?"not-pending":"claimed";if(n!==void 0)return{appended:!1,seq:n.seq,pending_outcome:r?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=vr(t,e.messageId),a=r?"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(!r)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(a="removed",i_(t,e.messageId,e.ackedBy,e.ts)):o!==null&&(a="claimed")});if(!l.appended){let c=vr(t,e.messageId);a=r?c===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}function i_(t,e,n,r){let s=/^msg_mbx_(\d+)$/.exec(e);s!==null&&t.prepare(`UPDATE agent_mailbox
|
|
1208
1208
|
SET delivered_at = ?, receipt = ?
|
|
1209
|
-
WHERE id = ? AND delivered_at IS NULL`).run(r??new Date().toISOString(),`[acknowledged by ${n}]`,Number(s[1]))}var uR,bs=w(()=>{"use strict";Wi();
|
|
1209
|
+
WHERE id = ? AND delivered_at IS NULL`).run(r??new Date().toISOString(),`[acknowledged by ${n}]`,Number(s[1]))}var uR,bs=w(()=>{"use strict";Wi();gt();Mt();uR=60*60*1e3});function y_(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function lc(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function E_(t,e){let n=Gn(e.id),r=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:n,event_type:yR,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:n,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:r,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
|
|
1210
1210
|
(invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
|
|
1211
1211
|
root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
|
|
1212
1212
|
status, started_at, last_heartbeat_at, last_seq)
|
|
1213
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,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),lc(e)&&m_(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Vi(t,e){let n=
|
|
1213
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,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),lc(e)&&m_(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Vi(t,e){let n=Gn(e.id),r=y_(t,n);return r===null?!1:(Ie(t,{stream_id:n,event_type:ER,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,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
|
|
1214
1214
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1215
|
-
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);lc(e)&&__(t,s,n)}),!0)}function w_(t,e,n,r){let s=
|
|
1216
|
-
`)}var k_,Yi,TR,ks,I_,cc,zi,Is=w(()=>{"use strict";k_="other",Yi=["not_enough_information","dont_know","other_work"],TR=new Set([k_,...Yi]),ks="@abort",I_="invalid_decision",cc="escalation_aborted",zi="workflow_escalation"});import{randomUUID as x_}from"node:crypto";import{hostname as Ns}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function Be(t){return new dc(Fi({dbPath:t.path}))}function A_(t,e,n){let r=R_(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return R_(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(t)}function R_(t){let e=vR(t),n=e===null?null:SR(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))Zi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function vR(t){try{let e=JSON.parse(t);return Zi(e)?e:null}catch{return null}}function SR(t,e){let n=t[e];return Zi(n)?n:null}function Zi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function bR(t){try{let e=JSON.parse(t);return!Zi(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 kR(t,e){return t===null?!0:t.holder_host===Ns()?!ke(t.holder_pid):t.last_heartbeat<e}function IR(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let n=t.delivering_at<e;if(t.delivery_holder_host===Ns()&&NR(t.delivery_holder_pid)){let r=ke(t.delivery_holder_pid);return r?n?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:r}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:r}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:r}}return n?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function
|
|
1215
|
+
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);lc(e)&&__(t,s,n)}),!0)}function w_(t,e,n,r){let s=Gn(e.id),i=y_(t,s);return i===null?!1:(Ie(t,{stream_id:s,event_type:wR,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,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(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function T_(t,e,n){let r=Gn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),lc(e)&&p_(t,r,n)}function v_(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Gn(e))}function S_(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Gn(e))}var yR,ER,wR,b_=w(()=>{"use strict";Wi();bs();yR="INVOCATION_START",ER="INVOCATION_FINISH",wR="INVOCATION_NOTIFY_CLAIM"});function kr(t){return typeof t=="string"&&TR.has(t)}function N_(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: ${Yi[0]}`,` STANCE: ${Yi[1]}`,` STANCE: ${Yi[2]}`,` STANCE: ${k_}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
1216
|
+
`)}var k_,Yi,TR,ks,I_,cc,zi,Is=w(()=>{"use strict";k_="other",Yi=["not_enough_information","dont_know","other_work"],TR=new Set([k_,...Yi]),ks="@abort",I_="invalid_decision",cc="escalation_aborted",zi="workflow_escalation"});import{randomUUID as x_}from"node:crypto";import{hostname as Ns}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function D(){return new Date().toISOString()}function Be(t){return new dc(Fi({dbPath:t.path}))}function A_(t,e,n){let r=R_(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return R_(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(t)}function R_(t){let e=vR(t),n=e===null?null:SR(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))Zi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function vR(t){try{let e=JSON.parse(t);return Zi(e)?e:null}catch{return null}}function SR(t,e){let n=t[e];return Zi(n)?n:null}function Zi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function bR(t){try{let e=JSON.parse(t);return!Zi(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 kR(t,e){return t===null?!0:t.holder_host===Ns()?!ke(t.holder_pid):t.last_heartbeat<e}function IR(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let n=t.delivering_at<e;if(t.delivery_holder_host===Ns()&&NR(t.delivery_holder_pid)){let r=ke(t.delivery_holder_pid);return r?n?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:r}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:r}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:r}}return n?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function wn(t,e,n={}){let r=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(r);M({event:t,event_at:r,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,...n})}function NR(t){return Number.isInteger(t)&&(t??0)>0}function xR(t){return{...Yp(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1217
1217
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1218
1218
|
VALUES (?, ?, ?, ?, ?)
|
|
1219
1219
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1620,11 +1620,11 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
1620
1620
|
response = NULL
|
|
1621
1621
|
WHERE id = ?
|
|
1622
1622
|
AND status = 'running'
|
|
1623
|
-
`),...Gp(t),...Hp(t)}}function AR(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dc,ct=w(()=>{"use strict";ec();Xp();Kp();zp();Qp();$t();ce();bs();b_();Is();dc=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=xR(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,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 c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,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:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,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:n,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:n}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((n,r,s)=>AR("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);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,r,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(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==zi)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 d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.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(r!==ks&&!a.includes(r))return{resumed:!1,reason:I_};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.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:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=d_(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.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}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){A_(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){A_(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===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(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.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,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,D());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.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,n){return this.stmts.setTriggerCursor.run(n,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(D(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.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 n=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(n.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 n=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(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=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(n.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,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.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 n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,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,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.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,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=D(),r=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,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,D(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,D(),e)??null}closeIssue(e,n,r){let s=D(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,D(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.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,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=D();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=x_(),s=D();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=D(),o=this.stmts.insertChatbotMessage.run(e,n,r,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,n){this.stmts.upsertConfig.run(e,n,D())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=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(n.changes===1)return this.stmts.getJob.get(n.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 n=D(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=D(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=D(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:D();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(r.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,n){return this.stmts.setJobRun.run(n,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,n){return this.stmts.setPromptDispatchCompleted.run(n??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=D(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.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,n){return this.stmts.loadMailboxCursor.get(e,n)??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,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.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 n=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),r=Number(n.lastInsertRowid);return ic(this.db,r,e),Gi(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=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),r=Number(n.lastInsertRowid);return ic(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Gi(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{br(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Ji(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}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 n=e.started_at??D(),r=e.holder_host??Ns(),s=e.last_heartbeat_at??n,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,Ct(e.command),n,e.holder_pid??null,r,s,Ct(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return E_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??D();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ct(n.result_summary),Ct(n.error),n.team_chat_log_id??null,Ct(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Vi(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??D();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ct(r.result_summary),Ct(r.error),r.team_chat_log_id??null,Ct(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Vi(this.db,o),o})()}heartbeatTrackedInvocation(e,n=D()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return T_(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(v_(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(S_(this.db,e,Qt(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=D();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ct(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Vi(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||Gi(this.db,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,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:D()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=D()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return w_(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);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 r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Es(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(r.lastInsertRowid));return sc(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,n,r,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,n,r,s)}listEnqueuedResponseMailFromSender(e,n,r,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,n,r,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,n,r){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=Es(n),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of s){let d=this.getMailboxMessage(c),u=this.stmts.markMailboxMessageDelivered.run(r,i,c);a+=u.changes,u.changes===1&&d!==null&&o.push(d)}let l=new Map;for(let c of o){if(c.message_type!=="request")continue;let d=`${c.receiver_teamfile}\0${c.receiver_alias}`,u=l.get(d);(u===void 0||Ui([u,c])?.id===c.id)&&l.set(d,c)}for(let c of o){let d=l.get(`${c.receiver_teamfile}\0${c.receiver_alias}`)??null;Ki(this.db,c,i,r,null,c.message_type==="request"&&d!==null?{action:"clear",messageId:rt(d.id)}:null)}this.db.exec("COMMIT");for(let c of o)En("mailbox_delivery_delivered",c,{transition:c.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:r});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,n,r){let s=Es(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,d.id,d.delivering_at,d.delivery_holder_pid,d.delivery_holder_host).changes!==1){o.push(d);continue}a+=1,i.push(d)}let l=Ui(i),c=l===null?null:{action:"clear",messageId:rt(l.id)};for(let d of i)Ki(this.db,d,s,r,null,c);this.db.exec("COMMIT");for(let d of i)En("mailbox_delivery_delivered",d,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas"});for(let d of o)En("mailbox_delivery_finalize_skipped",d,{delivered_at:r,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,n,r){let s=Es(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,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 c=[...i].sort((p,_)=>p.created_at.localeCompare(_.created_at)||p.id-_.id),d=Ui(i),u=null;if(d!==null&&d.sender_teamfile!==null&&d.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(d.sender_teamfile,d.sender_alias,d.receiver_teamfile,d.receiver_alias,d.root_teamfile,s,r,null,null,null,null,d.reply_mode,d.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:rt(u.id),m=d===null?null:{action:"clear",messageId:rt(d.id)};for(let p of i)Ki(this.db,p,s,r,d!==null&&p.id!==d.id?f:null,m);u!==null&&sc(this.db,u,{},{},c.map(p=>rt(p.id))),this.db.exec("COMMIT");for(let p of i)En("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas-with-response"});for(let p of o)En("mailbox_delivery_finalize_skipped",p,{delivered_at:r,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,n,r=process.pid,s=Ns()){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(n,r,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(l_(this.db,d,n,r,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)En("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:n,delivery_holder_pid:r,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let n=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(n.length===0)return 0;let r=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of n){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(oc(this.db,o,"explicit-clear"),r.push(o))}this.db.exec("COMMIT");for(let i of r)En("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,n="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&&oc(this.db,s,n),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let n=this.stmts.listInFlightMailboxDeliveries.all(),r=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of n){let o=IR(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&&r.push(a)}this.db.exec("COMMIT");for(let i of s)En(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 r}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,n){return this.stmts.listDeliveredReceiptsForSender.all(e,n)}listOutboundPendingForSender(e,n){return this.stmts.listOutboundPendingForSender.all(e,n)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=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:u_(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Ss(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Ss(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1623
|
+
`),...Gp(t),...Hp(t)}}function AR(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dc,ct=w(()=>{"use strict";ec();Xp();Kp();zp();Qp();Mt();ce();bs();b_();Is();dc=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=xR(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,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 c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,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:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,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:n,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:n}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((n,r,s)=>AR("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);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,r,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(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==zi)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 d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.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(r!==ks&&!a.includes(r))return{resumed:!1,reason:I_};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.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:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=d_(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.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}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){A_(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,D()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,D());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){A_(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===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(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,D());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.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,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,D());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.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,n){return this.stmts.setTriggerCursor.run(n,D(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(D(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.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 n=this.stmts.insertTeam.run(e.name,D());return this.stmts.getTeam.get(n.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 n=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(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,D(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,D());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=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(n.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,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.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 n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,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,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.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,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=D(),r=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,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,D(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,D(),e)??null}closeIssue(e,n,r){let s=D(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,D(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.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,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=D();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,D(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=x_(),s=D();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=D(),o=this.stmts.insertChatbotMessage.run(e,n,r,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,n){this.stmts.upsertConfig.run(e,n,D())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=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(n.changes===1)return this.stmts.getJob.get(n.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 n=D(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=D(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=D(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:D();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,D()),s=this.stmts.getRun.get(r.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,n){return this.stmts.setJobRun.run(n,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,n){return this.stmts.setPromptDispatchCompleted.run(n??D(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,D());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=D(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.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,n){return this.stmts.loadMailboxCursor.get(e,n)??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,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.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 n=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),r=Number(n.lastInsertRowid);return ic(this.db,r,e),Gi(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=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),r=Number(n.lastInsertRowid);return ic(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Gi(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{br(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Ji(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}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 n=e.started_at??D(),r=e.holder_host??Ns(),s=e.last_heartbeat_at??n,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,$t(e.command),n,e.holder_pid??null,r,s,$t(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return E_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??D();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,$t(n.result_summary),$t(n.error),n.team_chat_log_id??null,$t(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Vi(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??D();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,$t(r.result_summary),$t(r.error),r.team_chat_log_id??null,$t(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Vi(this.db,o),o})()}heartbeatTrackedInvocation(e,n=D()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return T_(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(v_(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(S_(this.db,e,Qt(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=D();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,$t(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Vi(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||Gi(this.db,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,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:D()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=D()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return w_(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);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 r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Es(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(r.lastInsertRowid));return sc(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,n,r,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,n,r,s)}listEnqueuedResponseMailFromSender(e,n,r,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,n,r,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,n,r){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=Es(n),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of s){let d=this.getMailboxMessage(c),u=this.stmts.markMailboxMessageDelivered.run(r,i,c);a+=u.changes,u.changes===1&&d!==null&&o.push(d)}let l=new Map;for(let c of o){if(c.message_type!=="request")continue;let d=`${c.receiver_teamfile}\0${c.receiver_alias}`,u=l.get(d);(u===void 0||Ui([u,c])?.id===c.id)&&l.set(d,c)}for(let c of o){let d=l.get(`${c.receiver_teamfile}\0${c.receiver_alias}`)??null;Ki(this.db,c,i,r,null,c.message_type==="request"&&d!==null?{action:"clear",messageId:rt(d.id)}:null)}this.db.exec("COMMIT");for(let c of o)wn("mailbox_delivery_delivered",c,{transition:c.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:r});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,n,r){let s=Es(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,d.id,d.delivering_at,d.delivery_holder_pid,d.delivery_holder_host).changes!==1){o.push(d);continue}a+=1,i.push(d)}let l=Ui(i),c=l===null?null:{action:"clear",messageId:rt(l.id)};for(let d of i)Ki(this.db,d,s,r,null,c);this.db.exec("COMMIT");for(let d of i)wn("mailbox_delivery_delivered",d,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas"});for(let d of o)wn("mailbox_delivery_finalize_skipped",d,{delivered_at:r,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,n,r){let s=Es(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,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 c=[...i].sort((p,_)=>p.created_at.localeCompare(_.created_at)||p.id-_.id),d=Ui(i),u=null;if(d!==null&&d.sender_teamfile!==null&&d.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(d.sender_teamfile,d.sender_alias,d.receiver_teamfile,d.receiver_alias,d.root_teamfile,s,r,null,null,null,null,d.reply_mode,d.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:rt(u.id),m=d===null?null:{action:"clear",messageId:rt(d.id)};for(let p of i)Ki(this.db,p,s,r,d!==null&&p.id!==d.id?f:null,m);u!==null&&sc(this.db,u,{},{},c.map(p=>rt(p.id))),this.db.exec("COMMIT");for(let p of i)wn("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas-with-response"});for(let p of o)wn("mailbox_delivery_finalize_skipped",p,{delivered_at:r,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,n,r=process.pid,s=Ns()){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(n,r,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(l_(this.db,d,n,r,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)wn("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:n,delivery_holder_pid:r,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let n=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(n.length===0)return 0;let r=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of n){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(oc(this.db,o,"explicit-clear"),r.push(o))}this.db.exec("COMMIT");for(let i of r)wn("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,n="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&&oc(this.db,s,n),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let n=this.stmts.listInFlightMailboxDeliveries.all(),r=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of n){let o=IR(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&&r.push(a)}this.db.exec("COMMIT");for(let i of s)wn(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 r}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,n){return this.stmts.listDeliveredReceiptsForSender.all(e,n)}listOutboundPendingForSender(e,n){return this.stmts.listOutboundPendingForSender.all(e,n)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=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:u_(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Ss(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Ss(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1624
1624
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.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&&Ss(this.db,r,"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(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Ss(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(ws,vs(e,n),Ts);return r===void 0?null:Zp(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&ac(this.db,r,!0),this.stmts.upsertRuntimeState.run(ws,vs(e.teamfile,e.alias),Ts,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&f_(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ws,vs(e,n),Ts,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(ws,vs(e,n),Ts);return i.changes===1&&ac(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:bR(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=D()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!kR(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:x_(),holder_pid:process.pid,holder_host:Ns(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,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,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);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,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,D(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,D())}insertStep(e){let n=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(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,D(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=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(n.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 n=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(n.lastInsertRowid)}insertExternalObject(e){let r=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:r}}insertExternalSignal(e){let n=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()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=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(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(D(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=D();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.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:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=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(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=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(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,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 n=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(n.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,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,D())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,D())}}});import{realpathSync as RR}from"node:fs";import{resolve as LR}from"node:path";function uc(t){let e=LR(t);try{return RR(e)}catch{return e}}var L_=w(()=>{"use strict"});import{platform as O_}from"node:os";function Dt(t){let e=new xs;for(let n of t)e.registerAdapter(n);return e}var xs,fc=w(()=>{"use strict";L_();xs=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=uc(e.workspace);i=i.filter(a=>uc(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,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=O_()==="darwin"||O_()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as C_}from"node:fs";import{createInterface as $_}from"node:readline";import{stat as OR}from"node:fs/promises";import{homedir as CR}from"node:os";function M_(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*He(t){let e=C_(t,{encoding:"utf-8"}),n=$_({input:e,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=M_(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Ke(t,e){let n=[],r=C_(t,{encoding:"utf-8"}),s=$_({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=M_(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function Le(t){let e=await OR(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function pe(t){return t.replace(/\\n/g,`
|
|
1625
1625
|
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ve,tn=w(()=>{"use strict";ve=CR()});import{readdir as Qi,stat as D_,unlink as $R}from"node:fs/promises";import{join as Ir,basename as j_}from"node:path";function MR(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function DR(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(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 P_(t){let e=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of He(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&e++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;n+=u+f+m,r+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function jR(t){let e=PR(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.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&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function PR(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var eo,F_=w(()=>{"use strict";tn();eo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Ir(ve,".claude"),this.projectsDir=Ir(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Qi(this.projectsDir)}catch{return e}for(let r of n){let s=Ir(this.projectsDir,r);if(!(await D_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Qi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=j_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Ir(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,n){let r=await Ke(e,50),s=await Le(e),i="",o,a,l,c,d,u;for(let m of r)if(!MR(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;c||(c=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await P_(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,d,u,f,m=e,p;for await(let h of He(n))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:DR(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),y=h.message.content;if(typeof y=="string"){if(y.includes("<command-name>")||y.includes("<local-command-"))continue;d||(d=J(y.trim(),80)),u=J(y.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:pe(y.trim())})}else if(Array.isArray(y)){for(let E of y)if(E.type==="tool_result"){let S=typeof E.content=="string"?pe(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:E.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.stop_reason===null||h.message.stop_reason==="tool_use"?p="in_progress":typeof h.message.stop_reason=="string"&&(p="complete"),h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),y=h.message.content;if(Array.isArray(y))for(let E of y)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:g,content:pe(E.text),model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.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:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:g,content:E.thinking})}}if(!i)return null;jR(s);let _=await P_(n);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:p,firstUserMessage:d,lastUserMessage:u,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:_.totalCacheWriteInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await $R(n),!0):!1}async resolveSessionFile(e){let n;try{n=await Qi(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=Ir(this.projectsDir,o);if(!(await D_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Qi(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=j_(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&r.push({filePath:Ir(a,d),fileSessionId:u})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ke(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as FR,writeFileSync as c3,mkdirSync as d3}from"node:fs";import{join as UR,dirname as f3}from"node:path";import{homedir as WR}from"node:os";function BR(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function HR(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=BR(t.slice(e+1).trim());return n?{key:n,value:r}:null}function XR(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function to(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function JR(){return UR(WR(),".lmctl","config.toml")}function W_(t){let e=t??JR(),n;try{n=FR(e,"utf-8")}catch{return{tools:{}}}return GR(n)}function U_(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function GR(t){let e={},n={},r=t.split(`
|
|
1626
|
-
`),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?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=U_(i.min);f!==null&&(u.min=f)}if(i.max!==void 0){let f=U_(i.max);f!==null&&(u.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}i={}}for(let u of r){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=XR(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let _=".profile.",h=m.indexOf(_);h!==-1?s={kind:"tool",tool:m.slice(5,h),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=HR(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function q_(t){return t.site_name??null}function KR(t,e,n){if(!n)return"";let r=t.tools[e]??mc[e],s=r?.profiles?.[n]?.flags??mc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function B_(t,e){return!!t.tools[e]}function H_(t,e,n,r,s){let i=t.tools[e]??mc[e],o;if(i?.agent){let l=to(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=qR[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(to).join(" ");o=`printf '%s\\n' ${to(r)} | ${d}`}else o=c.map(to).join(" ")}let a=KR(t,e,s);return a&&(o+=" "+a),o}var mc,qR,pc=w(()=>{"use strict";mc={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:""}}}},qR={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 X_(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var J_=w(()=>{"use strict"});var VR,ge,no,
|
|
1627
|
-
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{r(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){if(n.userConfig&&B_(n.userConfig,this.name)){let s=n.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,n,s.agent)}let r=n.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return r<=0&&!n.signal?this.transportFn(e,{...n,binary:this.binary}):this.withTimeouts(r,e,n)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),d(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},d=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new _c("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=H_(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=X_(n.env),c=G_(s,{shell:!0,cwd:n.cwd,env:Ve(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let h=_.toString();m+=h,n.onDelta?.(h)}),c.stderr?.on("data",_=>{p+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let h=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:h}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function so(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new rn(t,n,e)}var dt,Se,nn,ro,rn,Nr=w(()=>{"use strict";dt=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},Se=class extends dt{},nn=class extends dt{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},ro=class extends dt{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},rn=class extends dt{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as gc from"node:child_process";function e0(t){if(typeof gc.spawnSync=="function")try{gc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function K_(t){return t.exitCode!==null||t.signalCode!==null}function hc(t,e){return K_(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function et(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??e0;if(K_(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await hc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await hc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await hc(t,QR)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var QR,Rs=w(()=>{"use strict";QR=1e3});function V_(t){le()&&je({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function
|
|
1626
|
+
`),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?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=U_(i.min);f!==null&&(u.min=f)}if(i.max!==void 0){let f=U_(i.max);f!==null&&(u.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}i={}}for(let u of r){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=XR(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let _=".profile.",h=m.indexOf(_);h!==-1?s={kind:"tool",tool:m.slice(5,h),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=HR(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function q_(t){return t.site_name??null}function KR(t,e,n){if(!n)return"";let r=t.tools[e]??mc[e],s=r?.profiles?.[n]?.flags??mc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function B_(t,e){return!!t.tools[e]}function H_(t,e,n,r,s){let i=t.tools[e]??mc[e],o;if(i?.agent){let l=to(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=qR[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(to).join(" ");o=`printf '%s\\n' ${to(r)} | ${d}`}else o=c.map(to).join(" ")}let a=KR(t,e,s);return a&&(o+=" "+a),o}var mc,qR,pc=w(()=>{"use strict";mc={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:""}}}},qR={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 X_(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var J_=w(()=>{"use strict"});var VR,ge,no,yt=w(()=>{"use strict";VR="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: ${VR}`,no=`send this exact lmctl seed instruction: "${ge}"`});function Tn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function zR(t,e){return e===void 0||e.length===0?t:{...t??process.env,[As]:e}}function Ve(t,e,n,r="chat"){return{...zR(Tn(t,e),n),[YR]:r}}var As,YR,Et=w(()=>{"use strict";As="LMCTL_SELF_SESSIONID",YR="LMCTL_LAUNCH_SOURCE"});import{spawn as G_}from"node:child_process";import{mkdirSync as ZR}from"node:fs";var _c,xe,Pt=w(()=>{"use strict";pc();J_();yt();Et();_c=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,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 n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===ge?n:r)}seed(e,n){return ZR(e,{recursive:!0}),new Promise(r=>{let s;try{s=G_(this.binary,this.seedArgsFor(n),{cwd:e,env:Tn(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return r({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
|
|
1627
|
+
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{r(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){if(n.userConfig&&B_(n.userConfig,this.name)){let s=n.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,n,s.agent)}let r=n.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return r<=0&&!n.signal?this.transportFn(e,{...n,binary:this.binary}):this.withTimeouts(r,e,n)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),d(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},d=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new _c("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=H_(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=X_(n.env),c=G_(s,{shell:!0,cwd:n.cwd,env:Ve(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let h=_.toString();m+=h,n.onDelta?.(h)}),c.stderr?.on("data",_=>{p+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let h=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:h}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function so(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new rn(t,n,e)}var dt,Se,nn,ro,rn,Nr=w(()=>{"use strict";dt=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},Se=class extends dt{},nn=class extends dt{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},ro=class extends dt{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},rn=class extends dt{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as gc from"node:child_process";function e0(t){if(typeof gc.spawnSync=="function")try{gc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function K_(t){return t.exitCode!==null||t.signalCode!==null}function hc(t,e){return K_(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function et(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??e0;if(K_(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await hc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await hc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await hc(t,QR)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var QR,Rs=w(()=>{"use strict";QR=1e3});function V_(t){le()&&je({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function vn(t,e){let n=n0[t];if(n)return n[e]??n.yolo}function s0(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function wt(t,e,n="yolo"){if(r0.has(t)){V_(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?vn(t,"plan"):t0[t];if(!r){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 Se(s)}if(!s0(e,r)){let s=r.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:n,args:e.join(" "),message:i}),new Se(i)}V_(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var t0,n0,r0,xr=w(()=>{"use strict";Nr();ce();t0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},n0={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"]}};r0=new Set(["codex","opencode","kimi"])});async function d0(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(yc),e),r.unref?.(),n!==void 0&&(s=()=>i(yc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function io(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();u0(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function u0(t,e,n,r){let s=t.pollMs??i0,i=t.maxHoldMs??o0,o=t.settleMs??a0,a=t.backgroundGraceMs??l0,l=!1,c=null,d=u=>r({startedMs:n,held:l,reason:u});for(;;){if(e.isAborted())return d("aborted");if(e.hasChildExited())return d("child-exited");let u=i-(Date.now()-n);if(u<=0)return d("max-hold");let f;try{f=await d0(t.hasOutstandingWork(),u,e.signal)}catch{return d("check-error")}if(f===yc)return d(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let _=a-(Date.now()-n);await new Promise(h=>setTimeout(h,Math.max(0,Math.min(s,c0,_))).unref?.());continue}if(!l||o<=0)return d("cleared");c===null&&(c=Date.now(),Ge(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-p>=o)return d("cleared")}if(l||(l=!0,t.onHold?.(),Ge(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return M({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),d("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var i0,o0,a0,l0,c0,yc,Ec=w(()=>{"use strict";ce();i0=2e3,o0=8*60*60*1e3,a0=5e3,l0=1e3,c0=50,yc=Symbol("check-timed-out")});function Y_(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
|
|
1628
1628
|
|
|
1629
1629
|
--- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1630
1630
|
|
|
@@ -1632,16 +1632,16 @@ var qx=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var me=(t,e)=>{f
|
|
|
1632
1632
|
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:
|
|
1633
1633
|
${e}
|
|
1634
1634
|
|
|
1635
|
-
${n}`:n}function Z_(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||p0[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=
|
|
1635
|
+
${n}`:n}function Z_(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||p0[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=vn(s,a)??h0[s]??["--dangerously-skip-permissions"];o.push(...l);try{wt(s,o,a)}catch(b){return r(b)}if(e.cwd&&!m0(e.cwd))return M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new Se(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=f0(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.sessionId)});c.stdin?.on("error",b=>{Ge(`stream-json: stdin pipe error, ignored (exit handler reports): ${b.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,M({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(c).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,M({event:"transport_abort",provider:s}),et(c).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let u="",f=!1,m=!1,p=0,_=!1,h=wc({onEvent:b=>{p=Date.now(),_=b.type!=="result",e.onEvent?.(b)},onText:e.onText});function g(){m||(m=!0,io(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>_,lastEventAtMs:()=>p,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function y(b){let k=h.sawResult();h.processLine(b),!k&&h.sawResult()&&g()}c.stdout?.on("data",b=>{u+=b.toString();let k=u.split(`
|
|
1636
1636
|
`);u=k.pop()||"";for(let P of k)y(P)});let E="";c.stderr?.on("data",b=>{E+=b.toString()}),c.on("error",b=>{M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:b.message}),r(new Se(`Failed to spawn ${i}: ${b.message}`,{cause:b}))}),c.on("exit",b=>{if(f=!0,d)return;u.trim()&&y(u);let k=h.finalize();k?(Ge(`stream-json: result ${k.result.slice(0,80)}${k.result.length>80?"...":""} (${k.durationMs}ms)`),n({...k,exitCode:b})):(M({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:E.slice(0,500)}),r(new Error(_0({tool:s,exitCode:b,stderr:E}))))});let S=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(S+`
|
|
1637
|
-
`),Ge(`stream-json: prompt sent (${t.length} chars)`)})}var p0,h0,Q_=w(()=>{"use strict";Nr();Rs();xr();ce();Ec();
|
|
1637
|
+
`),Ge(`stream-json: prompt sent (${t.length} chars)`)})}var p0,h0,Q_=w(()=>{"use strict";Nr();Rs();xr();ce();Ec();Et();Tc();Tc();p0={claude:"claude",qwen:"qwen"};h0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function oo(t={}){return[]}var vc=w(()=>{"use strict"});function Sc(t){return t==="plan"?"read-only":"danger-full-access"}function eh(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function bc(){return{agentItems:new Map,resultText:""}}function ao(t,e,n,r){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),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(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(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function kc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function th(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Ic(){return{pendingCodexError:null}}function Nc(t,e){let n=th(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function xc(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.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 Ac=w(()=>{"use strict"});import{spawn as g0}from"node:child_process";import{createInterface as y0}from"node:readline";import{existsSync as E0,readFileSync as w0}from"node:fs";import{fileURLToPath as T0}from"node:url";function S0(){return eh(v0)}function Sn(t,e){Ge(`[codex:${t}] ${JSON.stringify(e)}`)}function b0(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1638
1638
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1639
1639
|
${e}
|
|
1640
1640
|
|
|
1641
|
-
${n}`:n}function nh(t,e){return new Promise((n,r)=>{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?oo():[];i.push(...a),le()&&Me(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Sc(l);try{
|
|
1641
|
+
${n}`:n}function nh(t,e){return new Promise((n,r)=>{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?oo():[];i.push(...a),le()&&Me(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Sc(l);try{wt("codex",i,l)}catch(j){return r(j)}if(e.cwd&&!E0(e.cwd))return M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new Se(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=g0(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(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(d).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:"codex"}),et(d).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=y0({input:d.stdout}),m=new Map,p=1,_=e.threadId||"",h="",g=!1,y=!1,E=Date.now(),S=bc(),b=Ic();function k(j,A={}){return new Promise((R,re)=>{let X=p++;m.set(X,{resolve:R,reject:re});let N=JSON.stringify({jsonrpc:"2.0",id:X,method:j,params:A});d.stdin?.write(N+`
|
|
1642
1642
|
`)})}function P(j,A={}){let R=JSON.stringify({jsonrpc:"2.0",method:j,params:A});d.stdin?.write(R+`
|
|
1643
|
-
`)}f.on("line",j=>{let A;try{A=JSON.parse(j)}catch{return}if(typeof A.id=="number"&&m.has(A.id)){let X=m.get(A.id);if(m.delete(A.id),A.error){let N=A.error,x=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(A.error);X.reject(so(`codex app-server error: ${x}`,N))}else X.resolve(A);e.onEvent?.(A);return}let R=A.method;if(!R){e.onEvent?.(A);return}if(R==="thread/started"){let N=A.params?.thread;N?.id&&(_=N.id)}let re=le()?X=>{
|
|
1644
|
-
`),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:j instanceof Error?j.message:String(j)});let R=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(_=R.id)}else{let A=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(_=A.id)}await k("turn/start",{threadId:_,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(j){et(d).catch(()=>{}),r(j instanceof Error?j:new Error(String(j)))}})()})}var v0,rh=w(()=>{"use strict";ce();ce();Nr();Rs();xr();vc();ce();
|
|
1643
|
+
`)}f.on("line",j=>{let A;try{A=JSON.parse(j)}catch{return}if(typeof A.id=="number"&&m.has(A.id)){let X=m.get(A.id);if(m.delete(A.id),A.error){let N=A.error,x=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(A.error);X.reject(so(`codex app-server error: ${x}`,N))}else X.resolve(A);e.onEvent?.(A);return}let R=A.method;if(!R){e.onEvent?.(A);return}if(R==="thread/started"){let N=A.params?.thread;N?.id&&(_=N.id)}let re=le()?X=>{Sn("item.text/buffer-mismatch",{itemId:X.itemId,threadId:X.threadId??null,turnId:X.turnId??null,expectedFromItemText:X.expectedFromItemText,gotFromBuffer:X.gotFromBuffer,expectedLen:X.expectedFromItemText.length,gotLen:X.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let X=A.params,N=X?.turn;N?.id&&(h=N.id),ao(A,S,e.onDelta,re),le()&&Sn("turn/started",{params:X??null})}if(le()&&(R==="item/started"||R==="item/completed")){let X=A.params;X?.item?.type==="agentMessage"&&Sn(R,{params:X??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let X=A.params;le()&&Sn("agentMessage/delta",{params:X??null})}ao(A,S,e.onDelta,re)}if(R==="turn/completed"){let X=A.params;if(le())for(let[x,C]of S.agentItems.entries())C.buffer&&Sn("turn/completed/unflushed-item",{itemId:x,phase:C.phase,bufferLen:C.buffer.length});kc(S),le()&&Sn("turn/completed",{params:X??null});let N=xc(A,b);N.shouldReject?(le()&&Sn("turn/completed/terminal-reject",{message:N.turnError.message}),y=!0,g=!0,d.stdin?.end(),r(N.turnError)):(g=!0,d.stdin?.end())}if(R==="error"){let X=Nc(A,b);if(le()){let N=A.params,x=N?.error,C=typeof x?.message=="string"?x.message:"(no message)";Sn(X.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:X.willRetry,params:N??null})}}e.onEvent?.(A)});let U="";d.stderr?.on("data",j=>{U+=j.toString()}),d.on("error",j=>{M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:j.message}),r(new Se(`Failed to spawn codex app-server: ${j.message}`,{cause:j}))}),d.on("exit",j=>{if(!u&&!y){if(g){n({result:S.resultText,threadId:_,turnId:h,durationMs:Date.now()-E,exitCode:j});return}if(b.pendingCodexError){r(b.pendingCodexError);return}M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:j,stderr_tail:U.slice(0,500)}),r(new Error(b0({exitCode:j,stderr:U})))}}),(async()=>{try{if(await k("initialize",S0()),P("initialized",{}),e.threadId)try{let j=k("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),A=new Promise((R,re)=>setTimeout(()=>re(new Error("resume timeout")),3e4));await Promise.race([j,A]),_=e.threadId}catch(j){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1644
|
+
`),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:j instanceof Error?j.message:String(j)});let R=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(_=R.id)}else{let A=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(_=A.id)}await k("turn/start",{threadId:_,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(j){et(d).catch(()=>{}),r(j instanceof Error?j:new Error(String(j)))}})()})}var v0,rh=w(()=>{"use strict";ce();ce();Nr();Rs();xr();vc();ce();Et();Ac();Ac();v0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(w0(T0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as oh,mkdirSync as k0,readFileSync as ah,writeFileSync as sh}from"node:fs";import{join as Ls,resolve as I0}from"node:path";function lh(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 Rc(t,e,n={existsSync:oh,readFileSync:ah}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=I0(e,s.sessiondir??e);for(let o of N0(i)){let a=x0(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(lh(a.permission)||r.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 r}function N0(t){return[Ls(t,".opencode","opencode.jsonc"),Ls(t,"opencode.jsonc"),Ls(t,"opencode.json")]}function x0(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(A0(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function A0(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
|
|
1645
1645
|
`;)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 lo(t,e={}){let n=Ls(t,".opencode"),r=Ls(n,"opencode.json");if(!oh(r)){k0(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return sh(r,o+`
|
|
1646
1646
|
`,"utf-8"),!0}let s;try{s=JSON.parse(ah(r,"utf-8"))}catch{return console.log(ih.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(ih.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),lh(s.permission)||M({event:"opencode_yolo_override",provider:"opencode",config_path:r,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&&sh(r,JSON.stringify(s,null,2)+`
|
|
1647
1647
|
`,"utf-8"),i}var ih,co=w(()=>{"use strict";ce();ih={yellow:t=>t}});function uh(t){let e=[...t.matchAll(R0)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return ch(t.slice(r).trimStart())}return ch(M0(t.replace(L0,"")))}function M0(t){let e=O0.exec(t);if(e===null)return t;let n=t.slice(e[0].length),r=[...n.matchAll(C0)];if(r.length<2)return t;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function ch(t){let e=[...t.matchAll($0)];if(e.length===0)return t;let n=e[e.length-1],r=(n.index??0)+n[0].length;return t.slice(r).trimStart()}function Ar(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function fh(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Lc(t={}){let e="",n="",r="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?uh(n):n,sessionId:e,stopReason:r});return{setSessionId(a){e=a},beginTurn(){n="",r="",s=!1,i=!0},completeTurn(a){return r=fh(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(n+=u,t.onDelta?.(u)),!0},finalize(){return s?o():null}}}var dh,R0,L0,O0,C0,$0,Oc=w(()=>{"use strict";dh="(?:png|jpe?g|webp|heic|pdf)",R0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${dh}\\s*`,"gi"),L0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${dh}\\s*`,"i"),O0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,C0=/^STANCE:\s+\S+\s*$/gim,$0=/\[Thought:\s*true\]\s*/gi});import{spawn as mh}from"node:child_process";import{existsSync as D0}from"node:fs";import{createInterface as j0}from"node:readline";function P0(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
@@ -1653,26 +1653,26 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1653
1653
|
`)}function ph(t,e){let n=j0({input:t.stdout}),r=new Map,s=(o,a={})=>new Promise((l,c)=>{let d=U0++;r.set(d,{resolve:l,reject:c});let u=JSON.stringify({jsonrpc:"2.0",id:d,method:o,params:a});je({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:d,params:a}),t.stdin?.write(`${u}
|
|
1654
1654
|
`)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
|
|
1655
1655
|
`)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(je({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"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(so(`ACP RPC error: ${u}`,d))}else c.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 c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});je({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
|
|
1656
|
-
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Se("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function $c(t){let e;try{e=mh(t.binaryPath??Cc.opencode.binary,Cc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ve(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 n=ph(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!u){s(d);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=Ar(d);try{await n.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 n.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(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function W0(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function _h(t,e){let n=Cc[e.tool];return n?new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{lo(e.cwd)}catch(k){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:k instanceof Error?k.message:String(k)})}let o=e.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let k=
|
|
1657
|
-
`),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{
|
|
1656
|
+
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Se("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function $c(t){let e;try{e=mh(t.binaryPath??Cc.opencode.binary,Cc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ve(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 n=ph(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!u){s(d);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=Ar(d);try{await n.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 n.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(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function W0(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function _h(t,e){let n=Cc[e.tool];return n?new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{lo(e.cwd)}catch(k){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:k instanceof Error?k.message:String(k)})}let o=e.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let k=vn("gemini","plan"),P=vn("gemini","yolo");a=a.filter(U=>!(P??[]).includes(U)),k&&a.push(...k)}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.
|
|
1657
|
+
`),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{wt(e.tool,a,l)}catch(k){return s(k)}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.
|
|
1658
1658
|
`),M({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!D0(e.cwd))return M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new Se(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=mh(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.sessionId)}),d=Date.now(),u=!1,f=!1,m=0,p=!1,_=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),et(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let h=e.sessionId||"",g=Lc({tool:e.tool,onDelta:e.onDelta});g.setSessionId(h);let y=ph(c,{provider:e.tool,onEvent:k=>{m=Date.now(),W0(k)&&(_=!0),e.onEvent?.(k)},onNotification:k=>{m=Date.now(),g.processMessage(k)}}),{sendRpc:E,sendNotification:S}=y,b="";c.stderr?.on("data",k=>{b+=k.toString()}),c.on("error",k=>{y.close(k),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:k.message,elapsed_ms:Date.now()-d}),s(new Se(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${k.message}`,{cause:k}))}),c.on("exit",k=>{if(f=!0,y.close(new Se(`ACP process exited with code ${String(k)}`)),u)return;let P=g.finalize();if(P!==null)r({result:P.result,sessionId:P.sessionId,durationMs:Date.now()-d,stopReason:P.stopReason,exitCode:k});else{let U=F0(e.tool,b);M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:k,stderr_tail:U.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(P0({tool:e.tool,exitCode:k,stderr:U})))}}),(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),e.sessionId)try{let U=await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});h=Ar(U,e.sessionId),g.setSessionId(h)}catch(U){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${U instanceof Error?U.message:String(U)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
1659
1659
|
`),M({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:U instanceof Error?U.message:String(U)});let j=await E("session/new",{cwd:e.cwd,mcpServers:[]});h=Ar(j),g.setSessionId(h)}else{let U=await E("session/new",{cwd:e.cwd,mcpServers:[]});h=Ar(U),g.setSessionId(h)}if(e.tool==="kimi"){let U=o==="plan"?"plan":"auto";try{await E("session/set_config_option",{sessionId:h,configId:"mode",value:U}),Ge(`acp: set_config_option(mode=${U}) ok`)}catch(j){let A=j instanceof Error?j.message:String(j);throw M({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:U,error_message:A}),new Error(`Cannot set Kimi ACP permission mode to ${U}: ${A}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await E("session/set_config_option",{sessionId:h,configId:"model",value:e.model}),Ge(`acp: set_config_option(model=${e.model}) ok`)}catch(U){let j=U instanceof Error?U.message:String(U);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${j}
|
|
1660
1660
|
`),M({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:j})}if(e.effort&&e.tool==="opencode"){let U="effort";try{await E("session/set_config_option",{sessionId:h,configId:U,value:e.effort}),Ge(`acp: set_config_option(${U}=${e.effort}) ok`)}catch(j){let A=j instanceof Error?j.message:String(j);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${A}
|
|
1661
|
-
`),M({event:"acp_config_option_failed",provider:e.tool,config_id:U,value:e.effort,error_message:A})}}g.beginTurn(),p=!0,Ge(`acp: prompt sent (${t.length} chars)`);let k=await E("session/prompt",{sessionId:h,prompt:[{type:"text",text:t}]}),P=g.completeTurn(k);p=!1,Ge(`acp: result received (${P.result.length} chars, stopReason=${P.stopReason})`),io(e.holdOpen,{isAborted:()=>u,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>_})}catch(k){et(c).catch(()=>{}),s(k instanceof Error?k:new Error(String(k)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Cc,U0,Mc=w(()=>{"use strict";ce();Nr();Rs();Ec();xr();co();ce();
|
|
1661
|
+
`),M({event:"acp_config_option_failed",provider:e.tool,config_id:U,value:e.effort,error_message:A})}}g.beginTurn(),p=!0,Ge(`acp: prompt sent (${t.length} chars)`);let k=await E("session/prompt",{sessionId:h,prompt:[{type:"text",text:t}]}),P=g.completeTurn(k);p=!1,Ge(`acp: result received (${P.result.length} chars, stopReason=${P.stopReason})`),io(e.holdOpen,{isAborted:()=>u,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>_})}catch(k){et(c).catch(()=>{}),s(k instanceof Error?k:new Error(String(k)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Cc,U0,Mc=w(()=>{"use strict";ce();Nr();Rs();Ec();xr();co();ce();Et();Oc();Oc();Cc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},U0=1});function Ee(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function hh(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=q0){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function B0(){let t=new Map;return(e,n)=>{H0(e,hh(t,n))}}function H0(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="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,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(Ee(a,60));let d=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:d});return}if(r==="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(Ee(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="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:Ee(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=Ee(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Ee(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Ee(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
|
|
1662
1662
|
`).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&&(d=`${f.split(`
|
|
1663
|
-
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function uo(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?B0():void 0,s=await Z_(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:r?i=>r(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 X0(){let t=new Map;return(e,n)=>{J0(e,hh(t,n))}}function J0(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:Ee(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:Ee(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=Ee(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:Ee(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,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${Ee(c,80)}`:"running\u2026";e({kind:"other",summary:d,id:a})}return}e({kind:"other",summary:i})}}async function
|
|
1663
|
+
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function uo(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?B0():void 0,s=await Z_(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:r?i=>r(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 X0(){let t=new Map;return(e,n)=>{J0(e,hh(t,n))}}function J0(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:Ee(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:Ee(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=Ee(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:Ee(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,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${Ee(c,80)}`:"running\u2026";e({kind:"other",summary:d,id:a})}return}e({kind:"other",summary:i})}}async function bn(t,e){let n=e.acpTool||e.binary;e.model&&n==="copilot"&&je({event:"model_ignored",provider:n,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let r=e.onProgress?X0():void 0,s=await _h(t,{tool:n,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:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function G0(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${Ee(o,120)}`}:{kind:"other",summary:`codex error: ${Ee(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:Ee(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):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,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:Ee(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";e({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:Ee(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(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:Ee(s)}:{kind:"text",summary:Ee(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:Ee(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
|
|
1664
1664
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Ee(o,60)}`:Ee(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let i=s.split(`
|
|
1665
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Ee(o,60)}`:Ee(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function gh(t,e){let n=await nh(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?r=>G0(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var q0,
|
|
1665
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Ee(o,60)}`:Ee(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function gh(t,e){let n=await nh(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?r=>G0(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var q0,kn=w(()=>{"use strict";Q_();rh();Mc();ce();q0=256});function jc(t){return new Dc(t)}var Dc,Pc=w(()=>{"use strict";F_();Pt();kn();yt();Dc=class extends xe{constructor(e){super({provider:new eo(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:uo})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as K0,stat as yh,unlink as V0}from"node:fs/promises";import{join as Os,basename as Y0}from"node:path";function z0(t,e,n){return`${t}|${e.toISOString()}|${n}`}function Cs(t,e,n){let r=z0(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function Eh(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function Z0(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 Rr(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(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Rr(n)}).filter(n=>n.length>0).join(`
|
|
1666
1666
|
`);try{return JSON.stringify(t)}catch{return String(t)}}function Q0(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 eL(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...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 r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function wh(t){let e=0,n=0,r=0,s=0,i=0,o,a;for await(let l of He(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;n=c.input_tokens??n,r=c.cached_input_tokens??c.cache_read_input_tokens??r,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=Z0(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var fo,Th=w(()=>{"use strict";tn();fo=class{name="codex";codexDirs;constructor(e={}){let n=[Os(ve,".codex"),Os(ve,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Os(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Os(n,"sessions");try{await yh(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await K0(e)}catch{return n}for(let s of r){let i=Os(e,s),o=await yh(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=Y0(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Ke(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,d,u,f;for(let p of n){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 _=p.payload.message||p.payload.text;_&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(h=>h.type==="input_text"&&typeof h.text=="string"&&h.text);typeof _?.text=="string"&&(c||(c=J(_.text.trim(),80)),d=J(_.text.trim(),80))}}if(!i)return null;let m=await wh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:Eh(u,f),firstUserMessage:c,lastUserMessage:d,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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,d,u=e,f,m,p=new Set;for await(let h of He(n)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Eh(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let y=h.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 S=E.text.trim();c||(c=J(S,80)),d=J(S,80),Cs(s,p,{role:"user",timestamp:g,content:pe(S)})}continue}if(y.role==="assistant"&&y.content){for(let E of y.content)E.type==="output_text"&&typeof E.text=="string"&&E.text&&Cs(s,p,{role:"assistant",timestamp:g,content:pe(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&&Cs(s,p,{role:"system",timestamp:g,content:pe(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?pe(Rr(y.arguments)):void 0,toolInputData:Q0(y.arguments),toolCallId:y.call_id});continue}if(y.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Rr(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?pe(Rr(y.input)):void 0,toolInputData:eL(y.name,y.input),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Rr(y.output)),toolCallId:y.call_id});continue}if(y.type==="reasoning"&&y.summary){let E=y.summary.map(S=>Rr(S.text)).join(`
|
|
1667
|
-
`);E.trim()&&Cs(s,p,{role:"thinking",timestamp:g,content:pe(E)});continue}}if(h.type==="event_msg"&&h.payload&&(h.payload.type==="task_started"?m="in_progress":h.payload.type==="task_complete"?m="complete":h.payload.type==="turn_aborted"&&(m="aborted"),h.payload.type==="agent_reasoning")){let y=h.payload.message||h.payload.text;y&&Cs(s,p,{role:"thinking",timestamp:g,content:pe(y)})}}if(!i)return null;let _=await wh(n);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:d,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:_.lastTokenUsage,modelContextWindow:_.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await V0(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ke(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 Uc(t){return new Fc(t)}var Fc,Wc=w(()=>{"use strict";Th();Pt();
|
|
1667
|
+
`);E.trim()&&Cs(s,p,{role:"thinking",timestamp:g,content:pe(E)});continue}}if(h.type==="event_msg"&&h.payload&&(h.payload.type==="task_started"?m="in_progress":h.payload.type==="task_complete"?m="complete":h.payload.type==="turn_aborted"&&(m="aborted"),h.payload.type==="agent_reasoning")){let y=h.payload.message||h.payload.text;y&&Cs(s,p,{role:"thinking",timestamp:g,content:pe(y)})}}if(!i)return null;let _=await wh(n);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:d,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:_.lastTokenUsage,modelContextWindow:_.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await V0(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ke(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 Uc(t){return new Fc(t)}var Fc,Wc=w(()=>{"use strict";Th();Pt();kn();yt();Fc=class extends xe{constructor(e){super({provider:new fo(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}
|
|
1668
1668
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:gh})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n.slice(0,-1),"--model",e.model,n[n.length-1]]:n}}});function $s(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function mo(t){let e=$s(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 n=t.split(`
|
|
1669
1669
|
`).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}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<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?tL(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}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 tL(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&vh(t.tokens)&&vh(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function vh(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Sh(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
|
|
1670
1670
|
`)+`
|
|
1671
|
-
`}var qc=w(()=>{"use strict"});import{createHash as nL}from"node:crypto";import{readdir as Ms,readFile as bh,stat as po,unlink as rL}from"node:fs/promises";import{join as st,basename as sL,dirname as iL}from"node:path";import{cwd as oL}from"node:process";function kh(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ih(t){return t==="user"}function Bc(t){return t==="gemini"||t==="assistant"}function
|
|
1672
|
-
`).trim();k&&i.push({role:"thinking",timestamp:
|
|
1673
|
-
`)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=dL(r,"utf-8"),i=$s(s),o=mo(s),a=_L();o.sessionId=a,o.kind="main";let l=pL(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=mL(l,u);return fL(l,{recursive:!0}),uL(f,Sh(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 Ah,readFile as hL,rm as gL,stat as Lr}from"node:fs/promises";import{basename as yL,join as
|
|
1674
|
-
`)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[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
|
|
1675
|
-
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function SL(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var go,Oh=w(()=>{"use strict";tn();go=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||
|
|
1671
|
+
`}var qc=w(()=>{"use strict"});import{createHash as nL}from"node:crypto";import{readdir as Ms,readFile as bh,stat as po,unlink as rL}from"node:fs/promises";import{join as st,basename as sL,dirname as iL}from"node:path";import{cwd as oL}from"node:process";function kh(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ih(t){return t==="user"}function Bc(t){return t==="gemini"||t==="assistant"}function Kn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function aL(t){return`${t.sessionId}\0${t.cwd}`}function lL(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],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 _o(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Nh(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!Bc(a.type)||!a.tokens)continue;let l=_o(a.tokens.input),c=_o(a.tokens.cached),d=Math.max(l-c,0),u=_o(a.tokens.output),f=_o(a.tokens.thoughts);e+=l,n+=c,r+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function cL(t){return nL("sha256").update(t).digest("hex")}function Ds(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=iL(n);if(r===n)break;n=r}}var ho,xh=w(()=>{"use strict";tn();qc();ce();ho=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||st(ve,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=e.claudeDir||st(ve,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(ve,".codex"),st(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=>st(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=aL(s),o=n.get(i);n.set(i,o?lL(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let h of o){let g=Kn(h.timestamp),y=h.type,E=pe(kh(h.content));if(Ih(y)){let b=E.trim();b&&(d||(d=J(b,80)),u=J(b,80)),i.push({role:"user",timestamp:g,content:b||E});continue}if(Bc(y)){h.model&&(f=h.model);for(let b of h.thoughts||[]){let k=[b.subject,b.description].filter(Boolean).join(`
|
|
1672
|
+
`).trim();k&&i.push({role:"thinking",timestamp:Kn(b.timestamp,g),content:pe(k)})}i.push({role:"assistant",timestamp:g,content:E,model:h.model});continue}let S=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${S}${E}`.trim()})}let m=Kn(r.startTime,s.createdAt),p=Kn(r.lastUpdated,s.modifiedAt),_=Nh(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ih(m.type)){u++;let p=kh(m.content).trim();p&&(l||(l=J(pe(p),80)),c=J(pe(p),80))}else Bc(m.type)&&(u++,m.model&&(d=m.model));let f=Nh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Kn(n.startTime,r.createdAt),modifiedAt:Kn(n.lastUpdated,r.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,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 n=await bh(e,"utf-8");if($s(n)==="unknown")return M({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.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 mo(n)}catch{return null}}extractSessionIdFromFilename(e){let n=sL(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await Ms(this.geminiTmpDir)}catch{return e}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await po(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ms(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(st(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await rL(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let d=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:Kn(i?.lastUpdated,d.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[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;Ds(e,oL());for(let r of this.extraWorkspacePaths)Ds(e,r);for(let r of await this.collectGeminiProjectPaths())Ds(e,r);for(let r of await this.collectCodexCwds())Ds(e,r);for(let r of await this.collectClaudeCwds())Ds(e,r);let n=new Map;for(let r of e)n.set(cL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await bh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ke(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await Ms(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await po(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ms(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),d=(await Ke(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await po(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await Ms(e)}catch{return n}for(let i of s){let o=st(e,i),a=await po(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as dL,writeFileSync as uL,mkdirSync as fL}from"node:fs";import{join as mL,dirname as pL}from"node:path";import{randomUUID as _L}from"node:crypto";function Xc(t){return new Hc(t)}var Hc,Jc=w(()=>{"use strict";xh();Pt();kn();yt();qc();Hc=class extends xe{constructor(e){super({provider:new ho(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:(n,r)=>bn(n,{...r,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(`
|
|
1673
|
+
`)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=dL(r,"utf-8"),i=$s(s),o=mo(s),a=_L();o.sessionId=a,o.kind="main";let l=pL(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=mL(l,u);return fL(l,{recursive:!0}),uL(f,Sh(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 Ah,readFile as hL,rm as gL,stat as Lr}from"node:fs/promises";import{basename as yL,join as Tt}from"node:path";function EL(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function Gc(){return{shutdownTotals:null,assistantOutputSum:0}}function Lh(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=EL(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function Rh(t){let e=t.shutdownTotals,n=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:n}}function wL(t){let e={};for(let n of t.split(`
|
|
1674
|
+
`)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[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 Vn(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function TL(t){let e=0,n=Gc();for await(let r of He(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++,Lh(n,r);return{messageCount:e,tokens:n}}function vL(t){let e=SL(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),d=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
|
|
1675
|
+
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function SL(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var go,Oh=w(()=>{"use strict";tn();go=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||Tt(ve,".copilot");this.sessionStateDir=Tt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Ah(this.sessionStateDir)}catch{return e}for(let r of n){let s=Tt(this.sessionStateDir,r);if((await Lr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Tt(n,"events.jsonl"),i=await Lr(s).catch(()=>null),o=i?s:Tt(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",d,u,f,m,p,_,h=r?.id||yL(n)||e,g=Gc();if(i)for await(let y of He(s)){let E=Vn(y.timestamp)||a.modifiedAt;if(Lh(g,y),y.type==="session.start"&&y.data){y.data.sessionId&&(h=y.data.sessionId),y.data.copilotVersion&&(u=y.data.copilotVersion),y.data.startTime&&(_=Vn(y.data.startTime)),y.data.selectedModel&&(d=y.data.selectedModel),y.data.context&&(y.data.context.cwd&&(c=y.data.context.cwd),y.data.context.branch&&(f=y.data.context.branch));continue}if(y.type==="session.model_change"&&y.data?.newModel){d=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let S=y.data.content||"",b=S.trim();b&&(m||(m=J(b,80)),p=J(b,80)),l.push({role:"user",timestamp:E,content:pe(b||S)});continue}if(y.type==="assistant.message"&&y.data){let S=(y.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:E,content:pe(S),model:d}),y.data.toolRequests)for(let b of y.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolInputData:jt(b.arguments),toolCallId:b.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let S=y.data.result?.content||"",b=y.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:pe(S),toolDetailedContent:b?pe(b):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:E,content:pe(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let S=y.data?.message||"";S.trim()&&l.push({role:"system",timestamp:E,content:pe(S)});continue}}if(!m){let y=(r?.summary||"").trim();y&&(m=J(y,80))}return vL(l),{provider:"copilot",sessionId:h,cwd:c,createdAt:_??Vn(r?.created_at)??a.createdAt,modifiedAt:Vn(r?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...Rh(g),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=Tt(e,"events.jsonl"),i=await Lr(s).catch(()=>null),o=i?s:Tt(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ke(s,20):[],c=r?.id||n,d=r?.cwd||"(unknown workspace)",u,f,m,p,_;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(c=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=Vn(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(d=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=J(y,80)),_=J(y,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=J(g,80))}let h=i?await TL(s):{messageCount:0,tokens:Gc()};return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Vn(r?.created_at)??a.createdAt,modifiedAt:Vn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:h.messageCount,filePath:o,...Rh(h.tokens)}}async readWorkspaceYaml(e){let n=Tt(e,"workspace.yaml");try{let r=await hL(n,"utf-8");return wL(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await gL(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await Ah(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=Tt(this.sessionStateDir,e);if((await Lr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=Tt(this.sessionStateDir,s);(await Lr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=Tt(this.sessionStateDir,s);if(!(await Lr(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 Vc(t){return new Kc(t)}var Kc,Yc=w(()=>{"use strict";Oh();Pt();kn();ce();yt();Kc=class extends xe{constructor(e){super({provider:new go(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:(n,r)=>bn(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return je({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as Ch,readdirSync as bL,statSync as $h}from"node:fs";import{join as In}from"node:path";import{createRequire as kL}from"node:module";function Mh(){return zc===null&&(zc=kL(import.meta.url)("node:sqlite").DatabaseSync),zc}function Dh(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function jh(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function Ph(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 IL(){let t=process.env.XDG_DATA_HOME||In(ve,".local","share"),e=process.env.XDG_CONFIG_HOME||In(ve,".config");return[In(t,"opencode","opencode.db"),In(e,"opencode","opencode.db")]}function NL(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||In(ve,".local","share"),e=In(t,"lmplayer"),n=In(e,"opencode-local.db"),r=[n];try{let s=bL(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>In(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return $h(o).mtimeMs-$h(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function xL(t){return t==="lmplayer"?NL():IL()}var zc,Or,Zc=w(()=>{"use strict";tn();ce();zc=null;Or=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=xL(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Ch(e))}openDb(e){if(!Ch(e))return null;let n=new(Mh())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1676
1676
|
s.time_created, s.time_updated
|
|
1677
1677
|
FROM session s
|
|
1678
1678
|
ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
@@ -1685,14 +1685,14 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1685
1685
|
FROM session s
|
|
1686
1686
|
WHERE s.id LIKE ?
|
|
1687
1687
|
ORDER BY s.time_updated DESC
|
|
1688
|
-
LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function ed(){return new Qc}var Qc,td=w(()=>{"use strict";Zc();Pt();
|
|
1689
|
-
`).trim():""}function Bh(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function FL(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Bh(t)??""}function UL(t){let e=WL(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function WL(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var ML,DL,yo,Hh=w(()=>{"use strict";tn();ML="1.4",DL="1.5",yo=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=nd(e?.kimiHome??process.env.KIMI_CODE_HOME??
|
|
1690
|
-
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return
|
|
1688
|
+
LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function ed(){return new Qc}var Qc,td=w(()=>{"use strict";Zc();Pt();kn();yt();Qc=class extends xe{constructor(){super({provider:new Or,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,n)=>bn(e,{...n,acpTool:"opencode"})})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??ge),n}}});import{appendFile as AL,mkdir as RL,readFile as Fh,readdir as Uh,rm as LL,stat as Wh}from"node:fs/promises";import{basename as OL,dirname as CL,isAbsolute as qh,join as Yn,relative as $L,resolve as nd}from"node:path";function rd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function jL(t){return typeof t=="number"?new Date(t):rd(t)??new Date(0)}function PL(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(`
|
|
1689
|
+
`).trim():""}function Bh(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function FL(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Bh(t)??""}function UL(t){let e=WL(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function WL(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var ML,DL,yo,Hh=w(()=>{"use strict";tn();ML="1.4",DL="1.5",yo=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=nd(e?.kimiHome??process.env.KIMI_CODE_HOME??Yn(ve,".kimi-code")),this.sessionsDir=Yn(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await LL(n.sessionDir,{recursive:!0,force:!0}),await RL(CL(this.indexPath()),{recursive:!0,mode:448}),await AL(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
|
|
1690
|
+
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Yn(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await Uh(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=Yn(this.sessionsDir,s.name),o;try{o=await Uh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=Yn(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Fh(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:nd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:Yn(n,"state.json"),wirePath:Yn(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!qh(e)||OL(e)!==n)return!1;let r=$L(this.sessionsDir,nd(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!qh(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await Fh(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Wh(e.wirePath)}catch{return null}let s=await Wh(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=rd(n.createdAt)??s.birthtime,a=rd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?J(n.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 n=[],r=!0,s,i,o,a=0,l=0,c=0,d=0,u=!1,f=0,m,p;for await(let _ of He(e)){let h=jL(_.time??_.created_at);if(r&&(r=!1,_.type==="metadata"&&_.protocol_version!==ML)){let y=_.protocol_version===DL?"Kimi experimental v2 transcript format not supported by this lmctl version.":`Kimi transcript wire protocol version ${JSON.stringify(_.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:h,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if(_.type==="config.update"&&_.modelAlias&&(s=_.modelAlias),_.type==="usage.record"){_.model&&(s=_.model),u||=_.usage!==void 0;let y=_.usage?.inputOther??0,E=_.usage?.inputCacheRead??0,S=_.usage?.inputCacheCreation??0,b=_.usage?.output??0;a+=y,l+=E,c+=S,d+=b,_.usageScope==="turn"&&(m=y+E+S,p={inputTokens:y,cachedInputTokens:E,cacheWriteInputTokens:S,outputTokens:b,totalTokens:m+b});continue}if(_.type==="turn.prompt"&&_.origin?.kind==="user"){let y=PL(_.input);y&&(i??=J(y,80),o=J(y,80),n.push({role:"user",timestamp:h,content:y}),f++);continue}if(_.type!=="context.append_loop_event"||!_.event)continue;let g=_.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:h,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:h,content:g.part.think,model:s}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:h,content:g.name??"tool",toolName:g.name,toolInput:Bh(g.args),toolInputData:jt(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:h,content:FL(g.result),toolCallId:g.toolCallId,model:s})}return UL(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:u?a:void 0,totalCachedInputTokens:u?l:void 0,totalCacheWriteInputTokens:u?c:void 0,totalOutputTokens:u?d:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function id(t){return new sd(t)}var sd,od=w(()=>{"use strict";Hh();Pt();kn();yt();sd=class extends xe{constructor(e){super({provider:new yo(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:(n,r)=>bn(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??ge,"--output-format","stream-json"),n}}});import{spawn as qL}from"node:child_process";import{mkdirSync as BL}from"node:fs";function ld(t){return new ad(t)}async function HL(t,e){let n=Date.now(),r=Xh({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});wt("lmplayer",r,e.permissionMode??"yolo");let s=await Jh(e.binary,r,{cwd:e.cwd,env:Ve(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()-n}}function Xh(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(...vn("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Jh(t,e,n){return new Promise((r,s)=>{let i;try{i=qL(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(h){s(h);return}let o="",a="",l="",c,d,u=[],f=!1,m=n.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=h=>{let g=h.trim();if(!g)return;let y;try{y=JSON.parse(g)}catch{u.push(h),n.onText?.(h);return}if(!wo(y))return;let E=Eo(y,!1);c===void 0&&E!==void 0&&(c=E),d=Eo(y,!0)??d;let S=Gh(y);S&&(u.push(S),n.onText?.(S))};i.stdout?.on("data",h=>{let g=h.toString("utf8");o+=g,l+=g;let y=l.indexOf(`
|
|
1691
1691
|
`);for(;y>=0;){let E=l.slice(0,y);l=l.slice(y+1),_(E),y=l.indexOf(`
|
|
1692
|
-
`)}}),i.stderr?.on("data",h=>{a+=h.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",h=>{f||(f=!0,p(),l.length>0&&_(l),r({code:h,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",h=>{f||(f=!0,p(),s(h))})})}function Gh(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(wo(n)){let r=Gh(n);if(r)return r}}}function Eo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(wo(n)){let r=Eo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(wo(s)){let i=Eo(s,e);if(i!==void 0)return i}}}function wo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ad,cd=w(()=>{"use strict";Zc();Pt();
|
|
1692
|
+
`)}}),i.stderr?.on("data",h=>{a+=h.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",h=>{f||(f=!0,p(),l.length>0&&_(l),r({code:h,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",h=>{f||(f=!0,p(),s(h))})})}function Gh(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(wo(n)){let r=Gh(n);if(r)return r}}}function Eo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(wo(n)){let r=Eo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(wo(s)){let i=Eo(s,e);if(i!==void 0)return i}}}function wo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ad,cd=w(()=>{"use strict";Zc();Pt();yt();xr();Et();ad=class extends xe{constructor(e){super({provider:new Or({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:HL})}seedArgsFor(e){return Xh({prompt:e?.prompt??ge,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){BL(e,{recursive:!0});let r=this.seedArgsFor(n);wt("lmplayer",r);try{let s=await Jh(this.binary,r,{cwd:e,env:Tn(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 To,readFile as XL,rm as JL}from"node:fs/promises";import{basename as Kh,join as Nn}from"node:path";function GL(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function js(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function KL(t,e){if(!e)return;t.observed=!0;let n=js(e.promptTokenCount),r=js(e.cachedContentTokenCount),s=js(e.candidatesTokenCount),i=js(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:js(e.totalTokenCount)||n+s}}function VL(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 Vh(t){return t.type==="user"||t.message?.role==="user"}function Yh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function zh(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
|
|
1693
1693
|
`):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
|
|
1694
|
-
`):"":""}function Zh(t){return t.model||t.message?.model}function YL(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:eg(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Ps(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 zL(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Ps(e.output??e.error??t)}return Ps(t)}function eg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Qh(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Ps(t.args,!0),toolInputData:jt(t.args),toolCallId:t.id,model:n}}var vo,tg=w(()=>{"use strict";tn();vo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||In(ve,".qwen")}async discoverSessions(){let e=In(this.baseDir,"projects"),n;try{n=await To(e)}catch{return[]}let r=[];for(let s of n){let i=In(e,s,"chats"),o;try{o=await To(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=In(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,d=0;for(let u of r){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)),Vh(u)){let f=zh(u).trim();f&&(l||(l=J(f,80)),c=J(f,80),d++)}if(Yh(u)){let f=Zh(u);f&&(o=f),d+=YL(u)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Kh(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,d,u=[],f=GL();for await(let m of He(e)){if(KL(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,_=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let h=eg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:Ps(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let y=g.functionResponse,E=zL(y.response),S=Ps(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:S??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(Vh(m)){let h=zh(m);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:_,content:h})}else if(Yh(m)){let h=Zh(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&u.push(Qh(g.functionCall,_,h));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:_,content:p.content,model:h});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:_,content:y})}else g.functionCall?u.push(Qh(g.functionCall,_,h)):g.text&&u.push({role:"assistant",timestamp:_,content:g.text,model:h})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...VL(f),messages:u}}async resolveSessionPath(e){let n=In(this.baseDir,"projects");try{let r=await To(n),s=[];for(let i of r){let o=In(n,i,"chats",`${e}.jsonl`);try{return await XL(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=In(n,i,"chats"),a;try{a=await To(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Kh(l,".jsonl").startsWith(e)&&s.push(In(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await JL(n),!0}catch{return!1}}}});function ud(){return new dd}var dd,fd=w(()=>{"use strict";tg();Pt();bn();gt();dd=class extends xe{constructor(){super({provider:new vo,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:uo})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as ng,readFile as rg,rm as sg,stat as ig}from"node:fs/promises";import{basename as md,join as Ft}from"node:path";import{fileURLToPath as ZL}from"node:url";async function QL(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function eO(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function og(t){return t.type==="USER_INPUT"}function ag(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function tO(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function lg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function cg(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 nO(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function rO(t){for await(let e of He(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=sO(s);if(i)return i}let r=iO(e.content);if(r)return r}return null}function sO(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function iO(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function oO(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function aO(t,e){let n=new Set;for(let r of e){let s=lO(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function lO(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:fO(n.event.content);if(r!==void 0)return dg(t.filter(i=>!e.has(i)&&mO(i)===r),n.event.step_index);let s=uO(n.event);if(s!==void 0)return dg(t.filter(i=>!e.has(i)&&cO(i.name,n.event.type)&&fg(dO(i))===s),n.event.step_index)}function dg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function cO(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 dO(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function uO(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]),fg(e)}function fg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return ZL(e)}catch{return}}function fO(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function mO(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,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function ug(t){if(t.endsWith(".db"))return md(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var So,mg=w(()=>{"use strict";tn();So=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Ft(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ft(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Ft(this.baseDir,"conversations"),n;try{n=await ng(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=md(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Ft(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Ft(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await ig(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await QL([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,d=0;if(r){let u=await Ke(r,80);for(let f of u){let m=cg(f.content);if(m&&(a=m),og(f)){let p=lg(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else ag(f)&&f.content&&d++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=ug(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,d=[],u=[];if(i)for await(let f of He(i)){let m=eO(f.created_at,s.modifiedAt),p=cg(f.content);if(p&&(a=p),og(f)){let _=lg(f.content),h=_.trim();h&&(l||(l=J(h,80)),c=J(h,80)),o.push({role:"user",timestamp:m,content:_});continue}if(Array.isArray(f.tool_calls))for(let _ of f.tool_calls){let h=_.name||"tool",g=nO(_.args),y=jt(_.args),E={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:y};o.push(E),d.push({name:h,stepIndex:f.step_index,input:y,message:E})}if(ag(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(tO(f)&&f.content){let _=oO(f,r),h=_===void 0?null:await this.readTaskLog(r,_),g={role:"tool_result",timestamp:h?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:_,...h===null?{}:{toolDetailedContent:h.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return aO(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await ig(n),n}catch{}let r=Ft(this.baseDir,"conversations");try{let s=[];for(let i of await ng(r)){if(!i.endsWith(".db"))continue;md(i,".db").startsWith(e)&&s.push(Ft(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=ug(n);return r?(await sg(this.conversationPath(r),{force:!0}),await sg(Ft(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await rO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Ft(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await rg(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Ft(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([rg(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as pO}from"node:child_process";function _d(t){return new pd(t)}async function _O(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",gO(e.timeoutMs)];e.model&&r.push("--model",e.model),Et("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await hO(e.binary,r,{cwd:e.cwd,env:Ve(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()-n}}function hO(t,e,n){return new Promise((r,s)=>{let i;try{i=pO(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function gO(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var pd,hd=w(()=>{"use strict";mg();Pt();gt();yt();xr();pd=class extends xe{constructor(e){super({provider:new So(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",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:_O})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}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 yO}from"node:crypto";import{existsSync as EO,mkdirSync as yd,readFileSync as wO,renameSync as TO,rmdirSync as Tg,statSync as vO,writeFileSync as SO}from"node:fs";import{dirname as vd,join as pg,resolve as gd}from"node:path";function bO(t){return yO("sha256").update(t).digest("hex").slice(0,8)}function kO(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function IO(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function vg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function bo(t){return Math.max(1,Math.ceil(t.length/4))}function $r(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return gd(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?pg(vd(gd(n)),".lmctl-claude-mock","sessions.json"):pg(gd(t),".lmctl-claude-mock","sessions.json")}function _g(){return{schemaVersion:1,sessions:{}}}function Fs(t){if(!EO(t))return _g();try{let e=JSON.parse(wO(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=Ed(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return _g()}}function Sg(t,e){yd(vd(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;SO(n,`${JSON.stringify(e,null,2)}
|
|
1695
|
-
`,"utf8"),TO(n,t)}function AO(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function RO(t){let e=`${t}.lock`;yd(vd(t),{recursive:!0});let n=Date.now()+hg;for(;;)try{return yd(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-vO(e).mtimeMs>NO){try{Tg(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${hg}ms: ${e}`);AO(xO)}}function LO(t){try{Tg(t)}catch{}}function bg(t,e){let n=RO(t);try{return e()}finally{LO(n)}}function OO(t){return{...t,timestamp:t.timestamp.toISOString()}}function CO(t){return{...t,timestamp:new Date(t.timestamp)}}function $O(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(OO)}}function kg(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(CO)}}function ko(t,e=process.cwd()){let n=Cr.get(t);if(n!==void 0)return n;let s=Fs($r(e)).sessions[t];if(s===void 0)return;let i=kg(s);return Cr.set(i.sessionId,i),i}function gg(t){Cr.set(t.sessionId,t);let e=$r(t.cwd);bg(e,()=>{let n=Fs(e);n.sessions[t.sessionId]=$O({...t,filePath:e}),Sg(e,n)})}function MO(t,e=process.cwd()){let n=$r(e);return bg(n,()=>{let r=Fs(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],Sg(n,r)),s})}function DO(){let t=Fs($r()),e=Object.values(t.sessions).map(kg);for(let n of e)Cr.set(n.sessionId,n);return e}function Ed(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function yg(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Ed(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=Ed(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Eg(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function jO(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=yg(n[t]??n[vg(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=yg(r[s]);if(i!==void 0)return i}}}function wg(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 Sd(){return new Td}var Cr,NO,xO,hg,wd,Td,bd=w(()=>{"use strict";Cr=new Map;NO=5e3,xO=15,hg=1e4;wd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of DO())e.set(n.sessionId,n);for(let n of Cr.values())e.set(n.sessionId,n);return[...e.values()].map(wg)}async loadSession(e){let n=ko(e);return n===void 0?null:{...wg(n),messages:n.messages.slice()}}async resolveSessionPath(e){return ko(e)?.filePath??null}async deleteSession(e){let n=Cr.delete(e),r=MO(e);return n||r}},Td=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new wd;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,n){let r=kO(IO(e,n)),s=`mock-${r}-${bO(`${e}:${r}`)}`,i=new Date,o=$r(e),a=ko(s,e),l=n?.prompt??"ClaudeMock seed",c=bo(l),d={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 d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=bo("ACK: ClaudeMock seeded"),gg(d),{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,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=ko(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Fs($r(n.cwd)),a=jO(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Eg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${vg(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=bo(e),s.totalOutputTokens+=bo(c),gg(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Eg(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ut(t){let e=[jc({claudeDir:t?.claudeDir}),Uc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Xc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Vc({copilotDir:t?.copilotDir}),ed(),id({kimiHome:t?.kimiHome}),ld({lmplayerDbPath:t?.lmplayerDbPath}),ud(),_d({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Sd()),e}var kd=w(()=>{"use strict";Pc();Wc();Jc();Yc();td();od();cd();fd();hd();bd();Pc();Wc();Jc();Yc();td();od();cd();fd();hd();bd()});var xd={};me(xd,{ProviderRegistry:()=>xs,TransportConnectionError:()=>Se,TransportError:()=>dt,TransportJsonError:()=>ro,TransportProcessError:()=>nn,TransportRpcError:()=>rn,_resetDefaultRegistryForTests:()=>PO,chat:()=>sn,countTokens:()=>Nd,createAdapterRegistry:()=>Dt,createAllAdapters:()=>Ut,listSessions:()=>Yn,seed:()=>Id});function No(){return Io===null&&(Io=Dt(Ut())),Io}function PO(){Io=null}function Ng(t,e){let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function sn(t){let e=t.registry??No(),n=Ng(e,t.provider),r={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 n.sendTurn(t.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Id(t){let e=t.registry??No(),n=Ng(e,t.provider),r=await Ig(e,t.provider,t.cwd),s=await n.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=FO(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Ig(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function FO(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Yn(t={}){return(t.registry??No()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Nd(t){let n=await(t.registry??No()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var Io,ut=w(()=>{"use strict";fc();kd();fc();kd();Nr();Io=null});function UO(){return Ad===null&&(Ad=Dt(Ut())),Ad}async function xo(t){let{dal:e,team_member_id:n}=t,r=e!==void 0&&n!==void 0;r&&e.setMemberState(n,"in_chat");let s=!1,i;try{return await qO(t)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Mr.delete(n),e.setMemberState(n,"idle");else{let o=WO(i,n);e.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function WO(t,e){if(!(t instanceof Ae))return Mr.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 n=(Mr.get(e)??0)+1;return n>=3?(Mr.delete(e),"consecutive_timeouts"):(Mr.set(e,n),null)}return Mr.delete(e),null}async function qO(t){let e=t.timeoutMs,n=typeof e=="number"&&e>0,r=UO(),s;try{let d=await r.resolveSession(t.sessionid);if(!d)return Promise.reject(new Ae("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Rd(t.sessionid,t.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Ae("other",null,`library: session resolution failed: ${xg(d)}`,Rd(t.sessionid,t.sessiondir,"unresolved")))}let i=Rd(t.sessionid,t.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await sn({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:t.onProgress,permissionMode:t.permissionMode});if(d.status==="stalled")throw new Ae("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Ae("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):BO(d,i)}finally{a!==null&&clearTimeout(a)}}function Rd(t,e,n){return["<library>","chat",t,e,"--provider",n]}function xg(t){return t instanceof Error?t.message:String(t)}function BO(t,e){if(t instanceof Ae)return t;if(t instanceof Se){let n=t.cause;return n?.code==="ENOENT_CWD"?new Ae("sessiondir_missing",null,t.message,e):n?.code==="ENOENT"?new Ae("enoent",null,t.message,e):new Ae("other",null,t.message,e)}return t instanceof nn?new Ae("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof rn?new Ae("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof dt?new Ae("other",null,t.message,e):new Ae("other",null,xg(t),e)}var Ae,Ad,Mr,Ao=w(()=>{"use strict";ut();Ae=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},Ad=null;Mr=new Map});function Ag(){return Ld===null&&(Ld=Dt(Ut())),Ld}function XO(t,e){if(!HO.test(t))return t;let n=e.getConfig(`workspace.${t}`);if(n===null||n.length===0)throw new Oe("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return n}async function Ro(t){let e=XO(t.member.provider,t.dal),n=e===t.member.provider?t.member:{...t.member,provider:e},r=await JO({member:n});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:r.sessionid,provider_resolved:e}}async function JO(t){let e=t.member.provider,n=t.member.sessiondir,r=Od("seed",n,e);try{let s=await Id({provider:e,cwd:n,registry:Ag()});if(!s.success)throw KO(s.error,r);if(!s.sessionId)throw new Oe("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Oe?s:Cd(s,r)}}async function Rg(t){return GO(t)}async function GO(t){let e=Ag(),n=Od("tokens",t.sessionid,"unresolved"),r;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Oe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Oe?i:Cd(i,n)}let s=Od("tokens",t.sessionid,r);try{let i=await Nd({sessionId:t.sessionid,provider:r,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 Oe?i:Cd(i,s)}}function Od(t,e,n){return["<library>",t,e,"--provider",n]}function KO(t,e){let n=t??"";if(/\bENOENT\b/i.test(n))return new Oe("enoent",null,n,e);if(/timed?\s*out/i.test(n))return new Oe("timeout",null,n,e);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Oe("nonzero_exit",Number(r[1]),n,e)}return new Oe("other",null,n,e)}function Cd(t,e){return t instanceof Oe?t:t instanceof Se?t.cause?.code==="ENOENT"?new Oe("enoent",null,t.message,e):new Oe("other",null,t.message,e):t instanceof nn?new Oe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof rn?new Oe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof dt?new Oe("other",null,t.message,e):new Oe("other",null,t instanceof Error?t.message:String(t),e)}var Oe,Ld,HO,$d=w(()=>{"use strict";ut();Oe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},Ld=null;HO=/^provider[123]$/});function Lo(t){return Buffer.from(t,"utf8").toString("base64url")}function Ws(t){return Buffer.from(t,"base64url").toString("utf8")}async function Lg(t,e=n=>Rg({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of VO(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}),n+=1}catch(o){r+=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:n,failed:r}}async function Og(t,e,n){let r=Cg(t,e,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Us(n,r.member.state);t.setMemberState(r.member.id,"in_chat","compacting");try{return await xo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),t.setMemberState(r.member.id,"idle",null),{ok:!0,row:$g(t,e,n)}}catch(s){throw t.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function Md(t,e,n){let r=Cg(t,e,n);if(r===null)throw new Error("session member not found");let s=await Ro({member:r.member,dal:t});return t.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:$g(t,e,n)}}function VO(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(n=>n.sessionid!==null).map(n=>({team_name:e.name,member:n})))}function Cg(t,e,n){let r=t.findTeamByName(e);if(r===null)return null;let s=t.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function $g(t,e,n){return t.sessionSizeHistory(e,n,1)[0]??null}var Us,Oo=w(()=>{"use strict";Ao();$d();Us=class extends Error{constructor(e,n){super(`member ${e} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Dd(t){let e=t.dal,n=t.nowMs??Date.now(),r=t.thresholdMs??zO(e),s=n-r,i=e.query(`
|
|
1694
|
+
`):"":""}function Zh(t){return t.model||t.message?.model}function YL(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:eg(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Ps(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 zL(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Ps(e.output??e.error??t)}return Ps(t)}function eg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Qh(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Ps(t.args,!0),toolInputData:jt(t.args),toolCallId:t.id,model:n}}var vo,tg=w(()=>{"use strict";tn();vo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Nn(ve,".qwen")}async discoverSessions(){let e=Nn(this.baseDir,"projects"),n;try{n=await To(e)}catch{return[]}let r=[];for(let s of n){let i=Nn(e,s,"chats"),o;try{o=await To(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Nn(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,d=0;for(let u of r){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)),Vh(u)){let f=zh(u).trim();f&&(l||(l=J(f,80)),c=J(f,80),d++)}if(Yh(u)){let f=Zh(u);f&&(o=f),d+=YL(u)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Kh(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,d,u=[],f=GL();for await(let m of He(e)){if(KL(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,_=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let h=eg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:Ps(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let y=g.functionResponse,E=zL(y.response),S=Ps(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:S??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(Vh(m)){let h=zh(m);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:_,content:h})}else if(Yh(m)){let h=Zh(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&u.push(Qh(g.functionCall,_,h));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:_,content:p.content,model:h});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:_,content:y})}else g.functionCall?u.push(Qh(g.functionCall,_,h)):g.text&&u.push({role:"assistant",timestamp:_,content:g.text,model:h})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...VL(f),messages:u}}async resolveSessionPath(e){let n=Nn(this.baseDir,"projects");try{let r=await To(n),s=[];for(let i of r){let o=Nn(n,i,"chats",`${e}.jsonl`);try{return await XL(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Nn(n,i,"chats"),a;try{a=await To(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Kh(l,".jsonl").startsWith(e)&&s.push(Nn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await JL(n),!0}catch{return!1}}}});function ud(){return new dd}var dd,fd=w(()=>{"use strict";tg();Pt();kn();yt();dd=class extends xe{constructor(){super({provider:new vo,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:uo})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as ng,readFile as rg,rm as sg,stat as ig}from"node:fs/promises";import{basename as md,join as Ft}from"node:path";import{fileURLToPath as ZL}from"node:url";async function QL(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function eO(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function og(t){return t.type==="USER_INPUT"}function ag(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function tO(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function lg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function cg(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 nO(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function rO(t){for await(let e of He(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=sO(s);if(i)return i}let r=iO(e.content);if(r)return r}return null}function sO(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function iO(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function oO(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function aO(t,e){let n=new Set;for(let r of e){let s=lO(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function lO(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:fO(n.event.content);if(r!==void 0)return dg(t.filter(i=>!e.has(i)&&mO(i)===r),n.event.step_index);let s=uO(n.event);if(s!==void 0)return dg(t.filter(i=>!e.has(i)&&cO(i.name,n.event.type)&&fg(dO(i))===s),n.event.step_index)}function dg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function cO(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 dO(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function uO(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]),fg(e)}function fg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return ZL(e)}catch{return}}function fO(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function mO(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,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function ug(t){if(t.endsWith(".db"))return md(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var So,mg=w(()=>{"use strict";tn();So=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Ft(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ft(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Ft(this.baseDir,"conversations"),n;try{n=await ng(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=md(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Ft(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Ft(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await ig(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await QL([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,d=0;if(r){let u=await Ke(r,80);for(let f of u){let m=cg(f.content);if(m&&(a=m),og(f)){let p=lg(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else ag(f)&&f.content&&d++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=ug(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,d=[],u=[];if(i)for await(let f of He(i)){let m=eO(f.created_at,s.modifiedAt),p=cg(f.content);if(p&&(a=p),og(f)){let _=lg(f.content),h=_.trim();h&&(l||(l=J(h,80)),c=J(h,80)),o.push({role:"user",timestamp:m,content:_});continue}if(Array.isArray(f.tool_calls))for(let _ of f.tool_calls){let h=_.name||"tool",g=nO(_.args),y=jt(_.args),E={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:y};o.push(E),d.push({name:h,stepIndex:f.step_index,input:y,message:E})}if(ag(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(tO(f)&&f.content){let _=oO(f,r),h=_===void 0?null:await this.readTaskLog(r,_),g={role:"tool_result",timestamp:h?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:_,...h===null?{}:{toolDetailedContent:h.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return aO(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await ig(n),n}catch{}let r=Ft(this.baseDir,"conversations");try{let s=[];for(let i of await ng(r)){if(!i.endsWith(".db"))continue;md(i,".db").startsWith(e)&&s.push(Ft(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=ug(n);return r?(await sg(this.conversationPath(r),{force:!0}),await sg(Ft(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await rO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Ft(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await rg(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Ft(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([rg(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as pO}from"node:child_process";function _d(t){return new pd(t)}async function _O(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",gO(e.timeoutMs)];e.model&&r.push("--model",e.model),wt("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await hO(e.binary,r,{cwd:e.cwd,env:Ve(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()-n}}function hO(t,e,n){return new Promise((r,s)=>{let i;try{i=pO(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function gO(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var pd,hd=w(()=>{"use strict";mg();Pt();yt();Et();xr();pd=class extends xe{constructor(e){super({provider:new So(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",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:_O})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}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 yO}from"node:crypto";import{existsSync as EO,mkdirSync as yd,readFileSync as wO,renameSync as TO,rmdirSync as Tg,statSync as vO,writeFileSync as SO}from"node:fs";import{dirname as vd,join as pg,resolve as gd}from"node:path";function bO(t){return yO("sha256").update(t).digest("hex").slice(0,8)}function kO(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function IO(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function vg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function bo(t){return Math.max(1,Math.ceil(t.length/4))}function $r(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return gd(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?pg(vd(gd(n)),".lmctl-claude-mock","sessions.json"):pg(gd(t),".lmctl-claude-mock","sessions.json")}function _g(){return{schemaVersion:1,sessions:{}}}function Fs(t){if(!EO(t))return _g();try{let e=JSON.parse(wO(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=Ed(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return _g()}}function Sg(t,e){yd(vd(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;SO(n,`${JSON.stringify(e,null,2)}
|
|
1695
|
+
`,"utf8"),TO(n,t)}function AO(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function RO(t){let e=`${t}.lock`;yd(vd(t),{recursive:!0});let n=Date.now()+hg;for(;;)try{return yd(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-vO(e).mtimeMs>NO){try{Tg(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${hg}ms: ${e}`);AO(xO)}}function LO(t){try{Tg(t)}catch{}}function bg(t,e){let n=RO(t);try{return e()}finally{LO(n)}}function OO(t){return{...t,timestamp:t.timestamp.toISOString()}}function CO(t){return{...t,timestamp:new Date(t.timestamp)}}function $O(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(OO)}}function kg(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(CO)}}function ko(t,e=process.cwd()){let n=Cr.get(t);if(n!==void 0)return n;let s=Fs($r(e)).sessions[t];if(s===void 0)return;let i=kg(s);return Cr.set(i.sessionId,i),i}function gg(t){Cr.set(t.sessionId,t);let e=$r(t.cwd);bg(e,()=>{let n=Fs(e);n.sessions[t.sessionId]=$O({...t,filePath:e}),Sg(e,n)})}function MO(t,e=process.cwd()){let n=$r(e);return bg(n,()=>{let r=Fs(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],Sg(n,r)),s})}function DO(){let t=Fs($r()),e=Object.values(t.sessions).map(kg);for(let n of e)Cr.set(n.sessionId,n);return e}function Ed(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function yg(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Ed(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=Ed(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Eg(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function jO(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=yg(n[t]??n[vg(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=yg(r[s]);if(i!==void 0)return i}}}function wg(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 Sd(){return new Td}var Cr,NO,xO,hg,wd,Td,bd=w(()=>{"use strict";Cr=new Map;NO=5e3,xO=15,hg=1e4;wd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of DO())e.set(n.sessionId,n);for(let n of Cr.values())e.set(n.sessionId,n);return[...e.values()].map(wg)}async loadSession(e){let n=ko(e);return n===void 0?null:{...wg(n),messages:n.messages.slice()}}async resolveSessionPath(e){return ko(e)?.filePath??null}async deleteSession(e){let n=Cr.delete(e),r=MO(e);return n||r}},Td=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new wd;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,n){let r=kO(IO(e,n)),s=`mock-${r}-${bO(`${e}:${r}`)}`,i=new Date,o=$r(e),a=ko(s,e),l=n?.prompt??"ClaudeMock seed",c=bo(l),d={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 d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=bo("ACK: ClaudeMock seeded"),gg(d),{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,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=ko(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Fs($r(n.cwd)),a=jO(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Eg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${vg(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=bo(e),s.totalOutputTokens+=bo(c),gg(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Eg(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ut(t){let e=[jc({claudeDir:t?.claudeDir}),Uc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Xc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Vc({copilotDir:t?.copilotDir}),ed(),id({kimiHome:t?.kimiHome}),ld({lmplayerDbPath:t?.lmplayerDbPath}),ud(),_d({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Sd()),e}var kd=w(()=>{"use strict";Pc();Wc();Jc();Yc();td();od();cd();fd();hd();bd();Pc();Wc();Jc();Yc();td();od();cd();fd();hd();bd()});var xd={};me(xd,{ProviderRegistry:()=>xs,TransportConnectionError:()=>Se,TransportError:()=>dt,TransportJsonError:()=>ro,TransportProcessError:()=>nn,TransportRpcError:()=>rn,_resetDefaultRegistryForTests:()=>PO,chat:()=>sn,countTokens:()=>Nd,createAdapterRegistry:()=>Dt,createAllAdapters:()=>Ut,listSessions:()=>zn,seed:()=>Id});function No(){return Io===null&&(Io=Dt(Ut())),Io}function PO(){Io=null}function Ng(t,e){let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function sn(t){let e=t.registry??No(),n=Ng(e,t.provider),r={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 n.sendTurn(t.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Id(t){let e=t.registry??No(),n=Ng(e,t.provider),r=await Ig(e,t.provider,t.cwd),s=await n.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=FO(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Ig(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function FO(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function zn(t={}){return(t.registry??No()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Nd(t){let n=await(t.registry??No()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var Io,ut=w(()=>{"use strict";fc();kd();fc();kd();Nr();Io=null});function UO(){return Ad===null&&(Ad=Dt(Ut())),Ad}async function xo(t){let{dal:e,team_member_id:n}=t,r=e!==void 0&&n!==void 0;r&&e.setMemberState(n,"in_chat");let s=!1,i;try{return await qO(t)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Mr.delete(n),e.setMemberState(n,"idle");else{let o=WO(i,n);e.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function WO(t,e){if(!(t instanceof Ae))return Mr.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 n=(Mr.get(e)??0)+1;return n>=3?(Mr.delete(e),"consecutive_timeouts"):(Mr.set(e,n),null)}return Mr.delete(e),null}async function qO(t){let e=t.timeoutMs,n=typeof e=="number"&&e>0,r=UO(),s;try{let d=await r.resolveSession(t.sessionid);if(!d)return Promise.reject(new Ae("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Rd(t.sessionid,t.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Ae("other",null,`library: session resolution failed: ${xg(d)}`,Rd(t.sessionid,t.sessiondir,"unresolved")))}let i=Rd(t.sessionid,t.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await sn({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:t.onProgress,permissionMode:t.permissionMode});if(d.status==="stalled")throw new Ae("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Ae("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):BO(d,i)}finally{a!==null&&clearTimeout(a)}}function Rd(t,e,n){return["<library>","chat",t,e,"--provider",n]}function xg(t){return t instanceof Error?t.message:String(t)}function BO(t,e){if(t instanceof Ae)return t;if(t instanceof Se){let n=t.cause;return n?.code==="ENOENT_CWD"?new Ae("sessiondir_missing",null,t.message,e):n?.code==="ENOENT"?new Ae("enoent",null,t.message,e):new Ae("other",null,t.message,e)}return t instanceof nn?new Ae("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof rn?new Ae("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof dt?new Ae("other",null,t.message,e):new Ae("other",null,xg(t),e)}var Ae,Ad,Mr,Ao=w(()=>{"use strict";ut();Ae=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},Ad=null;Mr=new Map});function Ag(){return Ld===null&&(Ld=Dt(Ut())),Ld}function XO(t,e){if(!HO.test(t))return t;let n=e.getConfig(`workspace.${t}`);if(n===null||n.length===0)throw new Oe("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return n}async function Ro(t){let e=XO(t.member.provider,t.dal),n=e===t.member.provider?t.member:{...t.member,provider:e},r=await JO({member:n});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:r.sessionid,provider_resolved:e}}async function JO(t){let e=t.member.provider,n=t.member.sessiondir,r=Od("seed",n,e);try{let s=await Id({provider:e,cwd:n,registry:Ag()});if(!s.success)throw KO(s.error,r);if(!s.sessionId)throw new Oe("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Oe?s:Cd(s,r)}}async function Rg(t){return GO(t)}async function GO(t){let e=Ag(),n=Od("tokens",t.sessionid,"unresolved"),r;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Oe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Oe?i:Cd(i,n)}let s=Od("tokens",t.sessionid,r);try{let i=await Nd({sessionId:t.sessionid,provider:r,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 Oe?i:Cd(i,s)}}function Od(t,e,n){return["<library>",t,e,"--provider",n]}function KO(t,e){let n=t??"";if(/\bENOENT\b/i.test(n))return new Oe("enoent",null,n,e);if(/timed?\s*out/i.test(n))return new Oe("timeout",null,n,e);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Oe("nonzero_exit",Number(r[1]),n,e)}return new Oe("other",null,n,e)}function Cd(t,e){return t instanceof Oe?t:t instanceof Se?t.cause?.code==="ENOENT"?new Oe("enoent",null,t.message,e):new Oe("other",null,t.message,e):t instanceof nn?new Oe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof rn?new Oe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof dt?new Oe("other",null,t.message,e):new Oe("other",null,t instanceof Error?t.message:String(t),e)}var Oe,Ld,HO,$d=w(()=>{"use strict";ut();Oe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},Ld=null;HO=/^provider[123]$/});function Lo(t){return Buffer.from(t,"utf8").toString("base64url")}function Ws(t){return Buffer.from(t,"base64url").toString("utf8")}async function Lg(t,e=n=>Rg({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of VO(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}),n+=1}catch(o){r+=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:n,failed:r}}async function Og(t,e,n){let r=Cg(t,e,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Us(n,r.member.state);t.setMemberState(r.member.id,"in_chat","compacting");try{return await xo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),t.setMemberState(r.member.id,"idle",null),{ok:!0,row:$g(t,e,n)}}catch(s){throw t.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function Md(t,e,n){let r=Cg(t,e,n);if(r===null)throw new Error("session member not found");let s=await Ro({member:r.member,dal:t});return t.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:$g(t,e,n)}}function VO(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(n=>n.sessionid!==null).map(n=>({team_name:e.name,member:n})))}function Cg(t,e,n){let r=t.findTeamByName(e);if(r===null)return null;let s=t.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function $g(t,e,n){return t.sessionSizeHistory(e,n,1)[0]??null}var Us,Oo=w(()=>{"use strict";Ao();$d();Us=class extends Error{constructor(e,n){super(`member ${e} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Dd(t){let e=t.dal,n=t.nowMs??Date.now(),r=t.thresholdMs??zO(e),s=n-r,i=e.query(`
|
|
1696
1696
|
SELECT
|
|
1697
1697
|
isess.id AS interactive_session_id,
|
|
1698
1698
|
isess.run_id,
|
|
@@ -1721,7 +1721,7 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1721
1721
|
`),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=eC(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=ZO(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Qe(c),last_activity_at:a.last_activity_at,elapsed_ms:n-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,QO(e,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function zO(t){return Mg(t.getConfig(Co),YO)*1e3}function jd(t,e){return Mg(t.getConfig($o),e)}function Mg(t,e){if(t===null||t.trim().length===0)return e;let n=Number(t);return Number.isFinite(n)&&n>0?Math.floor(n):e}function ZO(t,e,n){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,n)[0]??null}function QO(t,e,n,r){return t.query(`SELECT * FROM attention
|
|
1722
1722
|
WHERE kind = 'session_hung'
|
|
1723
1723
|
AND run_id = ?
|
|
1724
|
-
AND acknowledged_at IS NULL`,e).some(i=>{let o=Dg(i.payload);return o!==null&&o.step_id===n&&o.session_id===r})}function eC(t,e,n){let r=Dg(t);return r===null?null:tC(r,e,n)??nC(r,e,n)}function tC(t,e,n){if(!Array.isArray(t.steps))return null;let r=t.steps.filter(rC),s=r.find(a=>a.id===e)??r.find(a=>a.name===e)??r.find(a=>a.name===n);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=
|
|
1724
|
+
AND acknowledged_at IS NULL`,e).some(i=>{let o=Dg(i.payload);return o!==null&&o.step_id===n&&o.session_id===r})}function eC(t,e,n){let r=Dg(t);return r===null?null:tC(r,e,n)??nC(r,e,n)}function tC(t,e,n){if(!Array.isArray(t.steps))return null;let r=t.steps.filter(rC),s=r.find(a=>a.id===e)??r.find(a=>a.name===e)??r.find(a=>a.name===n);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Zn(s.members)?s.members:null,o=i!==null&&Zn(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function nC(t,e,n){if(!Zn(t.states))return null;let r=t.states[e]??t.states[n];if(!Zn(r))return null;let s=r;if(!Zn(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function rC(t){return Zn(t)}function Dg(t){if(t===null)return null;try{let e=JSON.parse(t);return Zn(e)?e:null}catch{return null}}function Zn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Co,$o,YO,Pd=w(()=>{"use strict";ct();Co="monitor.session_hung.elapsed_threshold_seconds",$o="monitor.session_hung.check_interval_ms",YO=600});function Do(t){let e=t.query(`
|
|
1725
1725
|
SELECT status, COUNT(*) AS count FROM job GROUP BY status
|
|
1726
1726
|
`),n={queued:Mo(e,"queued"),running:Mo(e,"running"),done:Mo(e,"done"),failed:Mo(e,"failed"),total:Ud(e)},r=t.query(`
|
|
1727
1727
|
SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
|
|
@@ -1736,7 +1736,7 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1736
1736
|
GROUP BY name
|
|
1737
1737
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1738
1738
|
ORDER BY w.name ASC
|
|
1739
|
-
`)}function Ug(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 n=t.findSubmittedPrByUrl(e.pr_url);return n===null?[]:[n]}return t.listSubmittedPrs({status:e.status})}function qg(t,e){return t.getSubmittedPr(e)}function Fo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Dr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function
|
|
1739
|
+
`)}function Ug(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 n=t.findSubmittedPrByUrl(e.pr_url);return n===null?[]:[n]}return t.listSubmittedPrs({status:e.status})}function qg(t,e){return t.getSubmittedPr(e)}function Fo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Dr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Qn(t,e){let n=t.query("SELECT * FROM run WHERE id = ?",e)[0];return n===void 0?null:{...n,job:Fo(t,n.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",n.workflow_id)[0]??null,team:t.getTeam(n.team_id),steps:sC(t,n.id)}}function sC(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(n=>({...n,artifacts:Bg(t,n.id)}))}function Wd(t,e,n){let r=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,n)[0];return r===void 0?null:{...r,artifacts:Bg(t,r.id)}}function Bg(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function er(t,e,n){let r=n===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 n===void 0?t.query(r,e):t.query(r,e,n)}function Hg(t,e,n){let r=Wd(t,e,n);return r===null?null:(r.artifacts.find(i=>i.kind===`${r.state_name}_transcript`)??r.artifacts.find(i=>i.content!==null))?.content??null}function Xg(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 Jg(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 An(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 Uo(t,e={}){let n=[],r="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(r+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(r+=" AND p.name = ?",n.push(e.project)),e.since!==void 0&&(r+=" AND a.created_at >= ?",n.push(e.since)),t.query(`${Gg}
|
|
1740
1740
|
WHERE ${r}
|
|
1741
1741
|
ORDER BY a.created_at DESC`,...n).map(Kg)}function Wt(t,e){let r=t.query(`${Gg}
|
|
1742
1742
|
WHERE a.id = ?`,e)[0];return r===void 0?null:Kg(r)}function Kg(t){let{payload_json:e,...n}=t,r={...n,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 r;let s;try{s=JSON.parse(e)}catch{return r}if(s===null||typeof s!="object")return r;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(r.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;r.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(r.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(r.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(r.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?r.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(r.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&&(r.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"&&(r.escalation_tier=i.tier),typeof i.token=="string"&&(r.escalation_token=i.token),typeof i.reason=="string"&&(r.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(r.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(r.agent_output=i.agent_output),r}function Vg(t){return t.query(`
|
|
@@ -1824,7 +1824,7 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1824
1824
|
AND acknowledged_at IS NULL
|
|
1825
1825
|
ORDER BY id ASC`,e).map(b=>({kind:b.kind,severity:b.severity,payload:_C(b.payload)})),S=g.map(b=>{let k=f.get(b),P=p.get(b),U=cC(s,b,y,k,P),j=k===void 0?null:Date.parse(k.started_at),A=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),R=k===void 0||Number.isNaN(j??NaN)?null:A!==null&&!Number.isNaN(A)?A-j:U==="running"||U==="paused"?r-j:null,re=k===void 0?null:_.get(k.id)??null,X=hC(P?.last_activity_at??null,re,h),N=i===null||P===void 0?void 0:fC(t,s.team_id,i.definition,P.state_name,k?.state_name??b);return{step_id:k?.id??null,state_id:b,status:U,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:X,elapsed_ms:R,...N!==void 0?{member:N}:{},...P!==void 0?{interactive_session:{id:P.id,status:P.status,turn_count:P.turn_count,state_name:P.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:uC(s,a,S),submitted_at:a?.enqueued_at??s.started_at,nodes:S,current_node_index:dC(S,s.terminal_state!==null),related_attentions:E}}function Bo(t,e={}){let n=e.nowMs??Date.now(),r=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";r.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${Pg(Date.parse(t.submitted_at),n)} ago)`;r.push(`project: ${t.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${jg(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":jg(t.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Ho(a.elapsed_ms)}`;if(r.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${Pg(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${u}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of t.related_attentions)r.push(`- ${a.kind}${gC(a.payload)}`)}return`${r.join(`
|
|
1826
1826
|
`)}
|
|
1827
|
-
`}function aC(t,e,n){let r=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=n(s.state_name);r.includes(i)||r.push(i)}return r}function lC(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function cC(t,e,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&n===e?"paused":"running":r.outcome===null?"failed":"done"}function dC(t,e){if(t.length===0)return null;let n=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let r=t.findIndex(s=>s.status==="pending");return r>=0?r:t.length-1}function uC(t,e,n){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function fC(t,e,n,r,s){let i=mC(n,r,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 mC(t,e,n){let r=pC(t);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>
|
|
1827
|
+
`}function aC(t,e,n){let r=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=n(s.state_name);r.includes(i)||r.push(i)}return r}function lC(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function cC(t,e,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&n===e?"paused":"running":r.outcome===null?"failed":"done"}function dC(t,e){if(t.length===0)return null;let n=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let r=t.findIndex(s=>s.status==="pending");return r>=0?r:t.length-1}function uC(t,e,n){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function fC(t,e,n,r,s){let i=mC(n,r,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 mC(t,e,n){let r=pC(t);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>xn(a)?a.id===e||a.name===e||a.name===n:!1),i=xn(s?.members)?s.members:null,o=i!==null&&xn(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(xn(r.states)){let s=r.states[e]??r.states[n];if(!xn(s))return null;let i=xn(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function pC(t){try{let e=JSON.parse(t);return xn(e)?e:null}catch{return null}}function _C(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function xn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hC(...t){let e=t.filter(n=>n!==null&&Number.isFinite(n));return e.length===0?null:Math.max(...e)}function jg(t,e){let n=Date.parse(t),r=Date.parse(e);return Number.isNaN(n)||Number.isNaN(r)?"[+? ]":`[+${Ho(Math.max(0,r-n)).padEnd(6)}]`}function Pg(t,e){return Number.isNaN(t)?"?":Ho(Math.max(0,e-t))}function Ho(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60),r=e%60;if(n<60)return r===0?`${n}m`:`${n}m${r}s`;let s=Math.floor(n/60),i=n%60;return i===0?`${s}h`:`${s}h${i}m`}function gC(t){if(!xn(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",n=typeof t.member_alias=="string"?t.member_alias:null,r=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Ho(t.elapsed_ms)} elapsed`:"",i=n===null?"":` (${n}${r===null?"":` ${r}`}${s})`;return`${e}${i}`}var Gg,on=w(()=>{"use strict";ct();Gg=`SELECT a.id AS attention_id,
|
|
1828
1828
|
a.kind AS kind,
|
|
1829
1829
|
a.severity AS severity,
|
|
1830
1830
|
a.created_at AS created_at,
|
|
@@ -1851,17 +1851,17 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1851
1851
|
`),2):b$(n.rest.slice(2),e);if(n.rest[0]==="run"&&n.rest[1]==="where"&&Go(n.rest.slice(2)))return e.stdout.write(`${xC}
|
|
1852
1852
|
`),0;if(n.rest[0]==="run"&&n.rest[1]==="timeline"&&Go(n.rest.slice(2)))return e.stdout.write(`${AC}
|
|
1853
1853
|
`),0;if(n.rest[0]==="run"&&n.rest[1]==="where")return n.present?w$(n.rest.slice(2),e):T$(n.rest.slice(2),e);if(n.rest[0]==="run"&&n.rest[1]==="timeline")return n.present?v$(n.rest.slice(2),e):S$(n.rest.slice(2),e);if(n.present)return i$(n.rest,e);let r=ty(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1854
|
-
`),2;let s=
|
|
1854
|
+
`),2;let s=tr(e),i=s.baseUrl,o=Rn(r.accept,s.token),a=r.body;if(r.upload!==void 0)try{a=PC(r.upload.filePath,r.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1855
1855
|
`),2}else r.body!==void 0&&r.contentType!==void 0?o["Content-Type"]=r.contentType:r.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(r.path,i),{method:r.method,headers:o,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1856
1856
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1857
1857
|
`),l.status===400?2:1;if(r.runAfterSubmit){let c=await l.json(),d=UC(c);if(d===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
|
|
1858
|
-
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${d}/run`,i),{method:"POST",headers:
|
|
1858
|
+
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${d}/run`,i),{method:"POST",headers:Rn("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
|
|
1859
1859
|
`),2}if(!u.ok)return e.stderr.write(`error: HTTP ${u.status}: ${await u.text()}
|
|
1860
1860
|
`),u.status===400?2:1;let f=await u.json();r.json?e.stdout.write(`${JSON.stringify(f,null,2)}
|
|
1861
1861
|
`):e.stdout.write(`${JSON.stringify(f)}
|
|
1862
1862
|
`)}else r.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1863
1863
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1864
|
-
`));return 0}function ty(t){let e=sy(t);if(typeof e=="string")return e;let n=e.args,r=e.format!=="text",[s,...i]=n;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Jo(i,"/api/status",r):s==="projects"?Jo(i,"/api/projects",r):s==="teams"?Jo(i,"/api/teams",r):s==="workflows"?i[0]==="verify"?KC(i.slice(1),e.format):Jo(i,"/api/workflows",r):s==="workflow"?GC(i,r):s==="upload"?XC(i,r):s==="submit-job"?JC(i,r):s==="issues"?HC(i,r):s==="jobs"?qs(i,"--status","/api/jobs","status",r):s==="job"?BC(i,r):s==="project"?VC(i,r):s==="artifact"?ZC(i,r):s==="runs"?qs(i,"--limit","/api/runs","limit",r,!0):s==="external-objects"?qs(i,"--type","/api/external-objects","type",r):s==="external-signals"?Zg(i,"--unhandled","/api/external-signals","unhandled",r):s==="attentions"||s==="attention"?i[0]==="ack"?QC(i,r):Zg(i,"--unacked","/api/attentions","unacked",r):s==="stats"?e$(i,r):s==="daemon"?t$(i,r):s==="intake"?n$(i,r):s==="session"?r$(i,r):s==="run"?s$(i,e.format):s==="prs"?qs(i,"--status","/api/submitted-prs","status",r):s==="pr"?WC(i,r):`unknown subcommand: ${s}`}function
|
|
1864
|
+
`));return 0}function ty(t){let e=sy(t);if(typeof e=="string")return e;let n=e.args,r=e.format!=="text",[s,...i]=n;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Jo(i,"/api/status",r):s==="projects"?Jo(i,"/api/projects",r):s==="teams"?Jo(i,"/api/teams",r):s==="workflows"?i[0]==="verify"?KC(i.slice(1),e.format):Jo(i,"/api/workflows",r):s==="workflow"?GC(i,r):s==="upload"?XC(i,r):s==="submit-job"?JC(i,r):s==="issues"?HC(i,r):s==="jobs"?qs(i,"--status","/api/jobs","status",r):s==="job"?BC(i,r):s==="project"?VC(i,r):s==="artifact"?ZC(i,r):s==="runs"?qs(i,"--limit","/api/runs","limit",r,!0):s==="external-objects"?qs(i,"--type","/api/external-objects","type",r):s==="external-signals"?Zg(i,"--unhandled","/api/external-signals","unhandled",r):s==="attentions"||s==="attention"?i[0]==="ack"?QC(i,r):Zg(i,"--unacked","/api/attentions","unacked",r):s==="stats"?e$(i,r):s==="daemon"?t$(i,r):s==="intake"?n$(i,r):s==="session"?r$(i,r):s==="run"?s$(i,e.format):s==="prs"?qs(i,"--status","/api/submitted-prs","status",r):s==="pr"?WC(i,r):`unknown subcommand: ${s}`}function Rn(t,e){let n={Accept:t};return e!==null&&e.length>0&&(n.Authorization=`Bearer ${e}`),n}function tr(t){if(t.dal!==void 0)return Bs(t.dal,process.env,t);let e=Be({path:z()});try{return Bs(e,process.env,t)}finally{e.close()}}function Bs(t,e,n){let r=[],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,r.push("api.url")):i=TC;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?r.push("api.token"):o!==a&&n.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
|
|
1865
1865
|
`)):o!==null?a=o:a=null;for(let l of r)n.stderr.write(`note: ${bC(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1866
1866
|
`);return{baseUrl:i,token:a}}function bC(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 kC(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1867
1867
|
`),2;let s=e.dal===void 0,i=e.dal??Be({path:z()});try{if(n==="get"){if(r.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
@@ -1880,7 +1880,7 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1880
1880
|
`),0;let r=dy(t,"--direct"),s=n||r.present,i=r.rest,[o,...a]=i;return o===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
|
|
1881
1881
|
`),2):s?LC(o,a,e):o==="list"?CC(a,e):o==="show"?MC(a,e):o==="respond"?DC(a,e):(e.stderr.write(`error: unknown api escalations verb: ${o}
|
|
1882
1882
|
`),2)}function Go(t){return t.some(e=>e==="--help"||e==="-h")}function LC(t,e,n){let r=n.dal===void 0,s=n.dal??Be({path:z()});try{return uy(s,[t,...e],n)}finally{r&&s.close()}}function ny(t){let e,n=!1,r=!1,s;for(let o=0;o<t.length;o+=1){let a=t[o];if(a==="--json"){n=!0;continue}if(a==="--all"){r=!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 c=OC(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ae(a)}let i={json:n,all:r};return e!==void 0&&(i.project=e),s!==void 0&&(i.since=s),i}function OC(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],i=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let n=Date.parse(t);return Number.isNaN(n)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(n).toISOString()}}async function CC(t,e){let n=ny(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1883
|
-
`),2;let r=
|
|
1883
|
+
`),2;let r=tr(e),s=Rn("application/json",r.token),i=new URLSearchParams;n.project!==void 0&&i.set("project",n.project),n.all&&i.set("all","true"),n.since!==void 0&&i.set("since",n.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,r.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1884
1884
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1885
1885
|
`),a.status===400?2:1;let l=await a.json();return ry(l,n.json,e)}function ry(t,e,n){if(e)return n.stdout.write(`${JSON.stringify(t,null,2)}
|
|
1886
1886
|
`),0;if(t.length===0)return n.stdout.write(`No pending escalations.
|
|
@@ -1894,13 +1894,13 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1894
1894
|
`),n.stdout.write(`
|
|
1895
1895
|
`)}return 0}function $C(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let n=Math.max(0,Math.round((Date.now()-e)/1e3));if(n<60)return`${n}s ago`;let r=Math.round(n/60);if(r<60)return`${r}m ago`;let s=Math.round(r/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function MC(t,e){let n=t.filter(a=>a!=="--json"&&a!=="--text");if(n.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
|
|
1896
1896
|
`),2;let r=de(n[0],"attention_id");if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1897
|
-
`),2;let s=
|
|
1897
|
+
`),2;let s=tr(e),i=Rn("application/json",s.token),o;try{o=await fetch(new URL(`/api/escalations/${r}`,s.baseUrl),{method:"GET",headers:i})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1898
1898
|
`),1}return o.status===404?(e.stderr.write(`error: escalation not found: ${r}
|
|
1899
1899
|
`),1):o.ok?(e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1900
1900
|
`),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1901
1901
|
`),o.status===400?2:1)}async function DC(t,e){let n=!1,r=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){n=!0;continue}if(m==="--done"){r=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1902
1902
|
`),2;let i=de(s[0],"attention_id");if(typeof i=="string")return e.stderr.write(`error: ${i}
|
|
1903
|
-
`),2;let o=s[1],a=
|
|
1903
|
+
`),2;let o=s[1],a=tr(e),l=Rn("application/json",a.token);l["Content-Type"]="application/json";let c={input:o};r&&(c.done=!0);let d;try{d=await fetch(new URL(`/api/escalations/${i}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
|
|
1904
1904
|
`),1}if(d.status===404)return e.stderr.write(`error: escalation not found: ${i}
|
|
1905
1905
|
`),1;if(!d.ok){let f=await d.text();return e.stderr.write(`error: HTTP ${d.status}: ${f}
|
|
1906
1906
|
`),d.status===400?2:1}let u=await d.json();return n?e.stdout.write(`${JSON.stringify(u,null,2)}
|
|
@@ -1950,7 +1950,7 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1950
1950
|
`):e.stdout.write(Wo(a)),0)}finally{i&&o.close()}}async function T$(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
|
|
1951
1951
|
`),2;if(!/^\d+$/.test(n)||Number(n)<=0)return e.stderr.write(`error: invalid run_id: ${n}
|
|
1952
1952
|
`),2;let s=!1;for(let c of r){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ae(c)}
|
|
1953
|
-
`),2}let i=
|
|
1953
|
+
`),2}let i=tr(e),a=Rn(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${n}/where`,i.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1954
1954
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1955
1955
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1956
1956
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
@@ -1962,17 +1962,17 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1962
1962
|
`):e.stdout.write(Bo(a)),0)}finally{i&&o.close()}}async function S$(t,e){let[n,...r]=t;if(n===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
|
|
1963
1963
|
`),2;if(!/^\d+$/.test(n)||Number(n)<=0)return e.stderr.write(`error: invalid run_id: ${n}
|
|
1964
1964
|
`),2;let s=!1;for(let c of r){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ae(c)}
|
|
1965
|
-
`),2}let i=
|
|
1965
|
+
`),2}let i=tr(e),a=Rn(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${n}/timeline`,i.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1966
1966
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1967
1967
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1968
1968
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1969
1969
|
`),l.status===404?1:l.status===400?2:1)}async function b$(t,e){let n=!1;for(let a of t){if(a==="--json"){n=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ae(a)}
|
|
1970
|
-
`),2}let r=
|
|
1970
|
+
`),2}let r=tr(e),i=Rn(n?"application/json":"text/plain",r.token),o;try{o=await fetch(new URL("/api/workflows/verify",r.baseUrl),{method:"GET",headers:i})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1971
1971
|
`),2}return o.ok?(n?e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1972
1972
|
`):(e.stdout.write(await o.text()),o.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1973
1973
|
`)),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1974
1974
|
`),o.status===400?2:1)}function k$(t,e,n,r){let s=!1;for(let i of e){if(i==="--unacked"){s=!0;continue}return n.stderr.write(`error: ${ae(i)}
|
|
1975
|
-
`),2}return it(n,
|
|
1975
|
+
`),2}return it(n,An(t,{unacked:s}),r),0}function uy(t,e,n){let[r,...s]=e;if(r===void 0)return n.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1976
1976
|
`),2;if(r==="list"){let i=ny(s);if(typeof i=="string")return n.stderr.write(`error: ${i}
|
|
1977
1977
|
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Uo(t,o);return ry(a,i.json,n)}if(r==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return n.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
|
|
1978
1978
|
`),2;let o=de(i[0],"attention_id");if(typeof o=="string")return n.stderr.write(`error: ${o}
|
|
@@ -1982,9 +1982,9 @@ ${n}`:n}function F0(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1982
1982
|
`),2)}function I$(t,e,n){let r=!1,s=!1,i=[];for(let m of e){if(m==="--json"){r=!0;continue}if(m==="--done"){s=!0;continue}i.push(m)}if(i.length!==2)return n.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1983
1983
|
`),2;let o=de(i[0],"attention_id");if(typeof o=="string")return n.stderr.write(`error: ${o}
|
|
1984
1984
|
`),2;let a=i[1],l=Wt(t,o);if(l===null)return n.stderr.write(`error: escalation not found: ${o}
|
|
1985
|
-
`),1;let c=
|
|
1985
|
+
`),1;let c=An(t).find(m=>m.id===o);if(c===void 0)return n.stderr.write(`error: escalation not found: ${o}
|
|
1986
1986
|
`),1;if(c.kind==="workflow_escalation"){let m=t.resumeEscalation(o,a);if(!m.resumed)return n.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${o})
|
|
1987
|
-
`),2;let p=
|
|
1987
|
+
`),2;let p=An(t).find(h=>h.id===o),_={ok:!0,attention_id:o,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return r?n.stdout.write(`${JSON.stringify(_,null,2)}
|
|
1988
1988
|
`):n.stdout.write(`ok: attention ${o} acknowledged; run ${m.run.id} resumed with decision "${a}"
|
|
1989
1989
|
`),0}if(c.kind!=="interactive_waiting_operator")return n.stderr.write(`error: attention ${o} is kind=${c.kind}, not interactive_waiting_operator
|
|
1990
1990
|
`),2;if(c.acknowledged_at!==null)return n.stderr.write(`error: attention ${o} is already acknowledged (${c.acknowledged_at})
|
|
@@ -2131,22 +2131,22 @@ and \`lmctl api escalations\` (no args) print detailed usage.
|
|
|
2131
2131
|
|
|
2132
2132
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
2133
2133
|
and report the first step that would be started. Default output is the TTY
|
|
2134
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;m$=["open","assigned","closed","reopened"]});import my from"jexl";function Pr(t){my.compile(py(t))}async function tr(t,e){return my.eval(py(t),e)}function py(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Hs=w(()=>{"use strict"});import{z as T}from"zod";function Zd(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var N$,_y,Jd,Gd,Kd,Vd,Yd,zd,hy,x$,A$,R$,Xs,L$,Ko,Vo,Yo,zo,Zo,gy,O$,C$,$$,M$,Qo,Fr=w(()=>{"use strict";Hs();N$=T.object({kind:T.enum(["success","neutral","failure"])}),_y=T.enum(["string","number","boolean","object","array"]),Jd=T.object({name:T.string().min(1),type:_y,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),Gd=T.object({name:T.string().min(1),type:_y,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),Kd=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),Vd="__failure__",Yd=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),zd=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),hy=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),x$=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),A$=T.union([T.string().min(1),x$]),R$=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Xs=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(A$).optional(),skills:T.array(R$).optional()}),L$=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Ko=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Xs,pre_checks:T.array(L$).optional(),reviewers:T.array(Xs.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.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"})}),Vo=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Xs.extend({topic:T.string().min(1)})).optional(),consolidator:Xs,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Yo=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Xs.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),zo=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Zo=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),gy=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[n,r]of t.branches.entries())try{Pr(Zd(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),O$=T.discriminatedUnion("type",[hy,Ko,Vo,Yo,zo,Zo,gy]),C$=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:O$,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{Pr(Zd(t.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),$$=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[n,r]of Object.entries(t.inputs??{}))try{Pr(Zd(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),M$=T.discriminatedUnion("type",[hy,Ko,Vo,Yo,zo,Zo,gy,C$,$$]),Qo=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),M$),terminals:T.record(T.string().min(1),N$),errors:zd,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(Jd).optional(),outputs:T.array(Gd).optional(),triggers:T.array(Kd).optional(),read_only:T.boolean().optional(),requires:Yd}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var D$,ea,j$,P$,F$,qt,Ur=w(()=>{"use strict";Fr();D$=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ea=Q.string().regex(D$),j$=Q.object({step_id:ea,type:Q.literal("main"),index:Q.number().int().min(0)}),P$=Q.record(ea,Q.record(Q.string().min(1),Q.array(Q.array(j$)))),F$=Q.object({id:ea,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),qt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:zd,inputs:Q.array(Jd).optional(),outputs:Q.array(Gd).optional(),steps:Q.array(F$).min(1),connections:P$.default({}),entry_step_id:ea,triggers:Q.array(Kd).optional(),read_only:Q.boolean().optional(),requires:Yd}).superRefine((t,e)=>{let n=new Set;for(let[r,s]of t.steps.entries())n.has(s.id)&&e.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.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[r,s]of Object.entries(t.connections)){n.has(r)||e.addIssue({code:"custom",path:["connections",r],message:`connection source does not reference an existing step: ${r}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())n.has(d.step_id)||e.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function ta(t){return eu(t)}function eu(t){if(Array.isArray(t))return t.map(eu);if(t===null||typeof t!="object")return t;let e=t,n={};for(let r of Object.keys(e))n[r]=eu(e[r]);if(typeof n.type=="string"){let r=W$[n.type];r!==void 0&&(n.type=r)}return n}var Qd,U$,W$,tu=w(()=>{"use strict";Qd="lmctl.builtin.",U$={Review:`${Qd}Review`,Research:`${Qd}Research`,Consolidate:`${Qd}Consolidate`},W$=Object.fromEntries(Object.entries(U$).map(([t,e])=>[e,t]))});import{readFileSync as q$}from"node:fs";function wy(t){return B$(t)}function B$(t){let e=ta(J$(t));if(X$(e),Ty(e)===3)return H$(e);let n=Qo.safeParse(e);if(!n.success)throw new an({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=G$(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new an(r);return n.data}function H$(t){let e=qt.safeParse(t);if(!e.success)throw new an({errors:e.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return e.data}function X$(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Ty(t);if(!(e===null||yy.includes(e)))throw new an({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${yy.join(", ")}`}]})}function Ty(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 J$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2134
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;m$=["open","assigned","closed","reopened"]});import my from"jexl";function Pr(t){my.compile(py(t))}async function nr(t,e){return my.eval(py(t),e)}function py(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Hs=w(()=>{"use strict"});import{z as T}from"zod";function Zd(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var N$,_y,Jd,Gd,Kd,Vd,Yd,zd,hy,x$,A$,R$,Xs,L$,Ko,Vo,Yo,zo,Zo,gy,O$,C$,$$,M$,Qo,Fr=w(()=>{"use strict";Hs();N$=T.object({kind:T.enum(["success","neutral","failure"])}),_y=T.enum(["string","number","boolean","object","array"]),Jd=T.object({name:T.string().min(1),type:_y,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),Gd=T.object({name:T.string().min(1),type:_y,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),Kd=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),Vd="__failure__",Yd=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),zd=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),hy=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),x$=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),A$=T.union([T.string().min(1),x$]),R$=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Xs=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(A$).optional(),skills:T.array(R$).optional()}),L$=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Ko=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Xs,pre_checks:T.array(L$).optional(),reviewers:T.array(Xs.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.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"})}),Vo=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Xs.extend({topic:T.string().min(1)})).optional(),consolidator:Xs,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Yo=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Xs.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),zo=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Zo=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),gy=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[n,r]of t.branches.entries())try{Pr(Zd(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),O$=T.discriminatedUnion("type",[hy,Ko,Vo,Yo,zo,Zo,gy]),C$=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:O$,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{Pr(Zd(t.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),$$=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[n,r]of Object.entries(t.inputs??{}))try{Pr(Zd(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),M$=T.discriminatedUnion("type",[hy,Ko,Vo,Yo,zo,Zo,gy,C$,$$]),Qo=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),M$),terminals:T.record(T.string().min(1),N$),errors:zd,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(Jd).optional(),outputs:T.array(Gd).optional(),triggers:T.array(Kd).optional(),read_only:T.boolean().optional(),requires:Yd}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var D$,ea,j$,P$,F$,qt,Ur=w(()=>{"use strict";Fr();D$=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ea=Q.string().regex(D$),j$=Q.object({step_id:ea,type:Q.literal("main"),index:Q.number().int().min(0)}),P$=Q.record(ea,Q.record(Q.string().min(1),Q.array(Q.array(j$)))),F$=Q.object({id:ea,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),qt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:zd,inputs:Q.array(Jd).optional(),outputs:Q.array(Gd).optional(),steps:Q.array(F$).min(1),connections:P$.default({}),entry_step_id:ea,triggers:Q.array(Kd).optional(),read_only:Q.boolean().optional(),requires:Yd}).superRefine((t,e)=>{let n=new Set;for(let[r,s]of t.steps.entries())n.has(s.id)&&e.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.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[r,s]of Object.entries(t.connections)){n.has(r)||e.addIssue({code:"custom",path:["connections",r],message:`connection source does not reference an existing step: ${r}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())n.has(d.step_id)||e.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function ta(t){return eu(t)}function eu(t){if(Array.isArray(t))return t.map(eu);if(t===null||typeof t!="object")return t;let e=t,n={};for(let r of Object.keys(e))n[r]=eu(e[r]);if(typeof n.type=="string"){let r=W$[n.type];r!==void 0&&(n.type=r)}return n}var Qd,U$,W$,tu=w(()=>{"use strict";Qd="lmctl.builtin.",U$={Review:`${Qd}Review`,Research:`${Qd}Research`,Consolidate:`${Qd}Consolidate`},W$=Object.fromEntries(Object.entries(U$).map(([t,e])=>[e,t]))});import{readFileSync as q$}from"node:fs";function wy(t){return B$(t)}function B$(t){let e=ta(J$(t));if(X$(e),Ty(e)===3)return H$(e);let n=Qo.safeParse(e);if(!n.success)throw new an({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=G$(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new an(r);return n.data}function H$(t){let e=qt.safeParse(t);if(!e.success)throw new an({errors:e.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return e.data}function X$(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Ty(t);if(!(e===null||yy.includes(e)))throw new an({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${yy.join(", ")}`}]})}function Ty(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 J$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2135
2135
|
`)||e.startsWith("{")||e.startsWith("[")?Ey(t,"$"):e.endsWith(".json")?Ey(q$(e,"utf8"),e):t}function Ey(t,e){try{return JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new an({errors:[{path:e,message:`invalid JSON: ${r}`}]})}}function G$(t){let e=[],n=[],r=new Set(Object.keys(t.states));r.has(t.start_at)||n.push({state:"$",ref:t.start_at,kind:"next"}),K$(t,r,n);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:n}}function K$(t,e,n){let r=t.errors?.on_unhandled_failure_state;r!==void 0&&(e.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var yy,an,vy=w(()=>{"use strict";Fr();Ur();tu();yy=[1,2,3],an=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 V$}from"node:crypto";function Sy(t,e){let n=Y$(e),r=V$("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function Y$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var by=w(()=>{"use strict";Ur()});function Q$(t,e){let n=Z$[t]??[],r={},s={};for(let[i,o]of Object.entries(e))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function xy(t){let e=[],n=(N,x)=>{throw new Wr([{line:N,message:x}])},r=t.split(`
|
|
2136
|
-
`),s=[];for(let N=0;N<r.length;N+=1){let C=nM(r[N]).trim();C.length>0&&s.push({n:N+1,text:C})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(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,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,x,C,H,W,F)=>{l.has(N)&&n(H,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(H,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:x,params:C,line:H,isTerminal:W,...F?{members:F}:{}}),d.push(N)},y=N=>{let x=[],C=N+1;for(;C<s.length;C+=1){let H=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(H===null)break;x.push({label:H[1],dst:H[2]})}return{branches:x,nextIdx:C-1}};for(let N=1;N<s.length;N+=1){let{n:x,text:C}=s[N],H=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){N!==1&&n(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),F=Rn(W[1],x,n);for(let te of Object.keys(F))Iy.has(te)||n(x,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Iy].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(H==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),F=W[1],te=W[2],Te=W[3],fe=ky[te];fe===void 0&&n(x,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(ky).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ne,members:Yt}=Q$(fe,Rn(Te,x,n));g(F,fe,Ne,x,!1,Object.keys(Yt).length>0?Yt:void 0);continue}if(H==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),F=W[1],te=W[2],Te=W[3],fe=Ny[te];fe===void 0&&n(x,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(Ny).join(", ")})`),p.has(F)&&n(x,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:fe,parameters:Rn(Te,x,n)});continue}if(H==="mcp"||H==="skill"){let W=new RegExp(`^${H}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??n(x,`malformed \`${H}\` decl (expected \`${H} <name> = {json} | ${H} <name> = "<file|url>"\`): ${C}`),F=W[1],te=W[2].trim(),Te=H==="mcp"?_:h;Te.has(F)&&n(x,`duplicate ${H} declaration: ${F}`);let fe;if(te.startsWith("{")){let Ne=Rn(te,x,n);H==="mcp"?fe={...Ne,name:F}:((typeof Ne.content!="string"||Ne.content.length===0)&&n(x,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),fe={name:F,content:Ne.content})}else{let Ne=Ay(te);(typeof Ne!="string"||Ne.length===0)&&n(x,`\`${H} ${F}\`: string form must be a non-empty file path or http(s) URL`),fe=Ne}Te.set(F,fe);continue}if(H==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??n(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},x,!0);continue}if(H==="seq"){let F=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(F.length<3||F.length%2===0)&&n(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<F.length+1&&!(te+2>F.length-1);te+=2){let Te=F[te],fe=F[te+1],Ne=F[te+2],Yt=fe==="->"?"main":fe.slice(1,-2);c.push({srcDeclId:Te,port:Yt,dstDeclId:Ne,line:x})}continue}if(H==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??n(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Te,fe=N+1;for(;fe<s.length;fe+=1){let Ne=s[fe].text,Yt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ne);if(Yt!==null){Te!==void 0&&n(s[fe].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let ms=Yt[2];te.push({when:Yt[1].trim(),next:`@terminal:${ms}`}),c.push({srcDeclId:F,port:ms,dstDeclId:Yt[3],line:s[fe].n});continue}let Wl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ne);if(Wl!==null){Te!==void 0&&n(s[fe].n,`\`choice ${F}\` has more than one \`default\``);let ms=Wl[1];Te=`@terminal:${ms}`,c.push({srcDeclId:F,port:ms,dstDeclId:Wl[2],line:s[fe].n});continue}break}te.length===0&&n(x,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(F,"lmctl/choice",{branches:te,...Te!==void 0?{default_next:Te}:{}},x,!1),N=fe-1;continue}if(H==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(W[1],"lmctl/loop",Rn(W[2],x,n),x,!1);continue}if(H==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),F=Rn(W[2],x,n);"mode"in F&&n(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(W[1],"lmctl/foreach",F,x,!1);continue}if(H==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),F=W[1],te=Rn(W[2],x,n),Te=te.workflow;(typeof Te!="string"||Te.length===0)&&n(x,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:fe,...Ne}=te;g(F,"lmctl/subflow",{workflow_name:Te,...Ne},x,!1),u.push({declId:F,target:Te,line:x});continue}if(H==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??n(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),F=W[1],te=Rn(W[2],x,n),{branches:Te,nextIdx:fe}=y(N);Te.length===0&&n(x,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(F,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:te});for(let Ne of Te)c.push({srcDeclId:F,port:Ne.label,dstDeclId:Ne.dst,line:x});N=fe;continue}if(H==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??n(x,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&n(x,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}n(x,`unknown statement \`${H}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let E=N=>{if(Array.isArray(N)){for(let C of N)E(C);return}if(typeof N!="object"||N===null)return;let x=N;if(typeof x.alias=="string")for(let[C,H]of[["mcp",_],["skills",h]]){let W=x[C];Array.isArray(W)&&(x[C]=W.map(F=>typeof F=="string"&&H.has(F)?structuredClone(H.get(F)):F))}for(let C of Object.values(x))E(C)};for(let N of d){let x=l.get(N);x.members!==void 0&&E(x.members)}let S=N=>Sy(o,N),b=d.map(N=>{let x=l.get(N);return{id:S(N),name:N,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),k={};for(let N of c){l.has(N.srcDeclId)||n(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||n(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&n(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let x=S(N.srcDeclId);k[x]??={},k[x][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[x][N.port]=[[{step_id:S(N.dstDeclId),type:"main",index:0}]]}for(let N of d){let x=l.get(N);eM.has(x.type)||n(x.line,`unknown archetype \`${x.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of u)N.target===o&&n(N.line,`subflow cycle: \`call ${N.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 P=new Map;for(let N of c){let x=P.get(N.srcDeclId);x===void 0?P.set(N.srcDeclId,[N.dstDeclId]):x.push(N.dstDeclId)}for(let N of d){let x=l.get(N);if(x.type!=="lmctl/loop")continue;let C=x.params.body;if(typeof C=="string"&&l.has(C)){let H=P.get(N);H===void 0?P.set(N,[C]):H.push(C)}}let U=new Set([f]),j=[f];for(;j.length>0;){let N=j.shift();for(let x of P.get(N)??[])U.has(x)||(U.add(x),j.push(x))}for(let N of d)U.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let A=new Map;for(let N of c){let x=A.get(N.srcDeclId);x===void 0&&(x=new Set,A.set(N.srcDeclId,x)),x.add(N.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of d){let x=l.get(N);if(x.isTerminal)continue;let C=A.get(N)??new Set;if(x.type==="lmctl/review"){let W=[...C].some(F=>!R.has(F));!C.has("approve")&&!W&&n(x.line,`uncovered outcome: review step \`${N}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${N} -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 H=tM[x.type];if(H!==void 0)for(let W of H)C.has(W)||n(x.line,`uncovered outcome: required outcome \`${W}\` of step \`${N}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${N} -${W}-> <target|terminal>\`)`);else C.size===0&&n(x.line,`uncovered outcome: non-terminal step \`${N}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of d){let x=l.get(N),C=z$[x.type];if(C===void 0)continue;let H={...x.params,...x.members??{},type:C.v2type,state_name:N,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},W=C.schema.safeParse(H);if(!W.success){let F=W.error.issues[0],te=F.path.length===0?"$":F.path.map(String).join(".");n(x.line,`step \`${N}\` (\`${x.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let re={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:b,connections:k,entry_step_id:S(f)},X=qt.safeParse(re);if(!X.success)throw new Wr(X.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return X.data}function nM(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Rn(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of rM(r)){let o=i.indexOf("=");o===-1&&n(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)||n(e,`invalid arg name: ${a}`),s[a]=Ay(l)}return s}function rM(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ay(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 z$,Z$,ky,Wr,eM,tM,Iy,Ny,Ry=w(()=>{"use strict";Ur();by();Fr();z$={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ko},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Vo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Yo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:zo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Zo}},Z$={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ky={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"},Wr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2136
|
+
`),s=[];for(let N=0;N<r.length;N+=1){let C=nM(r[N]).trim();C.length>0&&s.push({n:N+1,text:C})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(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,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,x,C,H,W,F)=>{l.has(N)&&n(H,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(H,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:x,params:C,line:H,isTerminal:W,...F?{members:F}:{}}),d.push(N)},y=N=>{let x=[],C=N+1;for(;C<s.length;C+=1){let H=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(H===null)break;x.push({label:H[1],dst:H[2]})}return{branches:x,nextIdx:C-1}};for(let N=1;N<s.length;N+=1){let{n:x,text:C}=s[N],H=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){N!==1&&n(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),F=Ln(W[1],x,n);for(let te of Object.keys(F))Iy.has(te)||n(x,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Iy].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(H==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),F=W[1],te=W[2],Te=W[3],fe=ky[te];fe===void 0&&n(x,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(ky).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ne,members:Yt}=Q$(fe,Ln(Te,x,n));g(F,fe,Ne,x,!1,Object.keys(Yt).length>0?Yt:void 0);continue}if(H==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),F=W[1],te=W[2],Te=W[3],fe=Ny[te];fe===void 0&&n(x,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(Ny).join(", ")})`),p.has(F)&&n(x,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:fe,parameters:Ln(Te,x,n)});continue}if(H==="mcp"||H==="skill"){let W=new RegExp(`^${H}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??n(x,`malformed \`${H}\` decl (expected \`${H} <name> = {json} | ${H} <name> = "<file|url>"\`): ${C}`),F=W[1],te=W[2].trim(),Te=H==="mcp"?_:h;Te.has(F)&&n(x,`duplicate ${H} declaration: ${F}`);let fe;if(te.startsWith("{")){let Ne=Ln(te,x,n);H==="mcp"?fe={...Ne,name:F}:((typeof Ne.content!="string"||Ne.content.length===0)&&n(x,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),fe={name:F,content:Ne.content})}else{let Ne=Ay(te);(typeof Ne!="string"||Ne.length===0)&&n(x,`\`${H} ${F}\`: string form must be a non-empty file path or http(s) URL`),fe=Ne}Te.set(F,fe);continue}if(H==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??n(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},x,!0);continue}if(H==="seq"){let F=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(F.length<3||F.length%2===0)&&n(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<F.length+1&&!(te+2>F.length-1);te+=2){let Te=F[te],fe=F[te+1],Ne=F[te+2],Yt=fe==="->"?"main":fe.slice(1,-2);c.push({srcDeclId:Te,port:Yt,dstDeclId:Ne,line:x})}continue}if(H==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??n(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Te,fe=N+1;for(;fe<s.length;fe+=1){let Ne=s[fe].text,Yt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ne);if(Yt!==null){Te!==void 0&&n(s[fe].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let ms=Yt[2];te.push({when:Yt[1].trim(),next:`@terminal:${ms}`}),c.push({srcDeclId:F,port:ms,dstDeclId:Yt[3],line:s[fe].n});continue}let Wl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ne);if(Wl!==null){Te!==void 0&&n(s[fe].n,`\`choice ${F}\` has more than one \`default\``);let ms=Wl[1];Te=`@terminal:${ms}`,c.push({srcDeclId:F,port:ms,dstDeclId:Wl[2],line:s[fe].n});continue}break}te.length===0&&n(x,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(F,"lmctl/choice",{branches:te,...Te!==void 0?{default_next:Te}:{}},x,!1),N=fe-1;continue}if(H==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(W[1],"lmctl/loop",Ln(W[2],x,n),x,!1);continue}if(H==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),F=Ln(W[2],x,n);"mode"in F&&n(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(W[1],"lmctl/foreach",F,x,!1);continue}if(H==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),F=W[1],te=Ln(W[2],x,n),Te=te.workflow;(typeof Te!="string"||Te.length===0)&&n(x,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:fe,...Ne}=te;g(F,"lmctl/subflow",{workflow_name:Te,...Ne},x,!1),u.push({declId:F,target:Te,line:x});continue}if(H==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??n(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),F=W[1],te=Ln(W[2],x,n),{branches:Te,nextIdx:fe}=y(N);Te.length===0&&n(x,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(F,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:te});for(let Ne of Te)c.push({srcDeclId:F,port:Ne.label,dstDeclId:Ne.dst,line:x});N=fe;continue}if(H==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??n(x,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&n(x,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}n(x,`unknown statement \`${H}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let E=N=>{if(Array.isArray(N)){for(let C of N)E(C);return}if(typeof N!="object"||N===null)return;let x=N;if(typeof x.alias=="string")for(let[C,H]of[["mcp",_],["skills",h]]){let W=x[C];Array.isArray(W)&&(x[C]=W.map(F=>typeof F=="string"&&H.has(F)?structuredClone(H.get(F)):F))}for(let C of Object.values(x))E(C)};for(let N of d){let x=l.get(N);x.members!==void 0&&E(x.members)}let S=N=>Sy(o,N),b=d.map(N=>{let x=l.get(N);return{id:S(N),name:N,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),k={};for(let N of c){l.has(N.srcDeclId)||n(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||n(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&n(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let x=S(N.srcDeclId);k[x]??={},k[x][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[x][N.port]=[[{step_id:S(N.dstDeclId),type:"main",index:0}]]}for(let N of d){let x=l.get(N);eM.has(x.type)||n(x.line,`unknown archetype \`${x.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of u)N.target===o&&n(N.line,`subflow cycle: \`call ${N.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 P=new Map;for(let N of c){let x=P.get(N.srcDeclId);x===void 0?P.set(N.srcDeclId,[N.dstDeclId]):x.push(N.dstDeclId)}for(let N of d){let x=l.get(N);if(x.type!=="lmctl/loop")continue;let C=x.params.body;if(typeof C=="string"&&l.has(C)){let H=P.get(N);H===void 0?P.set(N,[C]):H.push(C)}}let U=new Set([f]),j=[f];for(;j.length>0;){let N=j.shift();for(let x of P.get(N)??[])U.has(x)||(U.add(x),j.push(x))}for(let N of d)U.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let A=new Map;for(let N of c){let x=A.get(N.srcDeclId);x===void 0&&(x=new Set,A.set(N.srcDeclId,x)),x.add(N.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of d){let x=l.get(N);if(x.isTerminal)continue;let C=A.get(N)??new Set;if(x.type==="lmctl/review"){let W=[...C].some(F=>!R.has(F));!C.has("approve")&&!W&&n(x.line,`uncovered outcome: review step \`${N}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${N} -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 H=tM[x.type];if(H!==void 0)for(let W of H)C.has(W)||n(x.line,`uncovered outcome: required outcome \`${W}\` of step \`${N}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${N} -${W}-> <target|terminal>\`)`);else C.size===0&&n(x.line,`uncovered outcome: non-terminal step \`${N}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of d){let x=l.get(N),C=z$[x.type];if(C===void 0)continue;let H={...x.params,...x.members??{},type:C.v2type,state_name:N,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},W=C.schema.safeParse(H);if(!W.success){let F=W.error.issues[0],te=F.path.length===0?"$":F.path.map(String).join(".");n(x.line,`step \`${N}\` (\`${x.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let re={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:b,connections:k,entry_step_id:S(f)},X=qt.safeParse(re);if(!X.success)throw new Wr(X.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return X.data}function nM(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Ln(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of rM(r)){let o=i.indexOf("=");o===-1&&n(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)||n(e,`invalid arg name: ${a}`),s[a]=Ay(l)}return s}function rM(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ay(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 z$,Z$,ky,Wr,eM,tM,Iy,Ny,Ry=w(()=>{"use strict";Ur();by();Fr();z$={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ko},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Vo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Yo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:zo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Zo}},Z$={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ky={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"},Wr=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2137
2137
|
${e.map(n=>` line ${n.line}: ${n.message}`).join(`
|
|
2138
2138
|
`)}`),this.issues=e,this.name="DslCompileError"}},eM=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"]),tM={"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"]),Ny={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as sM}from"node:fs";function iM(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function oM(t){for(let e of t.split(`
|
|
2139
|
-
`)){let n=e.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function
|
|
2140
|
-
`)||e.startsWith("{")||e.startsWith("[")?Ly(t):e.endsWith(".json")?Ly(sM(e,"utf8")):t}function Ly(t){return JSON.parse(t)}function cM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var nu,ln,Js=w(()=>{"use strict";Fr();vy();tu();Ur();Ry();nu=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},ln=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function na(t){let e=t.workflow?.concurrent_limit??1,n=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return n===null||n.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:dM(n,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:fM(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function dM(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(n,r)=>{let s=uM(e,r.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function uM(t,e){let n=t;for(let r of e.split(".")){if(typeof n!="object"||n===null||!Object.prototype.hasOwnProperty.call(n,r))return;n=n[r]}return n}function fM(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var ru=w(()=>{"use strict"});var Oy={};me(Oy,{enqueueFromAgentOutput:()=>pM,enqueueFromGitHubIssue:()=>su,enqueueManual:()=>mM,enqueueScheduled:()=>_M});function su(t,e){return sa(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:ra(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function mM(t,e){return sa(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:ra(e.payload),concurrency_key:e.concurrency_key})}function pM(t,e){let n=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return sa(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:n,dedupe_key:n,available_at:e.available_at,payload:ra(e.payload),concurrency_key:e.concurrency_key})}function _M(t,e){return sa(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:ra(e.payload),concurrency_key:e.concurrency_key})}function ra(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function sa(t,e){let n=e.concurrency_key;if(n!==void 0)return t.enqueueJob({...e,concurrency_key:n});let r=t.getProject(e.project_id),s=r===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name);if(r===null||s===null)return t.enqueueJob(e);try{let i=Tt(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=na({workflow:i,job:o,project:r});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var iu=w(()=>{"use strict";Js();ru()});async function $y(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Cy(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let n={event:{kind:"github_issue",issue:t.issue}},r=[],s=0;for(let i of e){if(!await hM(i.condition,n))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...gM(i.parameters_override)},l=Cy(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);r.push(...l.jobs),s+=l.new_jobs}return{jobs:r,new_jobs:s}}function Cy(t,e,n,r,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",r);return{jobs:[su(t,{project_id:e,issue_url:n.url,payload:i,workflow_id_override:s,dedupe_key:r,priority:o})],new_jobs:a===null?1:0}}async function hM(t,e){if(t===null||t.trim().length===0)return!0;try{return await tr(t,e)===!0}catch{return!1}}function gM(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 My=w(()=>{"use strict";Hs();iu()});import{spawnSync as yM}from"node:child_process";async function EM(t){let e=t.labels??["bug"],n=t.state??"open",r=["issue","list","--repo",t.project.name,"--state",n,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&r.splice(4,0,"--label",e.join(","));let s=yM(t.binary??"gh",r,{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(!TM(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await $y({dal:t.dal,project:t.project,issue:vM(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function ia(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let n of t.listProjectsWithIntakeEnabled()){let r=wM(n.intake_config);try{let s=await EM({dal:t,project:n,labels:r.labels,state:r.state});e.push({project_id:n.id,project_name:n.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:n.id,project_name:n.name,scanned:0,new_jobs:0,error:i});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:n.id,payload:JSON.stringify({project_id:n.id,project_name:n.name,error:i})})}catch{}}}return e}function wM(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ou(e))return{};let n=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,r=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:r,state:n}}catch{return{}}}function TM(t){return Array.isArray(t)&&t.every(e=>{if(!ou(e))return!1;let n=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")&&(n===void 0||Array.isArray(n)&&n.every(r=>typeof r=="string"?!0:ou(r)&&typeof r.name=="string"))})}function vM(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:n,...r}=t;return e===void 0?r:{...r,labels:e}}function ou(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var au=w(()=>{"use strict";My()});function jy(t){return async e=>bM(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bM(t,e,n={}){let r=kM(e.path),s={"content-type":"application/json",...e.headers??{},[oa]:lu},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(r,i),a=Date.now();try{let l=await t.fetch(o),c=await IM(l);if(n.log!==void 0){let d=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${Dy(e.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(n.log!==void 0){let c=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${Dy(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Dy(t){let e=t.startsWith("/")?t:`/${t}`,n=e.search(/[?#]/);return n===-1?e:e.slice(0,n)}function kM(t){let e=t.startsWith("/")?t:`/${t}`;return`${SM}${e}`}async function IM(t){let e=await t.text(),n;if(e==="")n=void 0;else try{n=JSON.parse(e)}catch{n=e}let r={};t.headers.forEach((i,o)=>{o.toLowerCase()!==oa&&(r[o]=i)});let s={status:t.status};return Object.keys(r).length>0&&(s.headers=r),n!==void 0&&(s.body=n),s}var oa,lu,SM,cu=w(()=>{"use strict";oa="x-mailbox-channel",lu="1",SM="http://mailbox.local"});import{createHash as Py,createHmac as NM,timingSafeEqual as xM}from"node:crypto";function Fy(t={}){return async(e,n)=>{if(t.disabled===!0){await n();return}let r=Uy();if(r===null||CM(e.req.path)){await n();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(oa)===lu){await n();return}let s=e.req.query("token");if(s!==void 0&&aa(s,r)){uu(e,r),await n();return}if(OM(e,r)){await n();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 Uy(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Wy(t){let e=Uy();return e!==null&&aa(t,e)}function uu(t,e,n=new Date){t.header("Set-Cookie",`${du}=${RM(e,n)}; Path=/; HttpOnly; SameSite=Lax`)}function qy(t){t.header("Set-Cookie",`${du}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function RM(t,e=new Date){let r=`auth=ok|${new Date(e.getTime()+AM*24*60*60*1e3).toISOString()}`;return Buffer.from(`${r}|${By(t,r)}`,"utf8").toString("base64url")}function LM(t,e,n=new Date){let r;try{r=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=r.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=n.getTime()?!1:aa(s[2],By(e,`${s[0]}|${s[1]}`))}function aa(t,e){return xM(Py("sha256").update(t).digest(),Py("sha256").update(e).digest())}function OM(t,e){let n=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(n!==void 0&&aa(n,e))return!0;let r=$M(t.req.header("cookie")??"")[du];return r!==void 0&&LM(r,e)}function CM(t){return t==="/login"||t==="/logout"}function $M(t){let e={};for(let n of t.split(";")){let[r,...s]=n.trim().split("=");r===void 0||r.length===0||s.length===0||(e[r]=s.join("="))}return e}function By(t,e){return NM("sha256",t).update(e).digest("hex")}var du,AM,Hy=w(()=>{"use strict";cu();du="lmctl_next_session",AM=30});import{existsSync as qr,mkdirSync as MM,readdirSync as DM,readFileSync as la,unlinkSync as jM,writeFileSync as pu}from"node:fs";import{join as nr}from"node:path";function ft(t){if(!PM.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Jy(t,e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(n===null)return null;let r=n[1],s=n[2].trimStart(),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return qM(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Xy,updated_at:Xy}:null}function FM(t,e,n,r){let s=n!==null?`
|
|
2139
|
+
`)){let n=e.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function vt(t){if(typeof t=="string"&&iM()&&oM(t)){let n;try{n=xy(t)}catch(s){throw s instanceof Wr?new ln(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let r=qt.safeParse(n);if(!r.success)throw new ln(r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return r.data}let e=ta(lM(t));if(cM(e)&&e.definition_schema_version===3){let n=qt.safeParse(e);if(!n.success)throw new ln(n.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message})));return n.data}return aM(e)}function aM(t){let e=Qo.safeParse(t);if(!e.success)throw new ln(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let n=e.data,r=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(n.states))if(r.has(i.type))throw new ln([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return wy(n)}catch(s){throw s instanceof an?new nu(s):s}}function lM(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2140
|
+
`)||e.startsWith("{")||e.startsWith("[")?Ly(t):e.endsWith(".json")?Ly(sM(e,"utf8")):t}function Ly(t){return JSON.parse(t)}function cM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var nu,ln,Js=w(()=>{"use strict";Fr();vy();tu();Ur();Ry();nu=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},ln=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function na(t){let e=t.workflow?.concurrent_limit??1,n=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return n===null||n.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:dM(n,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:fM(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function dM(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(n,r)=>{let s=uM(e,r.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function uM(t,e){let n=t;for(let r of e.split(".")){if(typeof n!="object"||n===null||!Object.prototype.hasOwnProperty.call(n,r))return;n=n[r]}return n}function fM(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var ru=w(()=>{"use strict"});var Oy={};me(Oy,{enqueueFromAgentOutput:()=>pM,enqueueFromGitHubIssue:()=>su,enqueueManual:()=>mM,enqueueScheduled:()=>_M});function su(t,e){return sa(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:ra(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function mM(t,e){return sa(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:ra(e.payload),concurrency_key:e.concurrency_key})}function pM(t,e){let n=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return sa(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:n,dedupe_key:n,available_at:e.available_at,payload:ra(e.payload),concurrency_key:e.concurrency_key})}function _M(t,e){return sa(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:ra(e.payload),concurrency_key:e.concurrency_key})}function ra(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function sa(t,e){let n=e.concurrency_key;if(n!==void 0)return t.enqueueJob({...e,concurrency_key:n});let r=t.getProject(e.project_id),s=r===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name);if(r===null||s===null)return t.enqueueJob(e);try{let i=vt(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=na({workflow:i,job:o,project:r});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var iu=w(()=>{"use strict";Js();ru()});async function $y(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Cy(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let n={event:{kind:"github_issue",issue:t.issue}},r=[],s=0;for(let i of e){if(!await hM(i.condition,n))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...gM(i.parameters_override)},l=Cy(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);r.push(...l.jobs),s+=l.new_jobs}return{jobs:r,new_jobs:s}}function Cy(t,e,n,r,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",r);return{jobs:[su(t,{project_id:e,issue_url:n.url,payload:i,workflow_id_override:s,dedupe_key:r,priority:o})],new_jobs:a===null?1:0}}async function hM(t,e){if(t===null||t.trim().length===0)return!0;try{return await nr(t,e)===!0}catch{return!1}}function gM(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 My=w(()=>{"use strict";Hs();iu()});import{spawnSync as yM}from"node:child_process";async function EM(t){let e=t.labels??["bug"],n=t.state??"open",r=["issue","list","--repo",t.project.name,"--state",n,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&r.splice(4,0,"--label",e.join(","));let s=yM(t.binary??"gh",r,{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(!TM(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await $y({dal:t.dal,project:t.project,issue:vM(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function ia(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let n of t.listProjectsWithIntakeEnabled()){let r=wM(n.intake_config);try{let s=await EM({dal:t,project:n,labels:r.labels,state:r.state});e.push({project_id:n.id,project_name:n.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:n.id,project_name:n.name,scanned:0,new_jobs:0,error:i});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:n.id,payload:JSON.stringify({project_id:n.id,project_name:n.name,error:i})})}catch{}}}return e}function wM(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ou(e))return{};let n=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,r=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:r,state:n}}catch{return{}}}function TM(t){return Array.isArray(t)&&t.every(e=>{if(!ou(e))return!1;let n=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")&&(n===void 0||Array.isArray(n)&&n.every(r=>typeof r=="string"?!0:ou(r)&&typeof r.name=="string"))})}function vM(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:n,...r}=t;return e===void 0?r:{...r,labels:e}}function ou(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var au=w(()=>{"use strict";My()});function jy(t){return async e=>bM(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bM(t,e,n={}){let r=kM(e.path),s={"content-type":"application/json",...e.headers??{},[oa]:lu},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(r,i),a=Date.now();try{let l=await t.fetch(o),c=await IM(l);if(n.log!==void 0){let d=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${Dy(e.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(n.log!==void 0){let c=Date.now()-a;n.log(`[mailbox-dispatch] ${e.method} ${Dy(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Dy(t){let e=t.startsWith("/")?t:`/${t}`,n=e.search(/[?#]/);return n===-1?e:e.slice(0,n)}function kM(t){let e=t.startsWith("/")?t:`/${t}`;return`${SM}${e}`}async function IM(t){let e=await t.text(),n;if(e==="")n=void 0;else try{n=JSON.parse(e)}catch{n=e}let r={};t.headers.forEach((i,o)=>{o.toLowerCase()!==oa&&(r[o]=i)});let s={status:t.status};return Object.keys(r).length>0&&(s.headers=r),n!==void 0&&(s.body=n),s}var oa,lu,SM,cu=w(()=>{"use strict";oa="x-mailbox-channel",lu="1",SM="http://mailbox.local"});import{createHash as Py,createHmac as NM,timingSafeEqual as xM}from"node:crypto";function Fy(t={}){return async(e,n)=>{if(t.disabled===!0){await n();return}let r=Uy();if(r===null||CM(e.req.path)){await n();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(oa)===lu){await n();return}let s=e.req.query("token");if(s!==void 0&&aa(s,r)){uu(e,r),await n();return}if(OM(e,r)){await n();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 Uy(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Wy(t){let e=Uy();return e!==null&&aa(t,e)}function uu(t,e,n=new Date){t.header("Set-Cookie",`${du}=${RM(e,n)}; Path=/; HttpOnly; SameSite=Lax`)}function qy(t){t.header("Set-Cookie",`${du}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function RM(t,e=new Date){let r=`auth=ok|${new Date(e.getTime()+AM*24*60*60*1e3).toISOString()}`;return Buffer.from(`${r}|${By(t,r)}`,"utf8").toString("base64url")}function LM(t,e,n=new Date){let r;try{r=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=r.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=n.getTime()?!1:aa(s[2],By(e,`${s[0]}|${s[1]}`))}function aa(t,e){return xM(Py("sha256").update(t).digest(),Py("sha256").update(e).digest())}function OM(t,e){let n=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(n!==void 0&&aa(n,e))return!0;let r=$M(t.req.header("cookie")??"")[du];return r!==void 0&&LM(r,e)}function CM(t){return t==="/login"||t==="/logout"}function $M(t){let e={};for(let n of t.split(";")){let[r,...s]=n.trim().split("=");r===void 0||r.length===0||s.length===0||(e[r]=s.join("="))}return e}function By(t,e){return NM("sha256",t).update(e).digest("hex")}var du,AM,Hy=w(()=>{"use strict";cu();du="lmctl_next_session",AM=30});import{existsSync as qr,mkdirSync as MM,readdirSync as DM,readFileSync as la,unlinkSync as jM,writeFileSync as pu}from"node:fs";import{join as rr}from"node:path";function ft(t){if(!PM.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Jy(t,e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(n===null)return null;let r=n[1],s=n[2].trimStart(),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return qM(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Xy,updated_at:Xy}:null}function FM(t,e,n,r){let s=n!==null?`
|
|
2141
2141
|
description: ${n}`:"";return`---
|
|
2142
2142
|
name: ${t}${s}
|
|
2143
2143
|
type: ${e}
|
|
2144
2144
|
---
|
|
2145
|
-
${r}`}function UM(t,e,n,r){let s=
|
|
2145
|
+
${r}`}function UM(t,e,n,r){let s=rr(t,_u),i=`- [${e}.md](${e}.md)${r!==null?` \u2014 ${r}`:""} (${n})`,o=qr(s)?la(s,"utf8"):"",a=new RegExp(`^- \\[${Gy(e)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
|
|
2146
2146
|
`)?`${o}
|
|
2147
2147
|
${i}
|
|
2148
2148
|
`:`${o}${i}
|
|
2149
|
-
`,pu(s,o,"utf8")}function WM(t,e){let n=nr(t,_u);if(!qr(n))return;let r=la(n,"utf8"),s=new RegExp(`^- \\[${Gy(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&pu(n,r.replace(s,""),"utf8")}function Gy(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qM(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function vt(t,e){return t.durable_memory_mode==="db"?new mu(e,t.id):new fu(t.local_path)}var PM,_u,Xy,fu,mu,hu=w(()=>{"use strict";PM=/^[a-zA-Z0-9_-]+$/;_u="MEMORY.md",Xy="1970-01-01T00:00:00.000Z",fu=class{dir;constructor(e){this.dir=nr(e,"durable-memory")}read(e){ft(e);let n=nr(this.dir,`${e}.md`);if(!qr(n))return null;let r=la(n,"utf8");return Jy(e,r)}write(e){ft(e.name),MM(this.dir,{recursive:!0});let n=nr(this.dir,`${e.name}.md`),r=!qr(n),s=FM(e.name,e.type,e.description??null,e.body);return pu(n,s,"utf8"),UM(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){ft(e);let n=nr(this.dir,`${e}.md`);return qr(n)?(jM(n),WM(this.dir,e),!0):!1}listFiles(){if(!qr(this.dir))return[];let e=DM(this.dir).filter(r=>r.endsWith(".md")&&r!==_u),n=[];for(let r of e){let s=r.slice(0,-3),i=la(nr(this.dir,r),"utf8"),o=Jy(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};mu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){ft(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){ft(e.name);let n=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:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return ft(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Vy(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=vt(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=vt(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Ky.has(a))return r.json({error:`invalid type: must be one of ${[...Ky].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let u=vt(i,n),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=vt(i,n),a=r.req.query("type");return r.json(o.list(a))})}var Ky,Yy=w(()=>{"use strict";hu();Ky=new Set(["user","feedback","project","reference"])});function HM(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(BM[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function XM(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function zy(t,e=new Date){let{time:n,date:r}=XM(e),s=[],i=[],o=0,a=new TextEncoder;for(let _ of t){let h=a.encode(_.name),g=HM(_.data),y=_.data.length,E=new Uint8Array(30+h.length),S=new DataView(E.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,0,!0),S.setUint16(8,0,!0),S.setUint16(10,n,!0),S.setUint16(12,r,!0),S.setUint32(14,g,!0),S.setUint32(18,y,!0),S.setUint32(22,y,!0),S.setUint16(26,h.length,!0),S.setUint16(28,0,!0),E.set(h,30),s.push(E,_.data);let b=new Uint8Array(46+h.length),k=new DataView(b.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,n,!0),k.setUint16(14,r,!0),k.setUint32(16,g,!0),k.setUint32(20,y,!0),k.setUint32(24,y,!0),k.setUint16(28,h.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,o,!0),b.set(h,46),i.push(b),o+=E.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.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,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var BM,Zy=w(()=>{"use strict";BM=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as ua,mkdirSync as JM,readdirSync as GM,readFileSync as tE,statSync as KM,unlinkSync as VM,writeFileSync as YM}from"node:fs";import{join as Vs}from"node:path";function nE(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await St(r);if(typeof s=="string")return L(r,s,400);let i=_e(s,"name"),o=_e(s,"local_path");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(o===null||o.length===0)return L(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return L(r,`project already exists: ${i}`,409);let a=_e(s,"workflow_name")??"bugfix",l,c=_e(s,"team_name");if(c!==null&&c.length>0){let u=n.findTeamByName(c);if(u===null)return L(r,`team not found: ${c}`,404);l=u.id}else{let u=n.listTeams();if(u.length===0)return L(r,"no teams exist; create a team first",400);l=u[0].id}let d=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:_e(s,"default_branch")});return r.json(d,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await St(r);if(typeof i=="string")return L(r,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(r,"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(r,'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(r,"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(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?L(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await St(r);if(typeof s=="string")return L(r,s,400);let i=_e(s,"name");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return L(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=await St(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"alias"),a=_e(i,"provider");if(o===null||o.length===0)return L(r,"missing or empty alias",400);if(a===null||a.length===0)return L(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return L(r,`member already exists: ${o}`,409);let l=_e(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=_e(i,"role_prompt");d!==null&&n.setMemberRolePrompt(c.id,d);let u=n.findTeamMemberByAlias(s.id,o);return r.json(u??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return L(r,"member not found",404);let o=await St(r);if(typeof o=="string")return L(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return L(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return L(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return L(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?L(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=vt(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await St(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"name"),a=_e(i,"body"),l=_e(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!ca.includes(l))return L(r,`invalid type: must be one of ${ca.join("|")}`,400);try{ft(o)}catch(u){return L(r,u.message,400)}let c=vt(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(u){return L(r,u.message,400)}try{c.write({type:l,name:o,description:_e(i,"description"),body:a})}catch(u){return L(r,u.message,400)}let d=c.read(o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=vt(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o===null?L(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter"),o=await St(r);if(typeof o=="string")return L(r,o,400);let a=vt(s,n),l;try{l=a.read(i)}catch(m){return L(r,m.message,400)}if(l===null)return L(r,"chapter not found",404);let c=_e(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?_e(o,"description"):l.description,u=_e(o,"type")??l.type;if(!ca.includes(u))return L(r,`invalid type: must be one of ${ca.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return L(r,m.message,400)}let f=a.read(i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=vt(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o?r.json({removed:!0}):L(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?L(r,"project not found",404):r.json(ZM(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await St(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"name"),a=_e(i,"body"),l=_e(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!da.has(l))return L(r,`invalid type: must be one of ${[...da].join("|")}`,400);try{ft(o)}catch(f){return L(r,f.message,400)}let c=Gs(s.local_path),d=Vs(c,`${o}.md`);if(ua(d))return L(r,`chapter already exists: ${o}`,409);JM(c,{recursive:!0}),eE(d,o,l,_e(i,"description"),a);let u=Ks(c,o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);try{ft(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=Ks(Gs(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{ft(i)}catch(m){return L(r,m.message,400)}let o=Gs(s.local_path),a=Ks(o,i);if(a===null)return L(r,"chapter not found",404);let l=await St(r);if(typeof l=="string")return L(r,l,400);let c=_e(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?_e(l,"description"):a.description,u=_e(l,"type")??a.type;if(!da.has(u))return L(r,`invalid type: must be one of ${[...da].join("|")}`,400);eE(Vs(o,`${i}.md`),i,u,d,c);let f=Ks(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{ft(i)}catch(a){return L(r,a.message,400)}let o=Vs(Gs(s.local_path),`${i}.md`);return ua(o)?(VM(o),r.json({removed:!0})):L(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await St(r);return typeof s=="string"?L(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(Qy))),t.post("/api/chat/sessions",async r=>{let s=await zM(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?_e(s,"title"):null,o=n.createChatbotSession(Qy,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?L(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return L(r,"chat session not found",404);let i=await St(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"role"),a=_e(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(r,"role must be one of user|assistant|tool",400);if(a===null)return L(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return L(r,"invalid run id",400);if(n.getRun(s)===null)return L(r,"run not found",404);let o=Qn(n,s),a=[];for(let c of o){let d=eD(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=tE(c.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:d,data:u})}let l=zy(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,n){return t.json({error:e},n)}async function St(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 zM(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function _e(t,e){let n=t[e];return typeof n!="string"?null:n}function Gs(t){return Vs(t,"ai-test")}function Ks(t,e){let n=Vs(t,`${e}.md`);if(!ua(n))return null;let r=tE(n,"utf8"),s=QM(r),i=KM(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function ZM(t){let e=Gs(t);return ua(e)?GM(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=Ks(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function eE(t,e,n,r,s){let i=r!==null&&r.length>0?`
|
|
2149
|
+
`,pu(s,o,"utf8")}function WM(t,e){let n=rr(t,_u);if(!qr(n))return;let r=la(n,"utf8"),s=new RegExp(`^- \\[${Gy(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&pu(n,r.replace(s,""),"utf8")}function Gy(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qM(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function St(t,e){return t.durable_memory_mode==="db"?new mu(e,t.id):new fu(t.local_path)}var PM,_u,Xy,fu,mu,hu=w(()=>{"use strict";PM=/^[a-zA-Z0-9_-]+$/;_u="MEMORY.md",Xy="1970-01-01T00:00:00.000Z",fu=class{dir;constructor(e){this.dir=rr(e,"durable-memory")}read(e){ft(e);let n=rr(this.dir,`${e}.md`);if(!qr(n))return null;let r=la(n,"utf8");return Jy(e,r)}write(e){ft(e.name),MM(this.dir,{recursive:!0});let n=rr(this.dir,`${e.name}.md`),r=!qr(n),s=FM(e.name,e.type,e.description??null,e.body);return pu(n,s,"utf8"),UM(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){ft(e);let n=rr(this.dir,`${e}.md`);return qr(n)?(jM(n),WM(this.dir,e),!0):!1}listFiles(){if(!qr(this.dir))return[];let e=DM(this.dir).filter(r=>r.endsWith(".md")&&r!==_u),n=[];for(let r of e){let s=r.slice(0,-3),i=la(rr(this.dir,r),"utf8"),o=Jy(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};mu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){ft(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){ft(e.name);let n=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:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return ft(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Vy(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=St(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=St(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Ky.has(a))return r.json({error:`invalid type: must be one of ${[...Ky].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let u=St(i,n),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=St(i,n),a=r.req.query("type");return r.json(o.list(a))})}var Ky,Yy=w(()=>{"use strict";hu();Ky=new Set(["user","feedback","project","reference"])});function HM(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(BM[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function XM(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function zy(t,e=new Date){let{time:n,date:r}=XM(e),s=[],i=[],o=0,a=new TextEncoder;for(let _ of t){let h=a.encode(_.name),g=HM(_.data),y=_.data.length,E=new Uint8Array(30+h.length),S=new DataView(E.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,0,!0),S.setUint16(8,0,!0),S.setUint16(10,n,!0),S.setUint16(12,r,!0),S.setUint32(14,g,!0),S.setUint32(18,y,!0),S.setUint32(22,y,!0),S.setUint16(26,h.length,!0),S.setUint16(28,0,!0),E.set(h,30),s.push(E,_.data);let b=new Uint8Array(46+h.length),k=new DataView(b.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,n,!0),k.setUint16(14,r,!0),k.setUint32(16,g,!0),k.setUint32(20,y,!0),k.setUint32(24,y,!0),k.setUint16(28,h.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,o,!0),b.set(h,46),i.push(b),o+=E.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.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,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var BM,Zy=w(()=>{"use strict";BM=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as ua,mkdirSync as JM,readdirSync as GM,readFileSync as tE,statSync as KM,unlinkSync as VM,writeFileSync as YM}from"node:fs";import{join as Vs}from"node:path";function nE(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await bt(r);if(typeof s=="string")return L(r,s,400);let i=_e(s,"name"),o=_e(s,"local_path");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(o===null||o.length===0)return L(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return L(r,`project already exists: ${i}`,409);let a=_e(s,"workflow_name")??"bugfix",l,c=_e(s,"team_name");if(c!==null&&c.length>0){let u=n.findTeamByName(c);if(u===null)return L(r,`team not found: ${c}`,404);l=u.id}else{let u=n.listTeams();if(u.length===0)return L(r,"no teams exist; create a team first",400);l=u[0].id}let d=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:_e(s,"default_branch")});return r.json(d,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await bt(r);if(typeof i=="string")return L(r,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(r,"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(r,'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(r,"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(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?L(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await bt(r);if(typeof s=="string")return L(r,s,400);let i=_e(s,"name");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return L(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=await bt(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"alias"),a=_e(i,"provider");if(o===null||o.length===0)return L(r,"missing or empty alias",400);if(a===null||a.length===0)return L(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return L(r,`member already exists: ${o}`,409);let l=_e(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=_e(i,"role_prompt");d!==null&&n.setMemberRolePrompt(c.id,d);let u=n.findTeamMemberByAlias(s.id,o);return r.json(u??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return L(r,"member not found",404);let o=await bt(r);if(typeof o=="string")return L(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return L(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return L(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return L(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?L(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=St(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await bt(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"name"),a=_e(i,"body"),l=_e(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!ca.includes(l))return L(r,`invalid type: must be one of ${ca.join("|")}`,400);try{ft(o)}catch(u){return L(r,u.message,400)}let c=St(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(u){return L(r,u.message,400)}try{c.write({type:l,name:o,description:_e(i,"description"),body:a})}catch(u){return L(r,u.message,400)}let d=c.read(o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=St(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o===null?L(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter"),o=await bt(r);if(typeof o=="string")return L(r,o,400);let a=St(s,n),l;try{l=a.read(i)}catch(m){return L(r,m.message,400)}if(l===null)return L(r,"chapter not found",404);let c=_e(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?_e(o,"description"):l.description,u=_e(o,"type")??l.type;if(!ca.includes(u))return L(r,`invalid type: must be one of ${ca.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return L(r,m.message,400)}let f=a.read(i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=St(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o?r.json({removed:!0}):L(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?L(r,"project not found",404):r.json(ZM(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await bt(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"name"),a=_e(i,"body"),l=_e(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!da.has(l))return L(r,`invalid type: must be one of ${[...da].join("|")}`,400);try{ft(o)}catch(f){return L(r,f.message,400)}let c=Gs(s.local_path),d=Vs(c,`${o}.md`);if(ua(d))return L(r,`chapter already exists: ${o}`,409);JM(c,{recursive:!0}),eE(d,o,l,_e(i,"description"),a);let u=Ks(c,o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);try{ft(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=Ks(Gs(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{ft(i)}catch(m){return L(r,m.message,400)}let o=Gs(s.local_path),a=Ks(o,i);if(a===null)return L(r,"chapter not found",404);let l=await bt(r);if(typeof l=="string")return L(r,l,400);let c=_e(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?_e(l,"description"):a.description,u=_e(l,"type")??a.type;if(!da.has(u))return L(r,`invalid type: must be one of ${[...da].join("|")}`,400);eE(Vs(o,`${i}.md`),i,u,d,c);let f=Ks(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{ft(i)}catch(a){return L(r,a.message,400)}let o=Vs(Gs(s.local_path),`${i}.md`);return ua(o)?(VM(o),r.json({removed:!0})):L(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await bt(r);return typeof s=="string"?L(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(Qy))),t.post("/api/chat/sessions",async r=>{let s=await zM(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?_e(s,"title"):null,o=n.createChatbotSession(Qy,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?L(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return L(r,"chat session not found",404);let i=await bt(r);if(typeof i=="string")return L(r,i,400);let o=_e(i,"role"),a=_e(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(r,"role must be one of user|assistant|tool",400);if(a===null)return L(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return L(r,"invalid run id",400);if(n.getRun(s)===null)return L(r,"run not found",404);let o=er(n,s),a=[];for(let c of o){let d=eD(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=tE(c.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:d,data:u})}let l=zy(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,n){return t.json({error:e},n)}async function bt(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 zM(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function _e(t,e){let n=t[e];return typeof n!="string"?null:n}function Gs(t){return Vs(t,"ai-test")}function Ks(t,e){let n=Vs(t,`${e}.md`);if(!ua(n))return null;let r=tE(n,"utf8"),s=QM(r),i=KM(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function ZM(t){let e=Gs(t);return ua(e)?GM(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=Ks(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function eE(t,e,n,r,s){let i=r!==null&&r.length>0?`
|
|
2150
2150
|
description: ${r}`:"",o=`---
|
|
2151
2151
|
name: ${e}${i}
|
|
2152
2152
|
type: ${n}
|
|
@@ -2212,8 +2212,8 @@ ${s}`;YM(t,o,"utf8")}function QM(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2212
2212
|
</nav>
|
|
2213
2213
|
<main>${e}</main>
|
|
2214
2214
|
</body>
|
|
2215
|
-
</html>`}function v(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ye(t,e){let n=t.map(s=>`<th>${v(s)}</th>`).join(""),r=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>${n}</tr></thead><tbody>${r}</tbody></table>`}function he(t){return`<pre>${v(JSON.stringify(t,null,2))}</pre>`}var gu=w(()=>{"use strict"});import{createHash as rD}from"node:crypto";import{existsSync as Ys,mkdirSync as iE,readFileSync as zs,readdirSync as sD,renameSync as iD,statSync as oD,unlinkSync as aD,writeFileSync as fa}from"node:fs";import{homedir as lD}from"node:os";import{dirname as yu,isAbsolute as sE,join as
|
|
2216
|
-
`,"utf8"),iD(r,n)}function mD(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function pD(t,e,n,r,s){let i=`${e}.dist-${n}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=
|
|
2215
|
+
</html>`}function v(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ye(t,e){let n=t.map(s=>`<th>${v(s)}</th>`).join(""),r=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>${n}</tr></thead><tbody>${r}</tbody></table>`}function he(t){return`<pre>${v(JSON.stringify(t,null,2))}</pre>`}var gu=w(()=>{"use strict"});import{createHash as rD}from"node:crypto";import{existsSync as Ys,mkdirSync as iE,readFileSync as zs,readdirSync as sD,renameSync as iD,statSync as oD,unlinkSync as aD,writeFileSync as fa}from"node:fs";import{homedir as lD}from"node:os";import{dirname as yu,isAbsolute as sE,join as kt,relative as cD,resolve as Br}from"node:path";import{fileURLToPath as dD}from"node:url";function aE(t){let e=Br(t);for(;;){let n=kt(e,Eu);try{if(oD(n).isDirectory())return n}catch{}let r=yu(e);if(r===e)return null;e=r}}function wu(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return Br(e);let n=aE(t);return n!==null?n:kt(oE(),Eu)}function lE(){return Br(yu(dD(import.meta.url)),"..","..","workflows")}function uD(t){let e=kt(t,cE);try{let n=JSON.parse(zs(e,"utf8"));if(n&&typeof n=="object"&&n.files&&typeof n.files=="object")return{version:String(n.version??""),files:n.files}}catch{}return{version:"",files:{}}}function fD(t,e){iE(t,{recursive:!0});let n=kt(t,cE),r=`${n}.tmp-${process.pid}`;fa(r,`${JSON.stringify(e,null,2)}
|
|
2216
|
+
`,"utf8"),iD(r,n)}function mD(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function pD(t,e,n,r,s){let i=`${e}.dist-${n}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=kt(t,a);try{return fa(l,r,{flag:"wx"}),a}catch(c){if(mD(c)!=="EEXIST")throw c;if(ma(zs(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function _D(t,e){if(sE(e)||yu(e)!=="workflows")return null;let n=e.slice(10);if(n.length===0||n.includes("/")||n.includes("\\")||n.includes(".."))return null;let r=Br(t,"templates","workflows"),s=Br(t,"templates",e),i=cD(r,s);return i.length===0||i.startsWith("..")||sE(i)||i.includes("/")||i.includes("\\")?null:s}function hD(t,e,n){for(let[r,s]of Object.entries(e.files)){if(n.has(r))continue;let i=_D(t,r);if(i===null){delete e.files[r];continue}if(!Ys(i)){delete e.files[r];continue}try{if(ma(zs(i))!==s)continue;aD(i),delete e.files[r]}catch{}}}function dE(t={}){let e=wu(t.cwd),n=kt(e,"templates","workflows"),r=lE(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=Ys(r)?sD(r).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;iE(n,{recursive:!0});let o=uD(e),a=Ct(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=zs(kt(r,c)),f=ma(u),m=kt(n,c);if(!Ys(m)){try{fa(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=ma(zs(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)fa(m,u),o.files[d]=f,s.refreshed.push(c);else{let h=pD(n,c,a,u,f);s.preserved.push(c),s.shadowed.push(h)}}hD(e,o,l),fD(e,{version:a,files:o.files})}catch(i){if(t.swallow!==!0)throw i}return s}function Tu(t){let e=[],n=process.env.LMCTL_HOME;n!==void 0&&n.trim().length>0&&e.push(Br(n));let r=aE(t??process.cwd());return r!==null&&e.push(r),e.push(kt(oE(),Eu)),e}function pa(t,e){let n=Tu(e),r=[`${t}.compound.json`,`${t}.lmctl`];for(let s of n)for(let i of r){let o=kt(s,"templates","workflows",i);if(Ys(o))return o}for(let s of r){let i=kt(lE(),s);if(Ys(i))return i}return null}var Eu,oE,ma,cE,vu=w(()=>{"use strict";gs();Eu=".lmctl",oE=()=>process.env.HOME??lD(),ma=t=>rD("sha256").update(t).digest("hex");cE=".dist-manifest.json"});function uE(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
|
|
2217
2217
|
JOIN step s ON s.id = sa.step_id
|
|
2218
2218
|
WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let r=e.getRun(t);if(r===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
|
|
2219
2219
|
JOIN step s ON s.id = sa.step_id
|
|
@@ -2222,8 +2222,8 @@ ${s}`;YM(t,o,"utf8")}function QM(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2222
2222
|
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,r.started_at,r.ended_at??new Date().toISOString())[0],P=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",U=e.getWorkflow(r.workflow_id),j=r.started_at!==null&&r.ended_at!==null?Math.max(0,new Date(r.ended_at).getTime()-new Date(r.started_at).getTime()):null,A={run_id:t,workflow_name:U?.name??null,started_at:r.started_at,ended_at:r.ended_at,terminal_state:r.terminal_state,duration_ms:j,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:S,token_totals:P};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(A)})}var fE=w(()=>{"use strict"});import{spawnSync as pE}from"node:child_process";function Su(t){return gD[t]??`no install hint; ensure '${t}' is on PATH`}function yD(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 mE(t){return pE("which",[t],{encoding:"utf8"}).status===0}function _E(t){if(t===void 0)return null;for(let e of t.tools??[])if(!mE(e)){let n=Su(e);return{kind:"missing_tool",tool:e,install_hint:n,message:`missing dependency: ${e}; ${n}`}}for(let e of t.auth??[]){if(!mE(e)){let s=Su(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let n=yD(e);if(n===null)continue;let r=pE(e,n.args,{encoding:"utf8"});if(r.status!==0){let s=typeof r.stderr=="string"?r.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:Su(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var gD,hE=w(()=>{"use strict";gD={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 ED,readdirSync as wD,readFileSync as TD}from"node:fs";import{join as gE}from"node:path";function vD(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let n=e[1],r=n.match(/^tags:\s*\[([^\]]*)\]/m);if(r)return r[1].split(",").map(i=>i.trim()).filter(Boolean);let s=n.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
|
|
2223
2223
|
`).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function yE(t,e){let n=t.match(/^---\n([\s\S]*?)\n---/);if(!n)return null;let s=n[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function EE(t,e){if(e.length===0)return null;let n=gE(t,"durable-memory");if(!ED(n))return null;let r;try{r=wD(n).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of r)try{let o=TD(gE(n,i),"utf8");if(vD(o).some(l=>e.includes(l))){let l=yE(o,"name")??i.replace(".md",""),c=yE(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var wE=w(()=>{"use strict"});function Iu(t){let e=t.trim().replace(SD,"").trim();for(let n=0;n<4;n+=1){let r=bD.exec(e);if(r===null)break;e=r[2].trim()}return e}function TE(t){let e=t.trim(),n=kD.exec(e);if(n!==null)return n[2];let r=ID.exec(e);return r!==null?r[0]:null}function Zs(t,e){let n=t.split(`
|
|
2224
2224
|
`),r=null,s=-1;for(let o=0;o<n.length;o+=1){let a=Iu(n[o]),l=bu.exec(a);if(l===null)continue;let c=l[1].trim();if(ku.test(c))continue;let d=TE(c);d!==null&&(r=d,s=o)}if(r===null)return{outcome:null,reason:"no_stance"};if(!e.includes(r))return{outcome:null,reason:"unknown_outcome",actual:r};let i={};for(let o=s-1;o>=0;o-=1){let a=Iu(n[o]),l=bu.exec(a);if(l===null)break;let c=ku.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:r,evidence:i}}function vE(t){let e=t.split(`
|
|
2225
|
-
`),n=null;for(let r=0;r<e.length;r+=1){let s=Iu(e[r]),i=bu.exec(s);if(i===null)continue;let o=i[1].trim();if(ku.test(o))continue;let a=TE(o);if(a===null||!kr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var SD,bD,bu,ku,kD,ID,Nu=w(()=>{"use strict";Is();SD=/^#{1,6}\s+/,bD=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,bu=/^STANCE:\s+(.+)$/,ku=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,kD=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,ID=/^[A-Za-z0-9_-]+/});function SE(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var bE=w(()=>{"use strict"});import{readFileSync as ND}from"node:fs";import{dirname as xD,join as AD}from"node:path";import{fileURLToPath as RD}from"node:url";function CD(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function jD(t){let e=[],n=[];for(let r of t)LD.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function PD(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&OD.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function FD(t,e){if(t.length===0)return{matched:!1};let n=jD(t);for(let r of n){let s=PD(r,e);if(s.matched)return s}return{matched:!1}}function xu(t){return FD(t,DD)}function UD(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Au(t){return UD(t).split(" ").filter(e=>e.length>0)}var LD,OD,$D,MD,DD,kE=w(()=>{"use strict";LD=new Set(["&&","||",";","|",">",">>","<","<<"]),OD=/^[A-Za-z_][A-Za-z0-9_]*=/;$D=xD(RD(import.meta.url)),MD=JSON.parse(ND(AD($D,"side_effect_classifier.json"),"utf-8")),DD=CD(MD)});function _a(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
|
|
2226
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function V(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function CE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=
|
|
2225
|
+
`),n=null;for(let r=0;r<e.length;r+=1){let s=Iu(e[r]),i=bu.exec(s);if(i===null)continue;let o=i[1].trim();if(ku.test(o))continue;let a=TE(o);if(a===null||!kr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var SD,bD,bu,ku,kD,ID,Nu=w(()=>{"use strict";Is();SD=/^#{1,6}\s+/,bD=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,bu=/^STANCE:\s+(.+)$/,ku=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,kD=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,ID=/^[A-Za-z0-9_-]+/});function SE(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var bE=w(()=>{"use strict"});import{readFileSync as ND}from"node:fs";import{dirname as xD,join as AD}from"node:path";import{fileURLToPath as RD}from"node:url";function CD(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function jD(t){let e=[],n=[];for(let r of t)LD.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function PD(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&OD.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function FD(t,e){if(t.length===0)return{matched:!1};let n=jD(t);for(let r of n){let s=PD(r,e);if(s.matched)return s}return{matched:!1}}function xu(t){return FD(t,DD)}function UD(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Au(t){return UD(t).split(" ").filter(e=>e.length>0)}var LD,OD,$D,MD,DD,kE=w(()=>{"use strict";LD=new Set(["&&","||",";","|",">",">>","<","<<"]),OD=/^[A-Za-z_][A-Za-z0-9_]*=/;$D=xD(RD(import.meta.url)),MD=JSON.parse(ND(AD($D,"side_effect_classifier.json"),"utf-8")),DD=CD(MD)});function _a(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 nr(Ru(t)??t,_a(e))===!0}catch{return!1}}async function ha(t,e){try{return await nr(Ru(t)??t,_a(e))}catch{return}}async function NE(t,e){if(typeof t!="string")return t;let n=Ru(t);if(n===null)return t;try{return await nr(n,_a(e))}catch{return}}async function xE(t,e){let n=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return t;let r="",s=0;for(let i of n){let o=i.index??0;r+=t.slice(s,o);let a=i[1]?.trim()??"";try{r+=WD(await nr(a,_a(e)))}catch{r+=""}s=o+i[0].length}return r+=t.slice(s),r}function Ru(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function WD(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Qs=w(()=>{"use strict";Hs()});import{existsSync as AE,readdirSync as RE,readFileSync as qD,statSync as LE}from"node:fs";import{join as ya}from"node:path";function OE(t,e,n,r){return Object.assign(t,{stateId:e,state:n,displayName:r})}function G(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function mt(t,e,n,r,s={}){let i=D(),o=G(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ei}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=kr(n)?"generic":"unhandled";return t.dal.raiseAttention({kind:zi,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:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:BD(s.agent_output??r),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function BD(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
2226
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function V(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function CE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=On(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(t,e,n){let r=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 n;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=On(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=On(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=HD(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return xE(r,e)}function HD(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function On(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 ti(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=SE(e.dal,e.run_id,()=>i),c=Lu(e,n),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let E=Au(y.summary),S=xu(E);S.matched&&!c&&(d.violation={summary:y.summary,kind:S.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=y=>{u(y),XD(y,(E,S)=>{m+=E,p+=S})},h=await xo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:_});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Qe(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:h.ms})}),JD(e.project,e.dal,f);let g=d.violation;return g!==null?{kind:"g3_violation",summary:g.summary,violationKind:g.kind}:!a&&e.project.local_path.trim().length>0&&Ou(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:h.text,ms:h.ms,argv:h.argv}}function XD(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=ga(s.input_tokens),a=ga(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=ga(i.input_tokens),a=ga(i.output_tokens);(o>0||a>0)&&e(o,a)}}function ga(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function cn(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=G(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} 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 ti({context:t,stateId:s,member:n,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 c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"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 Hr(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let d=G(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(N_(s)),l!=null&&l.length>0&&u.push(l);let f=n.prompt_template!==void 0?await ot(n.prompt_template,t,e):"";f.length>0&&u.push(f),r!==null&&r.length>0&&u.push(r);let m=u.join(`
|
|
2227
2227
|
|
|
2228
2228
|
`);try{let p=await ti({context:t,stateId:e,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let h=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:d.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(d.id,null,h),{outcome:null,text:"",status_detail:h}}if(t.dal.insertStepArtifact({step_id:d.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=Zs(p.text,s);return t.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(t.outcomes[e]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Ae?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function Xr(t,e){return(e?.length??0)>0?EE(t.project.local_path,e):null}function $E(t){return xu(Au(t))}function Lu(t,e){let n=t.dal.query(`SELECT state_name, outcome FROM step
|
|
2229
2229
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
@@ -2233,26 +2233,26 @@ ${m}`:null).filter(m=>m!==null).join(`
|
|
|
2233
2233
|
|
|
2234
2234
|
`),c=`${r}:consolidator`,d=await Hr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,d.outcome===null||d.outcome==="error"){t.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&V(t,n,r,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??r;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),t.dal.finishStep(u.id,"ok","consolidated"),V(t,n,r,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await cn(t,r,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var UE,WE=w(()=>{"use strict";tt();UE={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=>zD(t,t.state)}});async function ZD(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await ha(e.items_from,t),a=nj(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?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await ej(t,e,s.id,a,l):await QD(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 d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(t.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),V(t,n,r,u),d){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function QD(t,e,n,r,s){let i=[];for(let o=0;o<r.length;o+=1){let a=await BE(t,e,n,r[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 ej(t,e,n,r,s){let i=new Array(r.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,r.length)},async()=>{for(;o<r.length&&s.routed===null;){let l=o;o+=1,i[l]=await BE(t,e,n,r[l],l,s)}});return await Promise.all(a),i}async function BE(t,e,n,r,s,i){let o=t.iteration;t.iteration={item:r,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:r}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:n,iteration:{item:r,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":tj(t.outcomes[a]);return t.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:r,outcome:d}}),{index:s,value:r,outcome:d}}function tj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function nj(t){if(!Array.isArray(t))return null;let e=[];for(let n of t)if(typeof n=="string")e.push(n);else if(typeof n=="number"||typeof n=="boolean")e.push(String(n));else return null;return e}var qE,HE=w(()=>{"use strict";tt();Qs();qE={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=>ZD(t,t.state)}});async function rj(t,e){let n=t.stateId,r=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=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let o=Xr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,n);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),V(t,n,r,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ti({context:t,stateId:r,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:r,kind:m.violationKind,command_summary:m.summary,message:`State ${r} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),V(t,n,r,"done"),e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(XE({context:t,state:e,stateId:n,displayName:r,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ae?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:n,status:"waiting_agent"}),d=await ot(e.agent.initial_prompt_template,t,r),u=o?`${o}
|
|
2235
2235
|
|
|
2236
|
-
${d}`:d;try{let f=await ti({context:t,stateId:r,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:r,kind:f.violationKind,command_summary:f.summary,message:`State ${r} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(XE({context:t,state:e,stateId:n,displayName:r,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ae?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function XE(t){let{context:e,state:n,stateId:r,displayName:s,stepId:i,agentText:o}=t,a=D();e.dal.setRunPausedState(e.run_id,`${ei}${r}`,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(sj({context:e,stateId:s,state:n,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function sj(t){let{context:e,stateId:n,state:r,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=ij(e,n),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:n,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:oj(i,3),paused_at:o,created_run_inputs:
|
|
2236
|
+
${d}`:d;try{let f=await ti({context:t,stateId:r,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:r,kind:f.violationKind,command_summary:f.summary,message:`State ${r} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(XE({context:t,state:e,stateId:n,displayName:r,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ae?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function XE(t){let{context:e,state:n,stateId:r,displayName:s,stepId:i,agentText:o}=t,a=D();e.dal.setRunPausedState(e.run_id,`${ei}${r}`,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(sj({context:e,stateId:s,state:n,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function sj(t){let{context:e,stateId:n,state:r,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=ij(e,n),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:n,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:oj(i,3),paused_at:o,created_run_inputs:On(e.job.payload)}}function ij(t,e){let n=[],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&&n.unshift(o.current_state),s=o.parent_run_id}return n.push(e),n}function oj(t,e){if(typeof t!="string"||t.length===0)return[];let n=t.split(/\r?\n/);return(n.length>0&&n[n.length-1]===""?n.slice(0,-1):n).slice(-e)}var JE,GE=w(()=>{"use strict";Ao();tt();JE={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=>rj(t,t.state)}});async function aj(t,e){let n=t.stateId,r=t.displayName,s=CE(t,e.over);if(s===null){let u=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let u=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(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=`${r}[${u}]`,p=t.iteration;t.iteration={item:f,index:u};let _;try{_=await t.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{t.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let h=lj(t.outcomes[m]);if(a.push({index:u,value:f,outcome:h}),h===null&&e.stop_on_error){l=!0;break}}let c=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let d=l?"error":"ok";if(t.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),V(t,n,r,d),l){let u=e.outcomes.error;return u!==void 0?K(t.workflow,u):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function lj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var KE,VE=w(()=>{"use strict";tt();KE={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>aj(t,t.state)}});import{createHash as cj}from"node:crypto";import{existsSync as dj,mkdirSync as uj,readFileSync as fj,writeFileSync as mj}from"node:fs";import{dirname as pj,isAbsolute as zE,normalize as _j,resolve as ni}from"node:path";import{Document as hj,ExternalHyperlink as gj,HeadingLevel as Jr,LevelFormat as yj,Packer as Ej,Paragraph as It,Table as wj,TableCell as Tj,TableRow as vj,TextRun as Nt,WidthType as Sj}from"docx";import{marked as bj}from"marked";async function kj(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await Ij(t,e,r),o=await Nj(t,e),a=await xj(t,e.title),l=await Cj(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return uj(pj(o),{recursive:!0}),mj(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:cj("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),V(t,n,r,{output_path:o,path:o,bytes:l.length}),K(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),V(t,n,r,{error:o}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function Ij(t,e,n){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let r=(await ot(e.markdown_source,t,n)).trim(),i=(r.length===0?Oj(t,e.markdown_source):null)??r;if(i.length===0)throw new Error("markdown_source resolved empty");let o=Rj(t.project.local_path,i);if(o!==null){if(!dj(o))throw new Error(`markdown_source file not found: ${o}`);return Ea(fj(o,"utf8"))}return Ea(i)}async function Nj(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=Aj(t.project.local_path,n);if(!r.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${r}`);return r}async function xj(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function Aj(t,e){let n=ni(t);return _j(zE(e)?ni(e):ni(n,e))}function Rj(t,e){return Lj(e)?zE(e)?ni(e):ni(t,e):null}function Lj(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function Oj(t,e){let r=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(r===void 0)return null;let s=Object.entries(t.transcripts).filter(([o])=>o.startsWith(`${r}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return Ea(s);let i=t.dal.query(`SELECT sa.content
|
|
2237
2237
|
FROM step_artifact sa
|
|
2238
2238
|
JOIN step s ON s.id = sa.step_id
|
|
2239
2239
|
WHERE s.run_id = ?
|
|
2240
2240
|
AND s.state_name LIKE ?
|
|
2241
2241
|
AND sa.content IS NOT NULL
|
|
2242
2242
|
ORDER BY sa.id DESC
|
|
2243
|
-
LIMIT 1`,t.run_id,`${r}:coder[%`);return i[0]?.content===void 0?null:Ea(i[0].content)}function Ea(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function Cj(t,e){let n=QE(bj.lexer(t,{gfm:!0})),r=new hj({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:yj.DECIMAL,text:"%1."}]}]},sections:[{children:n.length===0?[new
|
|
2244
|
-
`).map(n=>new
|
|
2243
|
+
LIMIT 1`,t.run_id,`${r}:coder[%`);return i[0]?.content===void 0?null:Ea(i[0].content)}function Ea(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function Cj(t,e){let n=QE(bj.lexer(t,{gfm:!0})),r=new hj({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:yj.DECIMAL,text:"%1."}]}]},sections:[{children:n.length===0?[new It("")]:n}]});return Ej.toBuffer(r)}function QE(t){let e=[];for(let n of t)switch(n.type){case"space":break;case"heading":e.push(new It({heading:Uj(n.depth),children:$n(Cn(n))}));break;case"paragraph":e.push(new It({children:$n(Cn(n))}));break;case"text":e.push(new It({children:Cn(n).length===0?[new Nt(n.text)]:$n(Cn(n))}));break;case"blockquote":e.push(...QE(Cn(n)).map(r=>r instanceof It?r:new It({children:[new Nt(n.text)]})));break;case"list":jj(n)&&e.push(...$j(n));break;case"table":Pj(n)&&e.push(Mj(n));break;case"code":Fj(n)&&e.push(...Dj(n));break;case"hr":e.push(new It(""));break;case"html":n.text.trim().length>0&&e.push(new It({children:[new Nt(n.text)]}));break;default:break}return e}function $n(t,e){let n=[];for(let r of t)switch(r.type){case"text":case"escape":n.push(new Nt({text:r.text,...Cu(e)}));break;case"strong":n.push(...$n(Cn(r),{...e,bold:!0}));break;case"em":n.push(...$n(Cn(r),{...e,italics:!0}));break;case"codespan":n.push(new Nt({text:r.text,...Cu({...e,code:!0})}));break;case"link":n.push(new gj({link:r.href,children:$n(Cn(r),{...e})}));break;case"br":n.push(new Nt({text:"",break:1}));break;case"image":n.push(new Nt({text:`[image: ${r.text}]`,italics:!0}));break;case"del":n.push(new Nt({text:r.text,strike:!0}));break;default:n.push(new Nt({text:r.raw,...Cu(e)}));break}return n.length===0?[new Nt("")]:n}function Cu(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function $j(t){return t.items.map(e=>new It({children:$n(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:YE(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:YE(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function YE(t){return t.task?`[${t.checked?"x":" "}] `:""}function Mj(t){let e=[t.header,...t.rows].map(n=>new vj({children:n.map(r=>new Tj({children:[new It({children:$n(r.tokens,r.header?{bold:!0}:void 0)})]}))}));return new wj({width:{size:100,type:Sj.PERCENTAGE},rows:e})}function Dj(t){return t.text.split(`
|
|
2244
|
+
`).map(n=>new It({children:[new Nt({text:n.length===0?" ":n,font:"Courier New"})]}))}function Cn(t){let e=t.tokens;return Array.isArray(e)?e:[]}function jj(t){return t.type==="list"&&Array.isArray(t.items)}function Pj(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Fj(t){return t.type==="code"&&typeof t.text=="string"}function Uj(t){switch(t){case 1:return Jr.HEADING_1;case 2:return Jr.HEADING_2;case 3:return Jr.HEADING_3;case 4:return Jr.HEADING_4;case 5:return Jr.HEADING_5;default:return Jr.HEADING_6}}var ZE,ew=w(()=>{"use strict";tt();ZE={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=>kj(t,t.state)}});import{createHash as Wj}from"node:crypto";import{existsSync as qj,mkdirSync as Bj,readFileSync as tw,statSync as Hj}from"node:fs";import{dirname as Xj,isAbsolute as nw,normalize as Jj,resolve as ri}from"node:path";import{marked as Gj}from"marked";import Kj from"write-excel-file/node";async function Vj(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await Yj(t,e),o=zj(e.input_format),a=await Zj(t,e),l=await Qj(t,e.title),c=o==="markdown"?lP(i):rP(i);await cP({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let d=Hj(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=Wj("sha256").update(tw(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}`),V(t,n,r,{output_path:a,path:a,bytes:d}),K(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),V(t,n,r,{error:o}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function Yj(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let n=(await ot(e.source,t,t.stateId)).trim(),r=tP(t.project.local_path,n);if(r!==null){if(!qj(r))throw new Error(`source file not found: ${r}`);return tw(r,"utf8")}return n}function zj(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function Zj(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=eP(t.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function Qj(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function eP(t,e){let n=ri(t);return Jj(nw(e)?ri(e):ri(n,e))}function tP(t,e){return nP(e)?nw(e)?ri(e):ri(t,e):null}function nP(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function rP(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!wa(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((n,r)=>sP(n,r))}function sP(t,e){if(!wa(t))throw new Error(`sheets[${e}] must be an object`);let n=iP(t.headers,`sheets[${e}].headers`),r=oP(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:n,rows:r,headerStyle:aP(t.styles)}}function iP(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))throw new Error(`${e} must be an array of strings`);return t}function oP(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${e}[${r}] must be an array`);return n.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${r}][${i}] must be string, number, boolean, or null`)})})}function aP(t){if(!wa(t)||!wa(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 lP(t){let e=Gj.lexer(t,{gfm:!0}),n=[],r=null;for(let s of e){if(hP(s)){r=s.text;continue}gP(s)&&(n.push({name:r??`Sheet${n.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),r=null)}return n}async function cP(t){Bj(Xj(t.outputPath),{recursive:!0});let e=new Set,n=t.sheets.map(r=>({sheet:mP(r.name,e),data:dP(r),columns:fP(r)}));await Kj(n).toFile(t.outputPath)}function dP(t){let e=[];if(t.headers.length>0){let n=_P(t.headerStyle?.fill);e.push(t.headers.map(r=>({value:r,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of t.rows)e.push(n.map(uP));return e.length===0?[[{}]]:e}function uP(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 fP(t){let e=Math.max(t.headers.length,...t.rows.map(r=>r.length),1),n=[];for(let r=1;r<=e;r+=1){let s=[t.headers[r-1],...t.rows.map(o=>o[r-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));n.push({width:i})}return n}function mP(t,e){let n=pP(t),r=n,s=2;for(;e.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return e.add(r.toLowerCase()),r}function pP(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function _P(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 hP(t){return t.type==="heading"&&typeof t.text=="string"}function gP(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function wa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var rw,sw=w(()=>{"use strict";tt();rw={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=>Vj(t,t.state)}});import{spawnSync as yP}from"node:child_process";async function wP(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(yP("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),V(t,n,r,"fail_pre_check");let _=e.outcomes.fail_pre_check;return _!==void 0?K(t.workflow,_):{kind:"terminal",terminal:ee(t.workflow)}}let i=Xr(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${r}:coder[${f}]`,p=await Hr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
2245
2245
|
${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let h=vE(p.text);if(h!==null){let g=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${h.token}`),{kind:"escalate",token:h.token,reason:h.reason.length>0?`${h.token}: ${h.reason}`:h.token}}}if(p.outcome===null){let h=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(h.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 b=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(b.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let S=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(S.id,E.outcome,"outcomes_from_stance"),V(t,n,r,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let h=Zs(p.text,EP);if(h.outcome!==null){let y=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(y.id,h.outcome,"default_failure_stance"),V(t,n,r,h.outcome),{kind:"escalate",token:h.outcome,reason:`failure_stance:${h.outcome}`}}let g=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve","no_reviewers"),V(t,n,r,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await cn(t,r,y,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let _=await Promise.all(o.map(h=>Hr(t,`${r}:reviewer_${h.alias}[${f}]`,h,`CODER OUTPUT:
|
|
2246
2246
|
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(_.every(h=>h.outcome==="approve")){let h=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(h.id,"approve",`loop=${f}`),V(t,n,r,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await cn(t,r,g,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=_.filter(h=>h.outcome==="request_changes").map(h=>h.text).join(`
|
|
2247
2247
|
|
|
2248
|
-
`),e.loop_feedback_artifact!==void 0){let h=G(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(h.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:h.id,kind:e.loop_feedback_artifact,content:a})}}let d=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(d.id,"max_loops_exceeded",`loops=${e.max_loops}`),V(t,n,r,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?K(t.workflow,u):{kind:"terminal",terminal:ee(t.workflow)}}var EP,iw,ow=w(()=>{"use strict";Nu();tt();EP=["blocked","failed","aborted"],iw={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=>wP(t,t.state)}});import{spawnSync as TP}from"node:child_process";async function vP(t,e){let n=t.stateId,r=t.displayName,s=await ot(e.command,t,r),i=Lu(t,r),o=$E(s);if(o.matched&&!i){let _=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=TP("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:r,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(d.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ou(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:r,message:`ShellStep ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let _=c.stdout??"";t.dal.insertStepArtifact({step_id:d.id,kind:e.capture_output_to,content:_})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(d.id,m,`exit=${c.status}`),V(t,n,r,m),K(t.workflow,p))}var aw,lw=w(()=>{"use strict";tt();aw={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=>vP(t,t.state)}});async function SP(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});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:ee(t.workflow)};let o=Tt(i.definition),a=await bP(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 c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};V(t,n,r,kP(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=e.outcomes[c]??e.outcomes.default;return d===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,d)}async function bP(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await NE(s,t);n[r]=i===s?await ha(s,t):i}return n}function kP(t,e,n){let r={};for(let s of n)r[s.name]=IP(t,e,s);return r}function IP(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=NP(s,n.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,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function NP(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 cw,dw=w(()=>{"use strict";Js();tt();Qs();cw={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=>SP(t,t.state)}});function xP(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),V(t,n,r,s),{kind:"terminal",terminal:s}}var uw,fw=w(()=>{"use strict";tt();uw={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=>xP(t,t.state)}});async function AP(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);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=RP(t.cursor),a=i.filter(LP).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function RP(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function LP(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 mw,pw=w(()=>{"use strict";mw={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=>AP(t)}});async function OP(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var _w,hw=w(()=>{"use strict";_w={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=>OP(t)}});function gw(t){t.register(DE),t.register(iw),t.register(UE),t.register(JE),t.register(KE),t.register(ZE),t.register(rw),t.register(aw),t.register(PE),t.register(qE),t.register(cw),t.register(uw),t.register(_w),t.register(mw)}var yw=w(()=>{"use strict";jE();FE();WE();HE();GE();VE();ew();sw();ow();lw();dw();fw();pw();hw()});function Ew(){return Ta===null&&(Ta=new $u,gw(Ta)),Ta}var CP,$u,Ta,ww=w(()=>{"use strict";yw();CP={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"},$u=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:CP[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},Ta=null});async function Sw(t){xw(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 n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=MP(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=si(r)?r.entry_step_id:r.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=r.requires,l=_E(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.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 c=new Map(t.members.map(m=>[m.alias,m]));if(si(r)){let m=Mu({dal:t.dal,workflow:Sa(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Ln(t.job.payload)??{},team_id:t.team.id}),p=await kw(r,m,o.current_state??r.entry_step_id);return vw(t.dal,n.id,o.id,r.name,p),p}let d=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Mu({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:d,inputs:Ln(t.job.payload)??{},team_id:t.team.id}),f=await bw(u,o.current_state??r.start_at);return vw(t.dal,n.id,o.id,r.name,f),f}function vw(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=t.getRun(n);if(d!==null){let u=t.getWorkflow(d.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 h of f.steps)if(h.type==="lmctl/terminal"&&h.parameters!==null&&typeof h.parameters=="object"){let g=h.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let h=_;(h.on_unhandled_failure!==void 0||h.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",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function Mu(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(n,r,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 Du(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{xw(r);let i=si(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=Mu({dal:t.dal,workflow:si(r)?Sa(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return si(r)?kw(r,a,o.current_state??r.entry_step_id):bw(a,o.current_state??r.start_at)}};return e}async function bw(t,e){let n=e;if(n.startsWith(ei))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return dn(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=va(t,ee(t.workflow));if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return mt(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}let o,a=Nw(t,n);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),V(t,n,n,a),a===ks)return dn(t,cc);let c=i.outcomes?.[a];o=c!==void 0?K(t.workflow,c):mt(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await Du(t,n,i);if(o.kind==="paused")return Ye(t);if(o.kind==="escalate")return mt(t,{id:n,name:n,type:i.type},o.token,o.reason),Ye(t);if(o.kind==="terminal"){let l=va(t,o.terminal);if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return mt(t,{id:n,name:n,type:i.type},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}n=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 r=va(t,ee(t.workflow));return r.kind==="terminal"?dn(t,r.terminal):dn(t,ee(t.workflow))}async function kw(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return mt(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ye(e);let l=Nw(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),V(e,a.id,a.name,l),l===ks)return dn(e,cc);let p=Object.keys(t.connections[a.id]??{}),_=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return mt(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}),Ye(e);i=_;continue}let c=await $P(e,t,a);if(c.kind==="paused")return Ye(e);let d=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return mt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Ye(e);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Sa(t,a);try{let p=va(e,u);if(p.kind==="paused")return Ye(e);if(p.kind==="escalate")return mt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ye(e);if(p.kind==="terminal")return dn(e,p.terminal);let _=s.get(p.state);if(_===void 0)return mt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ye(e);i=_.id;continue}finally{e.workflow=m}}if(kr(u))return mt(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ye(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 mt(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ye(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})}),dn(e,"aborted")}async function $P(t,e,n){let r=Iw(e,n),s=t.workflow;t.workflow=Sa(e,n);try{return await Du(t,n.id,r,n.name)}finally{t.workflow=s}}function Iw(t,e){let n=e.parameters,r=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",...n,coder:r.coder,reviewers:r.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",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,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",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function Du(t,e,n,r){let s=Ew().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.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?PP(t,s):void 0,t.progress_step_id=null;try{return await s.execute(OE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function MP(t,e){try{let n=JSON.parse(t);if(jP(n)&&n.definition_schema_version===3)return qt.parse(n)}catch{return e}return e}function si(t){return t.definition_schema_version===3}function Sa(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.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"&&(r[e.parameters.name]={kind:DP(e.parameters.kind)}),r.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:r,...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 DP(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jP(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PP(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function dn(t,e){t.dal.setRunTerminalState(t.run_id,e);try{uE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ye(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Nw(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);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 va(t,e){if(!FP(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&UP(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function FP(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function UP(t,e,n){let r=WP(t),s=n.capture_evidence&&r!==null?qP(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.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:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function WP(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 qP(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(r=>r.path)}function xw(t){if(!Tw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Tw.join(", ")}`)}var Tw,Aw=w(()=>{"use strict";Ur();fE();hE();tt();ww();Is();Tw=[1,2,3]});import{readFileSync as BP,readdirSync as HP}from"node:fs";import{basename as XP,join as JP,resolve as GP}from"node:path";function Ow(t={}){let e=GP(t.workflowsDir??"workflows"),n=HP(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>KP(JP(e,r)))}}function KP(t){let e=XP(t);try{let n=BP(t,"utf8"),r=Tt(n);return Mw(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Dw(n)}}}function Cw(t,e){try{let n=Tt(e);return Mw(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Dw(n)}}}function $w(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 n=t.rows.filter(i=>i.status==="PASS").length,r=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: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
2248
|
+
`),e.loop_feedback_artifact!==void 0){let h=G(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(h.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:h.id,kind:e.loop_feedback_artifact,content:a})}}let d=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(d.id,"max_loops_exceeded",`loops=${e.max_loops}`),V(t,n,r,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?K(t.workflow,u):{kind:"terminal",terminal:ee(t.workflow)}}var EP,iw,ow=w(()=>{"use strict";Nu();tt();EP=["blocked","failed","aborted"],iw={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=>wP(t,t.state)}});import{spawnSync as TP}from"node:child_process";async function vP(t,e){let n=t.stateId,r=t.displayName,s=await ot(e.command,t,r),i=Lu(t,r),o=$E(s);if(o.matched&&!i){let _=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=TP("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:r,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(d.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ou(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:r,message:`ShellStep ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let _=c.stdout??"";t.dal.insertStepArtifact({step_id:d.id,kind:e.capture_output_to,content:_})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(d.id,m,`exit=${c.status}`),V(t,n,r,m),K(t.workflow,p))}var aw,lw=w(()=>{"use strict";tt();aw={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=>vP(t,t.state)}});async function SP(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});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:ee(t.workflow)};let o=vt(i.definition),a=await bP(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 c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};V(t,n,r,kP(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=e.outcomes[c]??e.outcomes.default;return d===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,d)}async function bP(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await NE(s,t);n[r]=i===s?await ha(s,t):i}return n}function kP(t,e,n){let r={};for(let s of n)r[s.name]=IP(t,e,s);return r}function IP(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=NP(s,n.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,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function NP(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 cw,dw=w(()=>{"use strict";Js();tt();Qs();cw={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=>SP(t,t.state)}});function xP(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),V(t,n,r,s),{kind:"terminal",terminal:s}}var uw,fw=w(()=>{"use strict";tt();uw={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=>xP(t,t.state)}});async function AP(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);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=RP(t.cursor),a=i.filter(LP).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function RP(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function LP(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 mw,pw=w(()=>{"use strict";mw={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=>AP(t)}});async function OP(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var _w,hw=w(()=>{"use strict";_w={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=>OP(t)}});function gw(t){t.register(DE),t.register(iw),t.register(UE),t.register(JE),t.register(KE),t.register(ZE),t.register(rw),t.register(aw),t.register(PE),t.register(qE),t.register(cw),t.register(uw),t.register(_w),t.register(mw)}var yw=w(()=>{"use strict";jE();FE();WE();HE();GE();VE();ew();sw();ow();lw();dw();fw();pw();hw()});function Ew(){return Ta===null&&(Ta=new $u,gw(Ta)),Ta}var CP,$u,Ta,ww=w(()=>{"use strict";yw();CP={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"},$u=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:CP[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},Ta=null});async function Sw(t){xw(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 n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=MP(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=si(r)?r.entry_step_id:r.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=r.requires,l=_E(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.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 c=new Map(t.members.map(m=>[m.alias,m]));if(si(r)){let m=Mu({dal:t.dal,workflow:Sa(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:On(t.job.payload)??{},team_id:t.team.id}),p=await kw(r,m,o.current_state??r.entry_step_id);return vw(t.dal,n.id,o.id,r.name,p),p}let d=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Mu({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:d,inputs:On(t.job.payload)??{},team_id:t.team.id}),f=await bw(u,o.current_state??r.start_at);return vw(t.dal,n.id,o.id,r.name,f),f}function vw(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=t.getRun(n);if(d!==null){let u=t.getWorkflow(d.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 h of f.steps)if(h.type==="lmctl/terminal"&&h.parameters!==null&&typeof h.parameters=="object"){let g=h.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let h=_;(h.on_unhandled_failure!==void 0||h.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",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function Mu(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(n,r,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 Du(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{xw(r);let i=si(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=Mu({dal:t.dal,workflow:si(r)?Sa(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return si(r)?kw(r,a,o.current_state??r.entry_step_id):bw(a,o.current_state??r.start_at)}};return e}async function bw(t,e){let n=e;if(n.startsWith(ei))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return dn(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=va(t,ee(t.workflow));if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return mt(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}let o,a=Nw(t,n);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),V(t,n,n,a),a===ks)return dn(t,cc);let c=i.outcomes?.[a];o=c!==void 0?K(t.workflow,c):mt(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await Du(t,n,i);if(o.kind==="paused")return Ye(t);if(o.kind==="escalate")return mt(t,{id:n,name:n,type:i.type},o.token,o.reason),Ye(t);if(o.kind==="terminal"){let l=va(t,o.terminal);if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return mt(t,{id:n,name:n,type:i.type},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}n=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 r=va(t,ee(t.workflow));return r.kind==="terminal"?dn(t,r.terminal):dn(t,ee(t.workflow))}async function kw(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return mt(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ye(e);let l=Nw(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),V(e,a.id,a.name,l),l===ks)return dn(e,cc);let p=Object.keys(t.connections[a.id]??{}),_=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return mt(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}),Ye(e);i=_;continue}let c=await $P(e,t,a);if(c.kind==="paused")return Ye(e);let d=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return mt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Ye(e);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Sa(t,a);try{let p=va(e,u);if(p.kind==="paused")return Ye(e);if(p.kind==="escalate")return mt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ye(e);if(p.kind==="terminal")return dn(e,p.terminal);let _=s.get(p.state);if(_===void 0)return mt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ye(e);i=_.id;continue}finally{e.workflow=m}}if(kr(u))return mt(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ye(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 mt(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ye(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})}),dn(e,"aborted")}async function $P(t,e,n){let r=Iw(e,n),s=t.workflow;t.workflow=Sa(e,n);try{return await Du(t,n.id,r,n.name)}finally{t.workflow=s}}function Iw(t,e){let n=e.parameters,r=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",...n,coder:r.coder,reviewers:r.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",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,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",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function Du(t,e,n,r){let s=Ew().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.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?PP(t,s):void 0,t.progress_step_id=null;try{return await s.execute(OE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function MP(t,e){try{let n=JSON.parse(t);if(jP(n)&&n.definition_schema_version===3)return qt.parse(n)}catch{return e}return e}function si(t){return t.definition_schema_version===3}function Sa(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.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"&&(r[e.parameters.name]={kind:DP(e.parameters.kind)}),r.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:r,...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 DP(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jP(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PP(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function dn(t,e){t.dal.setRunTerminalState(t.run_id,e);try{uE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ye(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Nw(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);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 va(t,e){if(!FP(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&UP(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function FP(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function UP(t,e,n){let r=WP(t),s=n.capture_evidence&&r!==null?qP(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.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:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function WP(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 qP(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(r=>r.path)}function xw(t){if(!Tw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Tw.join(", ")}`)}var Tw,Aw=w(()=>{"use strict";Ur();fE();hE();tt();ww();Is();Tw=[1,2,3]});import{readFileSync as BP,readdirSync as HP}from"node:fs";import{basename as XP,join as JP,resolve as GP}from"node:path";function Ow(t={}){let e=GP(t.workflowsDir??"workflows"),n=HP(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>KP(JP(e,r)))}}function KP(t){let e=XP(t);try{let n=BP(t,"utf8"),r=vt(n);return Mw(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Dw(n)}}}function Cw(t,e){try{let n=vt(e);return Mw(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Dw(n)}}}function $w(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 n=t.rows.filter(i=>i.status==="PASS").length,r=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: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
2249
2249
|
`)}
|
|
2250
2250
|
`}function Mw(t,e){let n=YP(e),r=zP(e);if(n===null||r===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:n,first_step_type:r,first_step_disposition:null,note:"entry step missing after validation"};let s=VP(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:n,first_step_type:r,first_step_disposition:`needs_inputs:${r}`,note:`load ok; graph ok; entry step is ${n}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:n,first_step_type:r,first_step_disposition:`ready:${r}`,note:"load ok; graph ok; first step entered without inputs"}}function VP(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function YP(t){return ju(t)?t.entry_step_id:t.start_at}function zP(t){return ju(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ju(t){return t.definition_schema_version===3}function Dw(t){return t instanceof ln?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 jw(t){let e=new Set;if(ju(t))for(let n of t.steps){let r=n.members??{};Rw(r,e)}else for(let n of Object.values(t.states))Rw(n,e);return[...e].sort()}function Rw(t,e){let n=["coder","agent","consolidator"],r=["reviewers","researchers"];for(let s of n){let i=t[s],o=Lw(i);o!==null&&e.add(o)}for(let s of r){let i=t[s];if(Array.isArray(i))for(let o of i){let a=Lw(o);a!==null&&e.add(a)}}}function Lw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var ba=w(()=>{"use strict";Js()});function ZP({dal:t}){let e=t.listProjects();for(let n of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",n.id,ka)[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}=QP(t,n,o);if(a<20)continue;let c=o??"initial",d=`${ii}:${n.id}:${c}`;t.enqueueJob({project_id:n.id,source:ka,source_ref:ii,payload:JSON.stringify({kind:ii,project_id:n.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function QP(t,e,n){let r=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
2251
2251
|
FROM run r
|
|
2252
2252
|
JOIN job j ON j.id = r.job_id
|
|
2253
2253
|
WHERE j.project_id = ?
|
|
2254
2254
|
AND r.terminal_state IS NOT NULL
|
|
2255
|
-
${n!==null?"AND r.id > ?":""}`,...n!==null?[e.id,n]:[e.id]);return{count:r[0]?.cnt??0,maxRunId:r[0]?.max_id??0}}function Pw(t){for(let e of e1)try{e(t)}catch{}}var ka,ii,e1,Pu=w(()=>{"use strict";ka="memory_policy",ii="memory_consolidation_request";e1=[ZP]});var Hw={};me(Hw,{getOrInsertConsolidationWorkflow:()=>Uw,runJobById:()=>i1,runOnce:()=>
|
|
2255
|
+
${n!==null?"AND r.id > ?":""}`,...n!==null?[e.id,n]:[e.id]);return{count:r[0]?.cnt??0,maxRunId:r[0]?.max_id??0}}function Pw(t){for(let e of e1)try{e(t)}catch{}}var ka,ii,e1,Pu=w(()=>{"use strict";ka="memory_policy",ii="memory_consolidation_request";e1=[ZP]});var Hw={};me(Hw,{getOrInsertConsolidationWorkflow:()=>Uw,runJobById:()=>i1,runOnce:()=>ir,startWorker:()=>o1});import{createHash as t1}from"node:crypto";import{readFileSync as n1}from"node:fs";import{pathToFileURL as r1}from"node:url";function Uw(t,e="durable-memory-consolidation-v2"){let n=t.getWorkflowByName(e);if(n!==null)return n;try{dE({swallow:!0});let r=pa(e);if(r===null)return null;let s=n1(r,"utf8"),i=vt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:r1(r).href,source_sha256:t1("sha256").update(s).digest("hex")})}catch{return null}}async function ir(t){let e=Date.now(),n=null;try{return n=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??Fw,evaluator:r=>qw(t.dal,r)}),n===null?null:await Ww(t.dal,n,e)}catch(r){if(n!==null)return Mn(t.dal,n,"worker_run_failed",sr(r),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ia(sr(r))})})}catch{}return null}finally{t.max_concurrent}}async function i1(t){let e=Date.now(),n=null;try{let r=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??Fw,evaluator:s=>qw(t.dal,s)});return r.claimed?(n=r.job,{claimed:!0,...await Ww(t.dal,n,e)}):r}catch(r){if(n!==null)return{claimed:!0,...Mn(t.dal,n,"worker_run_failed",sr(r),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ia(sr(r)),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,n){let r=t.getProjectByJob(e.id);if(r===null)return Mn(t,e,"worker_project_missing","project_not_found",n);let s=e.source===ka&&e.source_ref===ii,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=Uw(t):o=Bw(t,e,r),o===null)return Mn(t,e,"worker_workflow_missing","workflow_not_found",n,r);let a=t.getTeam(i?.team_id??r.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Mn(t,e,"worker_team_missing","team_not_found",n,r);let c;try{c=vt(o.definition)}catch(u){return Mn(t,e,"worker_workflow_invalid",sr(u),n,r)}let d=a1(c,l);if(d.length>0)return Mn(t,e,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,n,r,a);try{let u=await Sw({dal:t,job:e,workflow:c,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()-n}:(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()-n})}catch(u){return Mn(t,e,"worker_run_failed",sr(u),n,r,a)}}function qw(t,e){let n=t.getProjectByJob(e.id);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let r=Bw(t,e,n);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=vt(r.definition)}catch{s=null}return na({workflow:s,job:e,project:n})}function Bw(t,e,n){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name)}async function o1(t){let e=!1,n=null,r=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await ir(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ia(sr(i))})})}catch{}}e||(n=setTimeout(()=>{r=s()},t.poll_interval_ms??s1))}};return r=s(),{stop:async()=>{e=!0,n!==null&&clearTimeout(n),await r.catch(()=>{})}}}function Mn(t,e,n,r,s,i,o){let a=Ia(r);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:n,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 sr(t){return t instanceof Error?t.message:String(t)}function Ia(t){return t.length>4096?t.slice(0,4096):t}function a1(t,e){let n=jw(t);if(n.length===0)return[];let r=new Set(e.map(s=>s.alias));return n.filter(s=>!r.has(s))}var Fw,s1,Na=w(()=>{"use strict";vu();Aw();Js();ba();ru();Pu();Fw=6e5,s1=5e3});import{existsSync as l1,readFileSync as c1}from"node:fs";import{marked as d1}from"marked";function Kw(t,e){t.get("/layman",n=>n.html(Pe("Layman Home",u1(e.dal)))),t.get("/api/layman",n=>n.json(Zw(e.dal))),t.get("/layman/start/:workflow",n=>{let r=Gw(n);return r===null?n.notFound():n.html(Pe(`Start ${Gr(r)}`,p1(e.dal,r)))}),t.post("/layman/start/:workflow",async n=>{let r=Gw(n);return r===null?n.notFound():r==="newspaper"?Xw(n,e.dal):_1(n,e.dal,r)}),t.get("/layman/run/:id",n=>{let r=Qn(e.dal,xa(n,"id"));return r===null?n.notFound():n.html(Pe(`Run ${r.id}`,y1(e.dal,r)))}),t.get("/api/layman/run/:id",n=>{let r=Qn(e.dal,xa(n,"id"));return r===null?n.notFound():n.json(A1(e.dal,r))}),t.post("/layman/run/:id/respond",async n=>w1(n,e.dal)),t.get("/layman/newspaper",n=>n.html(Pe("Newspaper Subscriptions",N1(e.dal)))),t.post("/layman/newspaper",n=>Xw(n,e.dal)),t.delete("/layman/newspaper/:id",n=>Jw(n,e.dal)),t.post("/layman/newspaper/:id/delete",n=>Jw(n,e.dal))}function u1(t){let e=Zw(t);return`<section class="layman-home">
|
|
2256
2256
|
<h1>Welcome</h1>
|
|
2257
2257
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
2258
2258
|
<div class="grid">${Aa.map(f1).join("")}</div>
|
|
@@ -2280,7 +2280,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2280
2280
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
2281
2281
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
2282
2282
|
<button type="submit">Start Document Wizard</button>
|
|
2283
|
-
</form>`:zw(r,"/layman/start/newspaper")}function Vw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${v(e.id)}">${v(e.name)}</option>`).join("")}</select></label>`}async function _1(t,e,n){let r=await t.req.parseBody(),s=tT(e,r);if(s===null)return t.html(Pe("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=e.getWorkflowByName(n);if(i===null)return t.html(Pe("Start workflow",`<p class="error">${v(Gr(n))} is not loaded.</p>`),400);let o=n==="info-qa"?h1(r):g1(r);if(typeof o=="string")return t.html(Pe("Start workflow",`<p class="error">${v(o)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:n,dedupe_key:`layman:${n}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await
|
|
2283
|
+
</form>`:zw(r,"/layman/start/newspaper")}function Vw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${v(e.id)}">${v(e.name)}</option>`).join("")}</select></label>`}async function _1(t,e,n){let r=await t.req.parseBody(),s=tT(e,r);if(s===null)return t.html(Pe("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=e.getWorkflowByName(n);if(i===null)return t.html(Pe("Start workflow",`<p class="error">${v(Gr(n))} is not loaded.</p>`),400);let o=n==="info-qa"?h1(r):g1(r);if(typeof o=="string")return t.html(Pe("Start workflow",`<p class="error">${v(o)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:n,dedupe_key:`layman:${n}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await ir({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),d=l?.job_id===a.id?l.run_id:c?.run_id??null;return d===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${d}`,302)}function h1(t){let e=at(t.question).trim();if(e.length===0)return"Enter a question.";let n=at(t.output_path).trim();return{question:e,...n.length>0?{output_path:n}:{}}}function g1(t){let e=at(t.task_description).trim(),n=D1(at(t.slug).trim()),r=at(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":n.length===0?"Enter a document slug.":{task_description:e,slug:n,output_dir:r}}function y1(t,e){let n=e.workflow?.name??"unknown",r=`<h1>${v(Gr(n))}</h1>
|
|
2284
2284
|
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${r}${v1(t,e,n)}`;let s=eT(t,e);return s!==null&&s.status==="waiting_operator"?`${r}${E1(e,s)}`:`${r}<section hx-get="/layman/run/${v(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
2285
2285
|
<h2>Running</h2>
|
|
2286
2286
|
<p class="muted">Current stage: <strong>${v(e.current_state??"starting")}</strong></p>
|
|
@@ -2296,13 +2296,13 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2296
2296
|
<button type="submit" name="done" value="false">Send response</button>
|
|
2297
2297
|
<button type="submit" name="done" value="true">Done with this stage</button>
|
|
2298
2298
|
</form>
|
|
2299
|
-
</section>`}async function w1(t,e){let n=xa(t,"id"),r=await t.req.parseBody(),s=Number(at(r.step_id)),i=at(r.input),o=at(r.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?(T1(e,a.run.id),await
|
|
2299
|
+
</section>`}async function w1(t,e){let n=xa(t,"id"),r=await t.req.parseBody(),s=Number(at(r.step_id)),i=at(r.input),o=at(r.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?(T1(e,a.run.id),await ir({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${n}`,302)):t.html(Pe("Interactive response",`<p class="error">Could not submit response: ${v(a.reason)}</p>`),400)}function T1(t,e){let n=t.getRun(e);if(n===null||n.current_state===null)return;let r=t.getWorkflow(n.workflow_id);if(r!==null)try{let s=JSON.parse(r.definition);if(!Uu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Uu(o)&&o.name===n.current_state&&typeof o.id=="string");Uu(i)&&typeof i.id=="string"&&t.setRunCurrentState(n.id,i.id)}catch{return}}function v1(t,e,n){let r=C1(e.terminal_state);return`<section class="metric terminal-run">
|
|
2300
2300
|
<h2>${r?"Complete":"Stopped"}</h2>
|
|
2301
2301
|
<p>Status: <strong>${v(e.terminal_state)}</strong></p>
|
|
2302
2302
|
${r?S1(t,e,n):k1(e)}
|
|
2303
2303
|
<h2>Stage Log</h2>
|
|
2304
2304
|
${Yw(e)}
|
|
2305
|
-
</section>`}function S1(t,e,n){if(n==="info-qa"){let r=qu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Bu(r??"No answer artifact was recorded yet.")}</div>`}if(n==="document-creation")return b1(t,e);if(n==="newspaper"){let r=qu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Bu(r??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function b1(t,e){let n=
|
|
2305
|
+
</section>`}function S1(t,e,n){if(n==="info-qa"){let r=qu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Bu(r??"No answer artifact was recorded yet.")}</div>`}if(n==="document-creation")return b1(t,e);if(n==="newspaper"){let r=qu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Bu(r??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function b1(t,e){let n=er(t,e.id),r=Fu(n,["render_docx"]),s=Fu(n,["render_xlsx"]),i=qu(e,["review:coder[0]_transcript","chat_output_md"])??I1(Fu(n,["document_md","markdown"])),o=[r,s].filter(a=>a!==null).map(a=>`<li><a href="file://${v(a)}">${v(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
|
|
2306
2306
|
<pre>${v(M1($1(i??"No preview available."),30))}</pre>
|
|
2307
2307
|
<h3>Downloads</h3>
|
|
2308
2308
|
${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function k1(t){let e=[...t.steps].reverse().find(n=>n.status_detail!==null);return`<p class="error">${v(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function qu(t,e){for(let n of[...t.steps].reverse())for(let r of e){let s=[...n.artifacts].reverse().find(i=>i.kind===r&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Fu(t,e){for(let n of[...t].reverse())if(e.includes(n.kind)&&n.path!==null)return n.path;return null}function I1(t){if(t===null||!l1(t)||!t.endsWith(".md"))return null;try{return c1(t,"utf8")}catch{return null}}function N1(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
|
|
@@ -2331,7 +2331,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2331
2331
|
WHERE w.name = ?
|
|
2332
2332
|
ORDER BY pw.id DESC`,"newspaper")}function eT(t,e){for(let n of[...e.steps].reverse()){let r=t.getInteractiveSessionByStepId(n.id);if(r!==null)return r}return null}function tT(t,e){let n=Number(at(e.project_id));return Number.isInteger(n)?t.getProject(n):null}function L1(t){let e=at(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:at(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Gw(t){let e=t.req.param("workflow");return Wu.includes(e)?e:null}function Gr(t){return Aa.find(e=>e.name===t)?.title??t}function O1(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Bu(t){return d1.parse(t,{async:!1})}function C1(t){return t==="done"||t==="pr_ready"||t==="merged"}function $1(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function M1(t,e){return t.split(`
|
|
2333
2333
|
`).slice(0,e).join(`
|
|
2334
|
-
`)}function D1(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function at(t){return typeof t=="string"?t:""}function j1(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 Uu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xa(t,e){return Number(t.req.param(e))}var Aa,Wu,nT=w(()=>{"use strict";Na();on();gu();Aa=[{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."}],Wu=Aa.map(t=>t.name)});function F1(t){return t.replace(/^\/+/,"")}function rT(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Kr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=F1(t.mailboxKey),n=e.lastIndexOf("/");return(n>=0?e.slice(n+1):e).includes(".")&&(e=n>=0?e.slice(0,n+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return rT(t.userId)&&rT(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${P1}/${t.identityId}/`}function W1(t){return String(Math.max(0,Math.floor(t))).padStart(U1,"0")}function Hu(t,e,n){return`${t}${e}${W1(n)}.json`}function Ra(t,e){return`${t}${e}`}function La(t,e,n){let r=`${e}${n}`;if(!t.startsWith(r))return;let s=t.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var P1,U1,Oa=w(()=>{"use strict";P1="mailbox";U1=12});function un(t,e){let n=Math.floor(t),r="",s=n;for(let d=0;d<12;d++)r=Ca[s&15]+r,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Ca[a&15]+o,a=a>>4;let l=Ca[8|Math.floor(e()*4)&3],c="";for(let d=0;d<15;d++)c+=Ca[Math.floor(e()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ca,$a=w(()=>{"use strict";Ca="0123456789abcdef"});function Ju(t,e){return!Number.isFinite(t)||t<=0?e:t}function Gu(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 lT(t){return t.conversation_id===aT&&H1(t.payload)}function H1(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function X1(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:lT(t)?t.timestamp:void 0;if(e===void 0)return;let n=Date.parse(e);return Number.isFinite(n)?n:void 0}var sT,iT,oT,q1,aT,B1,Xu,ir,Ma=w(()=>{"use strict";Oa();$a();sT=3e3,iT=1e4,oT=12e3,q1=1e3,aT="__lmctl_heartbeat__",B1={kind:"heartbeat"},Xu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},ir=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=Kr({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=Ju(e.readIntervalMs??e.pollIntervalMs??sT,sT),this.heartbeatIdleMs=Ju(e.heartbeatIdleMs??iT,iT),this.backoffReadIntervalMs=Ju(e.backoffReadIntervalMs??e.pollIntervalMs??oT,oT)}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??Xu;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 n=Ra(this.basePrefix,e),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:q1,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=La(o.Key??"",this.basePrefix,e);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(e,n){let r=this.writeChain.then(()=>this.doPut(e,n));return this.writeChain=r.catch(()=>{}),r}async doPut(e,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:un(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:n},o=(this.ownSeq??0)+1,a=Hu(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(r),a}scheduleNextTick(e){if(this.stopRequested)return;let n=this.opts.timers??Xu;this.timerHandle=n.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,n=Hu(this.basePrefix,this.peerStream,e),r;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:n}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${n}: empty body`),"get"),this.advanceCursor(e);continue}r=await i.Body.transformToString("utf-8")}catch(i){if(Gu(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(r)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),lT(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 n=X1(e);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let n=this.opts.timers??Xu;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.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 n=e-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(aT,B1)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(n){this.emitError(n,"handle")}}emitError(e,n){if(this.opts.onError!==void 0)try{this.opts.onError(e,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,e)}}});import{getConnInfo as J1}from"@hono/node-server/conninfo";function cT(t,e){let n=e.bucket??G1,r=e.remoteAddressOf??(i=>V1(i)),s=i=>{let o=r(i);return Y1(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=Ku(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:n,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Gu(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Vu(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ku(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:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Vu(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Ku(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=K1(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));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:Vu(u)},500)}})}function Ku(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let n=t.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function K1(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function V1(t){try{return J1(t).remote.address}catch{return}}function Y1(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Vu(t){return t instanceof Error?t.message:String(t)}var G1,dT=w(()=>{"use strict";Ma();G1="local"});function uT(t,e){t.get("/mailbox/workspace",n=>Q1(n,e)),t.get("/mailbox/projects",n=>eF(n,e)),t.get("/mailbox/projects/:id",n=>tF(n,e)),t.post("/mailbox/projects",n=>nF(n,e)),t.patch("/mailbox/projects/:id",n=>rF(n,e)),t.delete("/mailbox/projects/:id",n=>sF(n,e)),t.post("/mailbox/projects/:project_id/prompts",n=>iF(n,e)),t.get("/mailbox/prompts/:id",n=>oF(n,e))}function Q1(t,e){e.dal.ensureWorkspace({id:Yr,name:Yu});let n=fT(e.dal),r={id:Yr,name:Yu,created_at:Z1,projects:n};return t.json({workspace:r})}function eF(t,e){return t.json({projects:fT(e.dal)})}function tF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Vr)){let s=zu(e.dal,n);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Pa(s)})}let r=pT(e.dal,n);return r===null?t.json({project:null},404):t.json({project:mT(r)})}async function nF(t,e){let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Yr,name:Yu});let s=e.dal.insertWebProject({workspace_id:Yr,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return t.json({project:Pa(s)},201)}async function rF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(Vr)){let i=zu(e.dal,n);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${n}`},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: ${n}`},404):t.json({project:Pa(o)})}return t.json({error:"project_not_found",message:`project not found: ${n}`},404)}function sF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Vr)){let r=zu(e.dal,n);if(r===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(r.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function iF(t,e){let n=t.req.param("project_id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=pT(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=`${z1}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;e.enqueueProjectJob!==void 0?d=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:c}):d=await aF({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${ja}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function oF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"prompt id required"},400);let r=lF(e.dal,n);return t.json({result:r})}function fT(t){let e=t.listProjects().map(mT),n=t.listWebProjectsActive(Yr).map(Pa);return[...e,...n].sort(yF)}function mT(t){return{id:`${ja}${t.id}`,workspace_id:Yr,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 Pa(t){let e={};if(t.config_json!==null)try{let n=JSON.parse(t.config_json);n!==null&&typeof n=="object"&&(e=n)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Vr}${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 zu(t,e){if(!e.startsWith(Vr))return null;let n=e.slice(Vr.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:t.getWebProject(r)}function pT(t,e){if(e.startsWith(ja)){let r=e.slice(ja.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return t.getProject(s)}let n=Number.parseInt(e,10);return Number.isFinite(n)&&String(n)===e?t.getProject(n):null}async function aF(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(iu(),Oy));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function lF(t,e){let n=t.getPromptDispatch(e);if(n===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=t.getJob(n.job_id);if(r===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:t.getRun(r.run_id),i=t.getProject(n.project_id),o=_F(t,i?.team_id??null),a=pF(s),l=hF(r,a,o.length>0),c=gF(n.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:cF(t,i.workflow_name),u=d.totalEstimatedMs,f=_T(n.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:dF(t,s.id),h=uF(s,a,_,d.perStep,o),g=fF(_,d.perStep),y=mF(h,g,u,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Da(u,f),...y},errors_json:{error:r.last_error??"job_failed",job_id:r.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(n.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:n.text,...Da(u,f),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,paused_step:a,attention_needed:o,...Da(u,f),...y},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Da(u,f),...y},errors_json:null,duration_ms:c}}function cF(t,e){let n={totalEstimatedMs:void 0,perStep:new Map},r=t.getWorkflowByName(e);if(r===null)return n;let s;try{s=JSON.parse(r.definition)}catch{return n}if(s===null||typeof s!="object")return n;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 c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,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(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,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(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function dF(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function uF(t,e,n,r,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=[...n].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=r.get(i),c=l?.name??i,d=_T(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function fF(t,e){let n=[];for(let r of t){if(r.ended_at===null)continue;let s=Date.parse(r.started_at),i=Date.parse(r.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(r.state_name)?.name??r.state_name,l=r.outcome==="failed"?"failed":"done";n.push({id:r.state_name,name:a,duration_ms:o,status:l})}return n}function mF(t,e,n,r,s,i){let o={completed_steps:e,total_elapsed_ms:r};return t!==void 0&&(o.current_step=t),n!==void 0&&(o.total_estimated_ms=n),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function _T(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Da(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function pF(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let n="__paused__:";return e.startsWith(n)?e.slice(n.length):null}function _F(t,e){if(e===null)return[];let n;try{n=t.listTeamMembers(e)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function hF(t,e,n){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||n||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function gF(t,e){let n=Date.parse(t);if(Number.isNaN(n))return null;let r=e?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function yF(t,e){let n=Date.parse(t.last_active_at??""),r=Date.parse(e.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?t.name.localeCompare(e.name):s}var ja,Vr,z1,Yr,Yu,Z1,hT=w(()=>{"use strict";ja="project:",Vr="web_project:",z1="prompt:",Yr="default",Yu="Default workspace",Z1=new Date(0).toISOString()});import{Buffer as gT}from"node:buffer";function yT(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function ET(t){return TF[t]}function wT(t){let e=t.trim();if(e==="")return;let n=e.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var EF,wF,Fa,TF,Zu=w(()=>{"use strict";EF=1e4,wF=256*1024,Fa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=yT(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,EF),this.pushByteCap=yT(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,wF),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let n=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}),r={session_id:e.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${n.pid} cmd=${e.command}`),{pid:n.pid}}endSession(e){let n=this.sessions.get(e);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{n.pty.write(e.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${r instanceof Error?r.message:String(r)}`)}}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,n){if(!e.closed){if(e.pendingOutput.push(n),e.pendingBytes+=gT.byteLength(n,"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,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let r=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${n} bytes=${gT.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,n){if(e.closed)return;await this.flush(e,"pty_exit");let r=`\r
|
|
2334
|
+
`)}function D1(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function at(t){return typeof t=="string"?t:""}function j1(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 Uu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xa(t,e){return Number(t.req.param(e))}var Aa,Wu,nT=w(()=>{"use strict";Na();on();gu();Aa=[{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."}],Wu=Aa.map(t=>t.name)});function F1(t){return t.replace(/^\/+/,"")}function rT(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Kr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=F1(t.mailboxKey),n=e.lastIndexOf("/");return(n>=0?e.slice(n+1):e).includes(".")&&(e=n>=0?e.slice(0,n+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return rT(t.userId)&&rT(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${P1}/${t.identityId}/`}function W1(t){return String(Math.max(0,Math.floor(t))).padStart(U1,"0")}function Hu(t,e,n){return`${t}${e}${W1(n)}.json`}function Ra(t,e){return`${t}${e}`}function La(t,e,n){let r=`${e}${n}`;if(!t.startsWith(r))return;let s=t.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var P1,U1,Oa=w(()=>{"use strict";P1="mailbox";U1=12});function un(t,e){let n=Math.floor(t),r="",s=n;for(let d=0;d<12;d++)r=Ca[s&15]+r,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Ca[a&15]+o,a=a>>4;let l=Ca[8|Math.floor(e()*4)&3],c="";for(let d=0;d<15;d++)c+=Ca[Math.floor(e()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ca,$a=w(()=>{"use strict";Ca="0123456789abcdef"});function Ju(t,e){return!Number.isFinite(t)||t<=0?e:t}function Gu(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 lT(t){return t.conversation_id===aT&&H1(t.payload)}function H1(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function X1(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:lT(t)?t.timestamp:void 0;if(e===void 0)return;let n=Date.parse(e);return Number.isFinite(n)?n:void 0}var sT,iT,oT,q1,aT,B1,Xu,or,Ma=w(()=>{"use strict";Oa();$a();sT=3e3,iT=1e4,oT=12e3,q1=1e3,aT="__lmctl_heartbeat__",B1={kind:"heartbeat"},Xu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},or=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=Kr({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=Ju(e.readIntervalMs??e.pollIntervalMs??sT,sT),this.heartbeatIdleMs=Ju(e.heartbeatIdleMs??iT,iT),this.backoffReadIntervalMs=Ju(e.backoffReadIntervalMs??e.pollIntervalMs??oT,oT)}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??Xu;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 n=Ra(this.basePrefix,e),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:q1,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=La(o.Key??"",this.basePrefix,e);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(e,n){let r=this.writeChain.then(()=>this.doPut(e,n));return this.writeChain=r.catch(()=>{}),r}async doPut(e,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:un(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:n},o=(this.ownSeq??0)+1,a=Hu(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(r),a}scheduleNextTick(e){if(this.stopRequested)return;let n=this.opts.timers??Xu;this.timerHandle=n.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,n=Hu(this.basePrefix,this.peerStream,e),r;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:n}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${n}: empty body`),"get"),this.advanceCursor(e);continue}r=await i.Body.transformToString("utf-8")}catch(i){if(Gu(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(r)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),lT(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 n=X1(e);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let n=this.opts.timers??Xu;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.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 n=e-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(aT,B1)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(n){this.emitError(n,"handle")}}emitError(e,n){if(this.opts.onError!==void 0)try{this.opts.onError(e,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,e)}}});import{getConnInfo as J1}from"@hono/node-server/conninfo";function cT(t,e){let n=e.bucket??G1,r=e.remoteAddressOf??(i=>V1(i)),s=i=>{let o=r(i);return Y1(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=Ku(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:n,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Gu(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Vu(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ku(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:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Vu(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Ku(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=K1(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));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:Vu(u)},500)}})}function Ku(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let n=t.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function K1(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function V1(t){try{return J1(t).remote.address}catch{return}}function Y1(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Vu(t){return t instanceof Error?t.message:String(t)}var G1,dT=w(()=>{"use strict";Ma();G1="local"});function uT(t,e){t.get("/mailbox/workspace",n=>Q1(n,e)),t.get("/mailbox/projects",n=>eF(n,e)),t.get("/mailbox/projects/:id",n=>tF(n,e)),t.post("/mailbox/projects",n=>nF(n,e)),t.patch("/mailbox/projects/:id",n=>rF(n,e)),t.delete("/mailbox/projects/:id",n=>sF(n,e)),t.post("/mailbox/projects/:project_id/prompts",n=>iF(n,e)),t.get("/mailbox/prompts/:id",n=>oF(n,e))}function Q1(t,e){e.dal.ensureWorkspace({id:Yr,name:Yu});let n=fT(e.dal),r={id:Yr,name:Yu,created_at:Z1,projects:n};return t.json({workspace:r})}function eF(t,e){return t.json({projects:fT(e.dal)})}function tF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Vr)){let s=zu(e.dal,n);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Pa(s)})}let r=pT(e.dal,n);return r===null?t.json({project:null},404):t.json({project:mT(r)})}async function nF(t,e){let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Yr,name:Yu});let s=e.dal.insertWebProject({workspace_id:Yr,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return t.json({project:Pa(s)},201)}async function rF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(Vr)){let i=zu(e.dal,n);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${n}`},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: ${n}`},404):t.json({project:Pa(o)})}return t.json({error:"project_not_found",message:`project not found: ${n}`},404)}function sF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Vr)){let r=zu(e.dal,n);if(r===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(r.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function iF(t,e){let n=t.req.param("project_id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=pT(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=`${z1}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;e.enqueueProjectJob!==void 0?d=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:c}):d=await aF({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${ja}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function oF(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"prompt id required"},400);let r=lF(e.dal,n);return t.json({result:r})}function fT(t){let e=t.listProjects().map(mT),n=t.listWebProjectsActive(Yr).map(Pa);return[...e,...n].sort(yF)}function mT(t){return{id:`${ja}${t.id}`,workspace_id:Yr,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 Pa(t){let e={};if(t.config_json!==null)try{let n=JSON.parse(t.config_json);n!==null&&typeof n=="object"&&(e=n)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Vr}${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 zu(t,e){if(!e.startsWith(Vr))return null;let n=e.slice(Vr.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:t.getWebProject(r)}function pT(t,e){if(e.startsWith(ja)){let r=e.slice(ja.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return t.getProject(s)}let n=Number.parseInt(e,10);return Number.isFinite(n)&&String(n)===e?t.getProject(n):null}async function aF(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(iu(),Oy));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function lF(t,e){let n=t.getPromptDispatch(e);if(n===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=t.getJob(n.job_id);if(r===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:t.getRun(r.run_id),i=t.getProject(n.project_id),o=_F(t,i?.team_id??null),a=pF(s),l=hF(r,a,o.length>0),c=gF(n.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:cF(t,i.workflow_name),u=d.totalEstimatedMs,f=_T(n.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:dF(t,s.id),h=uF(s,a,_,d.perStep,o),g=fF(_,d.perStep),y=mF(h,g,u,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Da(u,f),...y},errors_json:{error:r.last_error??"job_failed",job_id:r.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(n.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:n.text,...Da(u,f),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,paused_step:a,attention_needed:o,...Da(u,f),...y},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Da(u,f),...y},errors_json:null,duration_ms:c}}function cF(t,e){let n={totalEstimatedMs:void 0,perStep:new Map},r=t.getWorkflowByName(e);if(r===null)return n;let s;try{s=JSON.parse(r.definition)}catch{return n}if(s===null||typeof s!="object")return n;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 c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,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(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,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(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function dF(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function uF(t,e,n,r,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=[...n].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=r.get(i),c=l?.name??i,d=_T(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function fF(t,e){let n=[];for(let r of t){if(r.ended_at===null)continue;let s=Date.parse(r.started_at),i=Date.parse(r.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(r.state_name)?.name??r.state_name,l=r.outcome==="failed"?"failed":"done";n.push({id:r.state_name,name:a,duration_ms:o,status:l})}return n}function mF(t,e,n,r,s,i){let o={completed_steps:e,total_elapsed_ms:r};return t!==void 0&&(o.current_step=t),n!==void 0&&(o.total_estimated_ms=n),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function _T(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Da(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function pF(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let n="__paused__:";return e.startsWith(n)?e.slice(n.length):null}function _F(t,e){if(e===null)return[];let n;try{n=t.listTeamMembers(e)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function hF(t,e,n){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||n||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function gF(t,e){let n=Date.parse(t);if(Number.isNaN(n))return null;let r=e?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function yF(t,e){let n=Date.parse(t.last_active_at??""),r=Date.parse(e.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?t.name.localeCompare(e.name):s}var ja,Vr,z1,Yr,Yu,Z1,hT=w(()=>{"use strict";ja="project:",Vr="web_project:",z1="prompt:",Yr="default",Yu="Default workspace",Z1=new Date(0).toISOString()});import{Buffer as gT}from"node:buffer";function yT(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function ET(t){return TF[t]}function wT(t){let e=t.trim();if(e==="")return;let n=e.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var EF,wF,Fa,TF,Zu=w(()=>{"use strict";EF=1e4,wF=256*1024,Fa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=yT(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,EF),this.pushByteCap=yT(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,wF),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let n=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}),r={session_id:e.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${n.pid} cmd=${e.command}`),{pid:n.pid}}endSession(e){let n=this.sessions.get(e);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{n.pty.write(e.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${r instanceof Error?r.message:String(r)}`)}}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,n){if(!e.closed){if(e.pendingOutput.push(n),e.pendingBytes+=gT.byteLength(n,"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,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let r=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${n} bytes=${gT.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,n){if(e.closed)return;await this.flush(e,"pty_exit");let r=`\r
|
|
2335
2335
|
[process exited with code ${n.exitCode}${n.signal!==void 0?` signal ${n.signal}`:""}]\r
|
|
2336
2336
|
`,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,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)}};TF={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 vT(t,e){t.post("/mailbox/terminal/launch",n=>vF(n,e)),t.post("/mailbox/terminal/end/:session_id",n=>SF(n,e)),t.get("/mailbox/terminal/sessions",n=>bF(n,e))}async function vF(t,e){let n=e.terminalSessionManager;if(n===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!TT.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=wT(r.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ET(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}=n.startSession({session_id:s,command:o.cmd,args:o.args,...typeof r.cwd=="string"&&r.cwd!==""?{cwd:r.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 n=e.terminalSessionManager;if(n===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let r=t.req.param("session_id");return r===void 0||!TT.test(r)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(n.endSession(r),t.json({session_id:r,ended:!0}))}function bF(t,e){let n=e.terminalSessionManager;return n===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:n.listSessions()})}var TT,ST=w(()=>{"use strict";Zu();TT=/^[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 kF}from"node:buffer";function xF(t){try{return kF.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function bT(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function kT(t){return AF[t]}function IT(t){let e=t.trim();if(e==="")return;let n=[],r=0;for(;r<e.length;){let i=e[r];if(i===" "||i===" "){r+=1;continue}if(i==='"'){let a=r+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;n.push(l),r=a+1;continue}let o=r;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;n.push(e.slice(r,o)),r=o}if(n.length===0)return;let s=n.shift();if(!(s===void 0||s===""))return{cmd:s,args:n}}var IF,NF,Ua,AF,Qu=w(()=>{"use strict";IF=2e3,NF=64*1024,Ua=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=bT(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,IF),this.pushByteCap=bT(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,NF),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let n=this.opts.adapterFactory(e.provider),r={session_id:e.session_id,provider:e.provider,adapter:n,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,r);let s=this.makeAdapterContext(r);try{let i=await n.start(e,s);return r.child=i,this.wireChildExit(r,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 n=this.sessions.get(e);if(n!==void 0){n.generation+=1;try{await n.adapter.stop()}catch{}if(n.child!==void 0)try{n.child.kill("SIGTERM")}catch{}await this.flush(n,"session_end"),n.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let r=e.user_input??"";if(r!=="")try{await n.adapter.sendTurn(r)}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(n,{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 n=this.sessions.get(e);n!==void 0&&(n.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 n=e.generation,r=this;return{generation:n,currentGeneration(){return e.generation},emit(s){n===e.generation&&(e.closed||r.appendEvent(e,s))},...r.opts.log!==void 0?{log:r.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,n){e.pendingEvents.push(n);let r=xF(n);if(e.pendingBytes+=r,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,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let r=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${n} events=${r.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,n){let r=e.generation;n.on("exit",(s,i)=>{r===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))}),n.on("error",s=>{r===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};AF={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 xT(t,e){t.post("/mailbox/chat/launch",n=>RF(n,e)),t.post("/mailbox/chat/end/:session_id",n=>LF(n,e)),t.get("/mailbox/chat/sessions",n=>OF(n,e))}async function RF(t,e){let n=e.persistentSessionManager;if(n===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!NT.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=IT(r.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=kT(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 n.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof r.cwd=="string"&&r.cwd!==""?{cwd:r.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 LF(t,e){let n=e.persistentSessionManager;if(n===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let r=t.req.param("session_id");return r===void 0||!NT.test(r)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await n.endSession(r),t.json({session_id:r,ended:!0}))}function OF(t,e){let n=e.persistentSessionManager;return n===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:n.listSessions()})}var NT,AT=w(()=>{"use strict";Qu();NT=/^[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 CF}from"node:fs";function LT(t){let e=t.artifacts.find(n=>n.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return RT(e.content);if(e?.path===void 0||e.path===null)return[];try{let n=CF(e.path,{encoding:"utf8"});return RT(n)}catch{return[]}}function RT(t){let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);return e.length===0?[]:e.map(n=>{let r=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(n);return r===null?{role:"transcript",text:n}:{role:r[1].toLowerCase(),text:r[2]}})}var OT=w(()=>{"use strict"});function CT(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}: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(r.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(r.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(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=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 Wa(t,e){let n=t.query(`SELECT id, kind FROM attention
|
|
2337
2337
|
WHERE run_id = ?
|
|
@@ -2343,7 +2343,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2343
2343
|
<label>Token <input name="token" type="password"></label>
|
|
2344
2344
|
<button type="submit">Login</button>
|
|
2345
2345
|
</form>
|
|
2346
|
-
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Wy(o)?(uu(s,o),s.redirect("/",302)):s.html(Pe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(qy(s),s.redirect("/login",302))),Kw(e,{dal:t.dal}),BT(e,{dal:t.dal}),uT(e,{dal:t.dal}),vT(e,{terminalSessionManager:t.terminalSessionManager}),xT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Ws(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=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(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await Md(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),d.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:d,failed:u},f=>`<p>refreshed team ${v(f.team)}: seeded [${f.seeded.map(m=>v(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${v(m.alias)}: ${v(m.error)}`).join(", ")}]`:""}</p>`)}),Vy(e,{dal:t.dal}),nE(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Do(t.dal),TU)),e.get("/api/projects",s=>q(s,jo(t.dal),vU)),e.get("/api/teams",s=>q(s,Fg(t.dal),kU)),e.get("/api/workflows",s=>q(s,Po(t.dal),IU)),e.get("/api/workflows/verify",s=>{let i=Ow();return s.req.header("accept")?.includes("text/plain")?s.text($w(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Ug(t.dal,{status:s.req.query("status")}),NU)),e.post("/api/uploads",s=>YT(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Fo(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),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",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),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:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,u,he)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Na(),Hw)),o=Fo(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,he)}),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),SU)}),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 Zr(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,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{Pr(d)}catch{return s.text("invalid condition",400)}let u=gU(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:c.id,condition:d,parameters_override:u,priority:f});return q(s,m,he)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},he):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,he)}),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,he)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=QT(s.req.query("status"),yU);if(typeof o=="string")return s.text(o,400);let a=QT(s.req.query("severity"),ov);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")}:{}}),bU)}),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 Zr(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 c=EU(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=wU(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,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,he)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),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 Zr(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,c,he)}),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 Zr(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,he)}),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 Zr(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),he)}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 Zr(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),he)}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},he)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=Qn(t.dal,i,o);return q(s,a,he)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=Qn(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):q(s,l,he);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=_U(l.path);if(hU(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=iU(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return q(s,l,he)}return q(s,l,he)}),e.get("/api/runs",s=>q(s,Dr(t.dal,{limit:af(s,"limit")??100}),xU)),e.get("/api/runs/:id",s=>{let i=Zn(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,AU)}),e.get("/api/runs/:id/where",s=>{let i=jr(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Wo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=qo(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(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 c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}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?(Ga(t.daemon),q(s,o,ev)):q(s,o,ev,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 d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Ga(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>ZT(s,t.dal,i=>q(s,i,LU))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Hg(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():iv(s)?s.html(`<pre>${v(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=>ZT(s,t.dal,i=>{let o=LT(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[v(l.role),v(l.text)])))})),e.get("/api/external-objects",s=>q(s,Xg(t.dal,{type:s.req.query("type")}),OU)),e.get("/api/external-signals",s=>q(s,Jg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),CU)),e.get("/api/attentions",s=>q(s,xn(t.dal,{unacked:s.req.query("unacked")==="true"}),$U)),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 ${v(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 c=Uo(t.dal,l);return q(s,c,d=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[v(u.attention_id),v(u.project),v(u.run_id),v(u.workflow_name),v(u.state_name),v((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Wt(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),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 c=Wt(t.dal,i);if(c===null)return s.notFound();let d=xn(t.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Ga(t.daemon);let p=xn(t.dal).find(_=>_.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(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return Ga(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.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,MU)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=qg(t.dal,i);return o===null?s.notFound():q(s,o,DU)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),tv)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Ws(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),tv)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Ws(s.req.param("team_name"));try{let o=await Og(t.dal,i,s.req.param("alias"));return q(s,o,a=>nv("compacted",a.row))}catch(o){if(o instanceof Us)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Ws(s.req.param("team_name")),o=await Md(t.dal,i,s.req.param("alias"));return q(s,o,a=>nv(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,n,rv)),e.post("/api/intake/scan",async s=>(n=await ia(t.dal),q(s,n,rv))),e.get("/api/stats/run-throughput",s=>q(s,Vg(t.dal),jU)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,PU)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},he);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},he)}),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=qd(t.dal,i),l=Bd(t.dal,{project_id:i});return s.html(Pe(`Metrics \u2014 ${o.name}`,FU(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=af(s,"since_days");return s.json(qd(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=af(s,"since_days");return s.json(Bd(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 ZT(t,e,n){let r=Wd(e,ie(t,"id"),ie(t,"step_id"));return r===null?t.notFound():n(r)}function Ga(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,n,r=200){return iv(t)?r===200?t.html(n(e)):t.html(n(e),400):new Response(JSON.stringify(e),{status:r,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function iv(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function mU(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ja(`${t}/index.html`)?lf(t):null;let e="src/serve/webui-dist";if(Ja(`${e}/index.html`))return e;let n="dist/serve/webui-dist";if(Ja(`${n}/index.html`))return n;let r=cU(oU(uU(import.meta.url)),"webui-dist");return Ja(`${r}/index.html`)?lf(r):null}function lf(t){if(!lU(t))return t;let e=dU(process.cwd(),t);return e.length===0?".":e}function pU(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function af(t,e){let n=t.req.query(e);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>0?r:void 0}function _U(t){switch(aU(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 hU(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Zr(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 gU(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 QT(t,e){if(t===void 0||t.length===0)return;let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length!==0){for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}}function EU(t){if(t!=null)return typeof t=="string"&&ov.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function wU(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="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 TU(t){return`<h1>Status</h1><div class="grid">
|
|
2346
|
+
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Wy(o)?(uu(s,o),s.redirect("/",302)):s.html(Pe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(qy(s),s.redirect("/login",302))),Kw(e,{dal:t.dal}),BT(e,{dal:t.dal}),uT(e,{dal:t.dal}),vT(e,{terminalSessionManager:t.terminalSessionManager}),xT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Ws(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=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(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await Md(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),d.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:d,failed:u},f=>`<p>refreshed team ${v(f.team)}: seeded [${f.seeded.map(m=>v(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${v(m.alias)}: ${v(m.error)}`).join(", ")}]`:""}</p>`)}),Vy(e,{dal:t.dal}),nE(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Do(t.dal),TU)),e.get("/api/projects",s=>q(s,jo(t.dal),vU)),e.get("/api/teams",s=>q(s,Fg(t.dal),kU)),e.get("/api/workflows",s=>q(s,Po(t.dal),IU)),e.get("/api/workflows/verify",s=>{let i=Ow();return s.req.header("accept")?.includes("text/plain")?s.text($w(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Ug(t.dal,{status:s.req.query("status")}),NU)),e.post("/api/uploads",s=>YT(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Fo(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),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",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),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:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,u,he)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Na(),Hw)),o=Fo(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,he)}),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),SU)}),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 Zr(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,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{Pr(d)}catch{return s.text("invalid condition",400)}let u=gU(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:c.id,condition:d,parameters_override:u,priority:f});return q(s,m,he)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},he):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,he)}),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,he)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=QT(s.req.query("status"),yU);if(typeof o=="string")return s.text(o,400);let a=QT(s.req.query("severity"),ov);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")}:{}}),bU)}),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 Zr(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 c=EU(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=wU(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,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,he)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),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 Zr(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,c,he)}),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 Zr(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,he)}),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 Zr(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),he)}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 Zr(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),he)}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},he)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=er(t.dal,i,o);return q(s,a,he)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=er(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):q(s,l,he);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=_U(l.path);if(hU(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=iU(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return q(s,l,he)}return q(s,l,he)}),e.get("/api/runs",s=>q(s,Dr(t.dal,{limit:af(s,"limit")??100}),xU)),e.get("/api/runs/:id",s=>{let i=Qn(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,AU)}),e.get("/api/runs/:id/where",s=>{let i=jr(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Wo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=qo(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(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 c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}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?(Ga(t.daemon),q(s,o,ev)):q(s,o,ev,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 d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Ga(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>ZT(s,t.dal,i=>q(s,i,LU))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Hg(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():iv(s)?s.html(`<pre>${v(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=>ZT(s,t.dal,i=>{let o=LT(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[v(l.role),v(l.text)])))})),e.get("/api/external-objects",s=>q(s,Xg(t.dal,{type:s.req.query("type")}),OU)),e.get("/api/external-signals",s=>q(s,Jg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),CU)),e.get("/api/attentions",s=>q(s,An(t.dal,{unacked:s.req.query("unacked")==="true"}),$U)),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 ${v(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 c=Uo(t.dal,l);return q(s,c,d=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[v(u.attention_id),v(u.project),v(u.run_id),v(u.workflow_name),v(u.state_name),v((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Wt(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,he)}),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 c=Wt(t.dal,i);if(c===null)return s.notFound();let d=An(t.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Ga(t.daemon);let p=An(t.dal).find(_=>_.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(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return Ga(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.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,MU)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=qg(t.dal,i);return o===null?s.notFound():q(s,o,DU)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),tv)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Ws(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),tv)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Ws(s.req.param("team_name"));try{let o=await Og(t.dal,i,s.req.param("alias"));return q(s,o,a=>nv("compacted",a.row))}catch(o){if(o instanceof Us)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Ws(s.req.param("team_name")),o=await Md(t.dal,i,s.req.param("alias"));return q(s,o,a=>nv(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,n,rv)),e.post("/api/intake/scan",async s=>(n=await ia(t.dal),q(s,n,rv))),e.get("/api/stats/run-throughput",s=>q(s,Vg(t.dal),jU)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,PU)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},he);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},he)}),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=qd(t.dal,i),l=Bd(t.dal,{project_id:i});return s.html(Pe(`Metrics \u2014 ${o.name}`,FU(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=af(s,"since_days");return s.json(qd(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=af(s,"since_days");return s.json(Bd(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 ZT(t,e,n){let r=Wd(e,ie(t,"id"),ie(t,"step_id"));return r===null?t.notFound():n(r)}function Ga(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,n,r=200){return iv(t)?r===200?t.html(n(e)):t.html(n(e),400):new Response(JSON.stringify(e),{status:r,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function iv(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function mU(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ja(`${t}/index.html`)?lf(t):null;let e="src/serve/webui-dist";if(Ja(`${e}/index.html`))return e;let n="dist/serve/webui-dist";if(Ja(`${n}/index.html`))return n;let r=cU(oU(uU(import.meta.url)),"webui-dist");return Ja(`${r}/index.html`)?lf(r):null}function lf(t){if(!lU(t))return t;let e=dU(process.cwd(),t);return e.length===0?".":e}function pU(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function af(t,e){let n=t.req.query(e);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>0?r:void 0}function _U(t){switch(aU(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 hU(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Zr(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 gU(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 QT(t,e){if(t===void 0||t.length===0)return;let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length!==0){for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}}function EU(t){if(t!=null)return typeof t=="string"&&ov.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function wU(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="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 TU(t){return`<h1>Status</h1><div class="grid">
|
|
2347
2347
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
2348
2348
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
2349
2349
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -2392,24 +2392,24 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2392
2392
|
WHERE j.project_id = ?
|
|
2393
2393
|
AND r.terminal_state IS NOT NULL
|
|
2394
2394
|
ORDER BY r.id DESC
|
|
2395
|
-
LIMIT ?`,n.id,3);if(r.length<3||!r.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,BU).length>0))continue;let i=r[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,n.id,dv)||t.insertDriftSignal({team_member_id:a.id,project_id:n.id,signal_kind:dv,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${n.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:r.map(l=>l.id),consecutive_threshold:3})}))}}function uv(t){for(let e of XU)try{e(t)}catch{}}var BU,dv,XU,fv=w(()=>{"use strict";BU="request_changes",dv="reviewer_rejection_rate_high";XU=[HU]});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;if(e.trim()==="")return new Set;let n=new Set;for(let r of e.split(",")){let s=r.trim();if(s!==""){if(s==="all")return new Set(mv);JU.has(s)&&n.add(s)}}return n}function pv(t){let e=t.intervalMs??ai(),n=t.runOnceFn??
|
|
2395
|
+
LIMIT ?`,n.id,3);if(r.length<3||!r.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,BU).length>0))continue;let i=r[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,n.id,dv)||t.insertDriftSignal({team_member_id:a.id,project_id:n.id,signal_kind:dv,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${n.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:r.map(l=>l.id),consecutive_threshold:3})}))}}function uv(t){for(let e of XU)try{e(t)}catch{}}var BU,dv,XU,fv=w(()=>{"use strict";BU="request_changes",dv="reviewer_rejection_rate_high";XU=[HU]});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;if(e.trim()==="")return new Set;let n=new Set;for(let r of e.split(",")){let s=r.trim();if(s!==""){if(s==="all")return new Set(mv);JU.has(s)&&n.add(s)}}return n}function pv(t){let e=t.intervalMs??ai(),n=t.runOnceFn??ir,r=new Set(t.features??GU()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...r].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},i=null,o=null,a=null,l=null,c=null;r.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(c=(t.startRollupUpdaterFn??lv)(t.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=_v(t.dal,r,t.monitorSessionActivityFn??Dd,e,s).finally(()=>{l=null})),l.finally(()=>u(jd(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=KU(t.dal,n,t.collectSessionSizesFn??Lg,t.scanIntakeFn??ia,t.monitorSessionActivityFn??Dd,t.worker_id??"daemon",e,r,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;d(m),r.has("session-monitor")&&u(m)}return f}async function KU(t,e,n,r,s,i,o,a,l){l.in_flight=!0,l.last_started_at=new Date().toISOString(),l.last_error=null;let c=[],d=0,u=0,f=[],m=null;try{if(a.has("durable-memory-policies")&&Pw({dal:t}),a.has("drift-detectors")&&uv({dal:t}),a.has("intake")&&(f=await r(t)),a.has("job-worker"))for(;;){let p=await e({dal:t,worker_id:i,lease_ms:6e5});if(p===null)break;c.push(p)}if(a.has("session-size")){let p=await n(t);d=p.recorded,u=p.failed}a.has("session-monitor")&&(m=await _v(t,a,s,o,l))}catch(p){l.last_error=p instanceof Error?p.message:String(p);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:l.last_error})})}catch{}}finally{l.in_flight=!1,l.cycles+=1,l.last_jobs_processed=c.length,l.last_session_sizes_recorded=d,l.last_session_size_failures=u,l.last_intake_scanned=f.reduce((p,_)=>p+_.scanned,0),l.last_intake_new_jobs=f.reduce((p,_)=>p+_.new_jobs,0),l.last_intake_failures=f.filter(p=>p.error!==void 0).length,l.last_session_hung_detected=m?.hung_detected??0,l.jobs_processed+=c.length,l.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:d,session_size_failures:u,intake:f,session_monitor:m}}async function _v(t,e,n,r,s){if(!e.has("session-monitor"))return null;let i=jd(t,r),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 n({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 mv,JU,cf=w(()=>{"use strict";au();Na();Pu();Oo();cv();fv();Pd();mv=["durable-memory-policies","drift-detectors","intake","job-worker","session-size","session-monitor","rollup-updater"],JU=new Set(mv)});function hv(t){let e=t.listMembersInState("in_chat");for(let n of e)t.setMemberState(n.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var gv=w(()=>{"use strict"});function Ka(t,e){if(yn(e)!=="dead")return null;let n=`holder process verified not alive; reconciled to aborted (invocation #${e.id}, holder pid ${e.holder_pid??"unknown"} on ${e.holder_host??"unknown"})`;return t.abortTrackedInvocationAndTerminalizeMessage(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},n)}function yv(t){let e=0;for(let n of t.listAllRunningTrackedInvocations())Ka(t,n)!==null&&(e+=1);return e}function Ev(t,e,n){let r=t.query(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
|
|
2396
2396
|
FROM tracked_invocation
|
|
2397
2397
|
WHERE target_teamfile = ?
|
|
2398
2398
|
AND target_alias = ?
|
|
2399
|
-
AND status = 'running'`,e,n),s=0;for(let i of r)Ka(t,i)!==null&&(s+=1);return s}var Va=w(()=>{"use strict";Mt()});import{mkdirSync as VU,readFileSync as YU,readdirSync as zU,statSync as ZU,writeFileSync as QU}from"node:fs";import{dirname as eW,join as Tv,sep as wv}from"node:path";function Ya(t){return{s3:{async send(r){let s=r;switch(s._localfsTag){case vv:return tW(t,s.input);case Sv:return nW(t,s.input);case bv:return rW(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ff,GetObjectCommand:uf,PutObjectCommand:df}}}function tW(t,e){let n=kv(t,e.Key);return VU(eW(n),{recursive:!0}),QU(n,e.Body),{}}function nW(t,e){let n=kv(t,e.Key),r;try{r=YU(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function rW(t,e){let n=e.Prefix??"";Iv(n);let s=sW(t).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(n)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.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 c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function kv(t,e){return Iv(e),Tv(t,e)}function Iv(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function sW(t){let e=[],n=(r,s)=>{let i;try{i=zU(r,{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=Tv(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=wv==="/"?a:a.split(wv).join("/");e.push({key:c,lastModified:ZU(l).mtime})}}};return n(t,""),e}var vv,Sv,bv,df,uf,ff,mf=w(()=>{"use strict";vv="localfs-put",Sv="localfs-get",bv="localfs-list",df=class{input;_localfsTag=vv;constructor(e){this.input=e}},uf=class{input;_localfsTag=Sv;constructor(e){this.input=e}},ff=class{input;_localfsTag=bv;constructor(e){this.input=e}}});function Nv(){return{put:0,get:0,list:0}}function pf(t,e=iW){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function _f(t){let e=new Date(t),n=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var iW,za,hf=w(()=>{"use strict";iW={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};za=class{counts=Nv();record(e,n=1){this.counts[e]+=n}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Nv(),e}estimateCostUsd(e){return pf(this.counts,e)}}});function xv(t){let e=t.now??Date.now,n=t.timers??oW,r=null,s=null;async function i(){let l=e(),c=_f(l),d=t.meter.drain();(d.put>0||d.get>0||d.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,c),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(c,f)}catch(_){t.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(_){t.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=pf(m);if(r!==c&&p>=t.ceilingUsd){r=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(_){t.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},t.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===_f(e())}}}var oW,Av=w(()=>{"use strict";hf();oW={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var gf=w(()=>{"use strict";Oa();$a();$a()});function aW(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 n=e.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:e.message_id,request:r}}function lW(t){return t.reply_to!==void 0&&t.response!==void 0}function cW(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Rv(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var Za,li,Lv=w(()=>{"use strict";gf();Za=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,n){if(this.stopped)throw new Za("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=e.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=un(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=n?.abortSignal,d;if(c!==void 0){if(c.aborted){l(Rv(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Rv(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),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 n=new Za;for(let r of e){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(e,n){let r=aW(e);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(lW(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??cW(e)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:un(this.now(),this.random),reply_to:r.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=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function yf(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 Ov=w(()=>{"use strict"});function Ef(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 n of e.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Cv=w(()=>{"use strict"});function Tf(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 n of e.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.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 n=e.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var wf,$v=w(()=>{"use strict";wf="daemon:events"});function Dv(t){return{kind:"prompt",prompt_id:t.prompt_id??un(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function vf(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 Mv,Sf=w(()=>{"use strict";gf();Mv="prompt:root"});function ci(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Pv(e[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function dW(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Pv(e[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function jv(t,e=60){if(typeof t!="string"||t==="")return!0;let n=dW(t);return n===null?!0:Date.now()/1e3>=n-e}function Pv(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var bf=w(()=>{"use strict"});async function Qa(t){let e=t.fetchImpl??fetch,n=`https://cognito-idp.${t.region}.amazonaws.com/`,r=await e(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":uW},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.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 uW,kf=w(()=>{"use strict";uW="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Fv,mkdirSync as Uv,readFileSync as Wv,writeFileSync as qv}from"node:fs";import{homedir as Bv}from"node:os";import{dirname as Hv,join as Xv}from"node:path";function di(){return process.env.LMCTL_DEVICE_AUTH_PATH??Xv(Bv(),".lmctl","device-auth.json")}function Jv(){return process.env.LMCTL_TOKEN_PATH??Xv(Bv(),".lmctl","cli-tokens.json")}function If(t=di()){try{let e=JSON.parse(Wv(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 Gv(t,e=di()){Uv(Hv(e),{recursive:!0,mode:448}),qv(e,JSON.stringify(t,null,2));try{Fv(e,384)}catch{}}function Nf(t,e=Jv()){let n={};try{n=JSON.parse(Wv(e,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=t.idToken,t.accessToken!==void 0&&(r.accessToken=t.accessToken),t.refreshToken!==void 0&&(r.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(r.expiresAt=t.expiresAt);let s={...n,cognito:r};Uv(Hv(e),{recursive:!0,mode:448}),qv(e,JSON.stringify(s,null,2));try{Fv(e,384)}catch{}}async function Kv(t){let e=t.deviceAuthPath??di(),n=If(e);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await Qa({region:t.region,clientId:t.clientId,refreshToken:n.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Nf({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},t.cliTokensPath??Jv()),{idToken:r.idToken,userId:n.userId}}var xf=w(()=>{"use strict";kf()});function Vv(t){if(t.length===0||!t.startsWith("---"))throw new Ht("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2399
|
+
AND status = 'running'`,e,n),s=0;for(let i of r)Ka(t,i)!==null&&(s+=1);return s}var Va=w(()=>{"use strict";gt()});import{mkdirSync as VU,readFileSync as YU,readdirSync as zU,statSync as ZU,writeFileSync as QU}from"node:fs";import{dirname as eW,join as Tv,sep as wv}from"node:path";function Ya(t){return{s3:{async send(r){let s=r;switch(s._localfsTag){case vv:return tW(t,s.input);case Sv:return nW(t,s.input);case bv:return rW(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:ff,GetObjectCommand:uf,PutObjectCommand:df}}}function tW(t,e){let n=kv(t,e.Key);return VU(eW(n),{recursive:!0}),QU(n,e.Body),{}}function nW(t,e){let n=kv(t,e.Key),r;try{r=YU(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function rW(t,e){let n=e.Prefix??"";Iv(n);let s=sW(t).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(n)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.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 c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function kv(t,e){return Iv(e),Tv(t,e)}function Iv(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function sW(t){let e=[],n=(r,s)=>{let i;try{i=zU(r,{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=Tv(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=wv==="/"?a:a.split(wv).join("/");e.push({key:c,lastModified:ZU(l).mtime})}}};return n(t,""),e}var vv,Sv,bv,df,uf,ff,mf=w(()=>{"use strict";vv="localfs-put",Sv="localfs-get",bv="localfs-list",df=class{input;_localfsTag=vv;constructor(e){this.input=e}},uf=class{input;_localfsTag=Sv;constructor(e){this.input=e}},ff=class{input;_localfsTag=bv;constructor(e){this.input=e}}});function Nv(){return{put:0,get:0,list:0}}function pf(t,e=iW){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function _f(t){let e=new Date(t),n=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var iW,za,hf=w(()=>{"use strict";iW={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};za=class{counts=Nv();record(e,n=1){this.counts[e]+=n}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Nv(),e}estimateCostUsd(e){return pf(this.counts,e)}}});function xv(t){let e=t.now??Date.now,n=t.timers??oW,r=null,s=null;async function i(){let l=e(),c=_f(l),d=t.meter.drain();(d.put>0||d.get>0||d.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,c),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(c,f)}catch(_){t.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(_){t.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=pf(m);if(r!==c&&p>=t.ceilingUsd){r=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(_){t.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},t.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===_f(e())}}}var oW,Av=w(()=>{"use strict";hf();oW={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var gf=w(()=>{"use strict";Oa();$a();$a()});function aW(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 n=e.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:e.message_id,request:r}}function lW(t){return t.reply_to!==void 0&&t.response!==void 0}function cW(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Rv(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var Za,li,Lv=w(()=>{"use strict";gf();Za=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,n){if(this.stopped)throw new Za("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=e.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=un(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=n?.abortSignal,d;if(c!==void 0){if(c.aborted){l(Rv(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Rv(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),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 n=new Za;for(let r of e){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(e,n){let r=aW(e);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(lW(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??cW(e)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:un(this.now(),this.random),reply_to:r.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=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function yf(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 Ov=w(()=>{"use strict"});function Ef(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 n of e.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Cv=w(()=>{"use strict"});function Tf(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 n of e.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.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 n=e.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var wf,$v=w(()=>{"use strict";wf="daemon:events"});function Dv(t){return{kind:"prompt",prompt_id:t.prompt_id??un(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function vf(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 Mv,Sf=w(()=>{"use strict";gf();Mv="prompt:root"});function ci(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Pv(e[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function dW(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(Pv(e[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function jv(t,e=60){if(typeof t!="string"||t==="")return!0;let n=dW(t);return n===null?!0:Date.now()/1e3>=n-e}function Pv(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var bf=w(()=>{"use strict"});async function Qa(t){let e=t.fetchImpl??fetch,n=`https://cognito-idp.${t.region}.amazonaws.com/`,r=await e(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":uW},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.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 uW,kf=w(()=>{"use strict";uW="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Fv,mkdirSync as Uv,readFileSync as Wv,writeFileSync as qv}from"node:fs";import{homedir as Bv}from"node:os";import{dirname as Hv,join as Xv}from"node:path";function di(){return process.env.LMCTL_DEVICE_AUTH_PATH??Xv(Bv(),".lmctl","device-auth.json")}function Jv(){return process.env.LMCTL_TOKEN_PATH??Xv(Bv(),".lmctl","cli-tokens.json")}function If(t=di()){try{let e=JSON.parse(Wv(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 Gv(t,e=di()){Uv(Hv(e),{recursive:!0,mode:448}),qv(e,JSON.stringify(t,null,2));try{Fv(e,384)}catch{}}function Nf(t,e=Jv()){let n={};try{n=JSON.parse(Wv(e,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=t.idToken,t.accessToken!==void 0&&(r.accessToken=t.accessToken),t.refreshToken!==void 0&&(r.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(r.expiresAt=t.expiresAt);let s={...n,cognito:r};Uv(Hv(e),{recursive:!0,mode:448}),qv(e,JSON.stringify(s,null,2));try{Fv(e,384)}catch{}}async function Kv(t){let e=t.deviceAuthPath??di(),n=If(e);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await Qa({region:t.region,clientId:t.clientId,refreshToken:n.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Nf({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},t.cliTokensPath??Jv()),{idToken:r.idToken,userId:n.userId}}var xf=w(()=>{"use strict";kf()});function Vv(t){if(t.length===0||!t.startsWith("---"))throw new Ht("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2400
2400
|
`);if(e[0]!=="---")throw new Ht("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Ht(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!fW.has(c))throw new Ht(`unknown frontmatter key "${c}" \u2014 allowed keys: ${el.join(", ")}`);n[c]=d}if(r===-1)throw new Ht("frontmatter not closed (missing trailing `---` on its own line)");for(let o of el)if(n[o]===void 0)throw new Ht(`missing required frontmatter key "${o}" \u2014 required: ${el.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var el,fW,Ht,Yv=w(()=>{"use strict";el=["title","description","members"],fW=new Set(el),Ht=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as mW,writeFileSync as fee,renameSync as mee,existsSync as Zv}from"node:fs";import{basename as pW,resolve as Qr,dirname as Af}from"node:path";function hW(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function gW(t){return/^\s*_MEMBER_\s+\S/.test(t)}function yW(t){return/^\s*_SESSION_\s+\S/.test(t)}function EW(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Lf(t){let e=pW(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Fe(t){let e=mW(t,"utf-8"),n=Af(Qr(t)),r=Of(e,Lf(t),{baseDir:n,sourcePath:Qr(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Qr(n,s.sessiondir));return r}function Of(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2401
2401
|
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=Vv(i)}catch(l){if(l instanceof Ht)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
2402
2402
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(yW(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(EW(c)||!gW(c))continue;let u=hW(c);for(let p of Object.keys(u))if(!zv.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
2403
|
-
allowed keys: ${zv.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${r.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),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function Cf(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===Rf.toLowerCase());r.length>1&&n.push({field:Rf,message:`${r.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)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Qr(e,i.teamfile):Qr(i.teamfile);if(!Zv(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=pt(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else _W.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function pt(t){return t.members.find(e=>e.alias.toLowerCase()===Rf.toLowerCase())}function $f(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Qr(e,t.teamfile),o=n??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),!Zv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=Fe(i),l=pt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return $f(l,Af(i),o,r);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||Af(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function Qv(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Rf,_W,zv,Xt=w(()=>{"use strict";Yv();Rf="Lead",_W=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"]);zv=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as wW,realpathSync as TW}from"node:fs";import{dirname as vW}from"node:path";function Mf(t){SW(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function SW(t){let e=t.payload.root_teamfile;try{e=TW(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 n=kW(e);if("error"in n)return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Er(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:AW(t.env??process.env)});if(!r.acquired){let i=xW(n.alias,r.current);return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.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=qi(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:s_(t.env??process.env)});try{let o=await(t.chat??sn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,d=a||l?"error":"ok";return d==="ok"?await IW(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:d,error_detail:null,log:t.log}):es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:d,response:d==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.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(r.lease,r.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:bW(t.message)})}function bW(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function kW(t){if(!wW(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=pt(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??vW(t)}}async function IW(t,e){let n=nS(e.message),r=e.response===null?null:nS(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:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.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 nS(t){return t.length<=eS?{text:t,truncated:!1}:{text:t.slice(0,eS),truncated:!0}}function NW(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function xW(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:NW(t,e)}function AW(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return tS;let n=Number(e);return!Number.isFinite(n)||n<=0?tS:n}var eS,tS,rS=w(()=>{"use strict";ut();Xt();ce();Mt();eS=256*1024,tS=30*60*1e3});import{chmodSync as cS,existsSync as RW,mkdirSync as dS,readFileSync as sl,writeFileSync as uS}from"node:fs";import{dirname as Df,resolve as tl,join as fS}from"node:path";import{fileURLToPath as LW}from"node:url";import{homedir as mS}from"node:os";import{CognitoIdentityClient as OW,GetIdCommand as CW}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as sS}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $W,ListObjectsV2Command as MW,PutObjectCommand as DW,S3Client as iS}from"@aws-sdk/client-s3";function fi(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:WW(t.selfUrl),r={},s;for(let b of n)if(RW(b)){r=UW(b),s=b;break}let i=(...b)=>{for(let k of b)if(typeof k=="string"&&k!=="")return k},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??jW,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??PW,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??FW,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",d=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??il,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:n,...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,_=rl(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=rl(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=rl(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=rl(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(e.LMCTL_MAILBOX_KEY),S=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...S!==void 0?{tokenPath:S}:{}},f}function UW(t){try{let e=sl(t,"utf8"),r=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function WW(t){let e=Df(LW(t??import.meta.url));return[tl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),tl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),tl(e,"..","..","..","infra","terraform","terraform.tfstate"),tl(e,"..","..","infra","terraform","terraform.tfstate")]}function rl(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function qW(t){let e=BW(t.intervalMs)??pS,n=Math.max(1,Math.trunc(t.limit??500)),r=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(r()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,n);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:r(),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(r()).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}}},d=setInterval(()=>{c()},e);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function BW(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function _S(t){let e=t.tokenPath??fS(mS(),".lmctl","cli-tokens.json"),n=aS(t.tokenPath);if(jv(n.cognito?.idToken)&&If()!==null)try{await Kv({region:t.region,clientId:t.cognitoClientId??il,cliTokensPath:e}),n=aS(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let re=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${re}`)}if(n.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 r=n.cognito.idToken;if(typeof r!="string"||r==="")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=n.cognito.identityId,o=!1;i===void 0||i===""?i=await lS({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=sS({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new iS({region:t.region,credentials:a}),c={ListObjectsV2Command:MW,GetObjectCommand:$W,PutObjectCommand:DW},d=ci(r),u=d??i,f=t.deviceId,m=Kr({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let R=p.loadMailboxCursor(u,m);if(R!==null)_=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let re=!1,X=0;for(;!re&&X<2;){X+=1;try{let N=Ra(m,"web"),x=0,C;do{let H=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:N,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let W of H.Contents??[]){let F=La(W.Key??"",m,"web");F!==void 0&&F>x&&(x=F)}C=H.IsTruncated===!0?H.NextContinuationToken:void 0}while(C!==void 0);_=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${u}`),re=!0}catch(N){let x=N instanceof Error?N.message:String(N);if(o&&X===1&&JW(N)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),XW(e),o=!1,i=await lS({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=sS({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new iS({region:t.region,credentials:a}),m=Kr({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=t.terminalSessionManager,y=t.persistentSessionManager,E=t.promptTriggerStore,S=new za,b=new ir({bucket:t.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>S.record(R),onMessage:async R=>{if(g!==void 0&&yf(R.payload)){g.onInbound(R.payload);return}if(y!==void 0&&Ef(R.payload)){await y.onInbound(R.payload);return}if(!Tf(R.payload)){if(E!==void 0&&vf(R.payload)){Mf({store:E,payload:R.payload,log:t.log});return}h!==null&&await h.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...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}:{}});h=new li({client:b,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async R=>b.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),y!==void 0&&y.setPublish(async R=>b.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let k=R=>b.putMessage({conversation_id:wf,payload:R});b.start();let P=t.chatLogTailStore===void 0?void 0:qW({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??pS,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let U=t.deviceId??i,j=`${u}/usage/`,A;return A=t.usageStore===void 0?void 0:xv({meter:S,store:t.usageStore,userId:u,deviceId:U,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:re,ceilingUsd:X})=>{t.log?.(`[usage] month ${R} cost $${re.toFixed(4)} >= ceiling $${X} \u2014 blocking mailbox`),b.stop().catch(()=>{}),A?.stop()},publishOwnRollup:async(R,re)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${j}${U}-${R}.json`,Body:JSON.stringify({...re,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let re={put:0,get:0,list:0},X;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:j,MaxKeys:1e3,...X!==void 0?{ContinuationToken:X}:{}}));for(let x of N.Contents??[]){let C=x.Key??"";if(C.endsWith(`-${R}.json`))try{let H=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(H.Body===void 0)continue;let W=JSON.parse(await H.Body.transformToString("utf-8"));re.put+=W.put??0,re.get+=W.get??0,re.list+=W.list??0}catch{}}X=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(X!==void 0);return re},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:b,fetchClient:h,publishDaemonEvent:k,async stop(){P?.stop(),A!==void 0&&(await A.flushNow().catch(()=>{}),A.stop()),await h.stop().catch(()=>{}),await b.stop().catch(()=>{})}}}async function hS(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ya(t.rootDir),n=Kr({identityId:ui,userId:ui,deviceId:oS}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new ir({bucket:"local",identityId:ui,userId:ui,deviceId:oS,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&yf(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Ef(c.payload)){await i.onInbound(c.payload);return}if(!Tf(c.payload)){if(o!==void 0&&vf(c.payload)){Mf({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??nl,readIntervalMs:t.readIntervalMs??nl,heartbeatIdleMs:t.heartbeatIdleMs??nl,backoffReadIntervalMs:t.backoffReadIntervalMs??nl});r=new li({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:wf,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:ui,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function aS(t){let e=t??fS(mS(),".lmctl","cli-tokens.json");try{let n=sl(e,"utf8");return JSON.parse(n)}catch{return{}}}function HW(t,e){if(e===void 0||e==="")return;let n={};try{let s=sl(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};dS(Df(t),{recursive:!0,mode:448}),uS(t,JSON.stringify(r,null,2));try{cS(t,384)}catch{}}function XW(t){let e={};try{let r=sl(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,dS(Df(t),{recursive:!0,mode:448}),uS(t,JSON.stringify(n,null,2));try{cS(t,384)}catch{}}async function lS(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new OW({region:t.region}).send(new CW({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{HW(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function JW(t){if(t===null||typeof t!="object")return!1;let e=t,n=[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 n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var pS,nl,il,jW,PW,FW,ui,oS,jf=w(()=>{"use strict";Ma();mf();hf();Av();Lv();Ov();Cv();$v();Sf();Oa();bf();xf();rS();pS=3e3,nl=1e3,il="79u5jhkk46qofog661c9i0bdcs",jW="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",PW="us-east-1_4iUdFggDn",FW="lmctl-next-preview-mailbox-254332045686";ui="local",oS="local"});import{spawn as Wf}from"node:child_process";import{createInterface as gS}from"node:readline";var Pf,Ff,Uf,yS,ES=w(()=>{"use strict";co();ce();Rs();Pf=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=Wf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=gS({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.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"}),n.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,n.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,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}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 n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{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(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}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,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
|
|
2403
|
+
allowed keys: ${zv.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${r.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),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function Cf(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===Rf.toLowerCase());r.length>1&&n.push({field:Rf,message:`${r.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)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Qr(e,i.teamfile):Qr(i.teamfile);if(!Zv(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=pt(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else _W.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function pt(t){return t.members.find(e=>e.alias.toLowerCase()===Rf.toLowerCase())}function $f(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Qr(e,t.teamfile),o=n??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),!Zv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=Fe(i),l=pt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return $f(l,Af(i),o,r);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||Af(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function Qv(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Rf,_W,zv,Xt=w(()=>{"use strict";Yv();Rf="Lead",_W=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"]);zv=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as wW,realpathSync as TW}from"node:fs";import{dirname as vW}from"node:path";function Mf(t){SW(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function SW(t){let e=t.payload.root_teamfile;try{e=TW(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 n=kW(e);if("error"in n)return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=wr(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:AW(t.env??process.env)});if(!r.acquired){let i=xW(n.alias,r.current);return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.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=qi(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:s_(t.env??process.env)});try{let o=await(t.chat??sn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,d=a||l?"error":"ok";return d==="ok"?await IW(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:d,error_detail:null,log:t.log}):es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:d,response:d==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return es({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.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(r.lease,r.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:bW(t.message)})}function bW(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function kW(t){if(!wW(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=pt(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??vW(t)}}async function IW(t,e){let n=nS(e.message),r=e.response===null?null:nS(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:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.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 nS(t){return t.length<=eS?{text:t,truncated:!1}:{text:t.slice(0,eS),truncated:!0}}function NW(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function xW(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:NW(t,e)}function AW(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return tS;let n=Number(e);return!Number.isFinite(n)||n<=0?tS:n}var eS,tS,rS=w(()=>{"use strict";ut();Xt();ce();gt();eS=256*1024,tS=30*60*1e3});import{chmodSync as cS,existsSync as RW,mkdirSync as dS,readFileSync as sl,writeFileSync as uS}from"node:fs";import{dirname as Df,resolve as tl,join as fS}from"node:path";import{fileURLToPath as LW}from"node:url";import{homedir as mS}from"node:os";import{CognitoIdentityClient as OW,GetIdCommand as CW}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as sS}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $W,ListObjectsV2Command as MW,PutObjectCommand as DW,S3Client as iS}from"@aws-sdk/client-s3";function fi(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:WW(t.selfUrl),r={},s;for(let b of n)if(RW(b)){r=UW(b),s=b;break}let i=(...b)=>{for(let k of b)if(typeof k=="string"&&k!=="")return k},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??jW,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??PW,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??FW,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",d=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??il,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:n,...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,_=rl(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=rl(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=rl(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=rl(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(e.LMCTL_MAILBOX_KEY),S=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...S!==void 0?{tokenPath:S}:{}},f}function UW(t){try{let e=sl(t,"utf8"),r=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function WW(t){let e=Df(LW(t??import.meta.url));return[tl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),tl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),tl(e,"..","..","..","infra","terraform","terraform.tfstate"),tl(e,"..","..","infra","terraform","terraform.tfstate")]}function rl(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function qW(t){let e=BW(t.intervalMs)??pS,n=Math.max(1,Math.trunc(t.limit??500)),r=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(r()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,n);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:r(),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(r()).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}}},d=setInterval(()=>{c()},e);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function BW(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function _S(t){let e=t.tokenPath??fS(mS(),".lmctl","cli-tokens.json"),n=aS(t.tokenPath);if(jv(n.cognito?.idToken)&&If()!==null)try{await Kv({region:t.region,clientId:t.cognitoClientId??il,cliTokensPath:e}),n=aS(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let re=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${re}`)}if(n.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 r=n.cognito.idToken;if(typeof r!="string"||r==="")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=n.cognito.identityId,o=!1;i===void 0||i===""?i=await lS({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=sS({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new iS({region:t.region,credentials:a}),c={ListObjectsV2Command:MW,GetObjectCommand:$W,PutObjectCommand:DW},d=ci(r),u=d??i,f=t.deviceId,m=Kr({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let R=p.loadMailboxCursor(u,m);if(R!==null)_=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let re=!1,X=0;for(;!re&&X<2;){X+=1;try{let N=Ra(m,"web"),x=0,C;do{let H=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:N,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let W of H.Contents??[]){let F=La(W.Key??"",m,"web");F!==void 0&&F>x&&(x=F)}C=H.IsTruncated===!0?H.NextContinuationToken:void 0}while(C!==void 0);_=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${u}`),re=!0}catch(N){let x=N instanceof Error?N.message:String(N);if(o&&X===1&&JW(N)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),XW(e),o=!1,i=await lS({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=sS({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new iS({region:t.region,credentials:a}),m=Kr({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=t.terminalSessionManager,y=t.persistentSessionManager,E=t.promptTriggerStore,S=new za,b=new or({bucket:t.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>S.record(R),onMessage:async R=>{if(g!==void 0&&yf(R.payload)){g.onInbound(R.payload);return}if(y!==void 0&&Ef(R.payload)){await y.onInbound(R.payload);return}if(!Tf(R.payload)){if(E!==void 0&&vf(R.payload)){Mf({store:E,payload:R.payload,log:t.log});return}h!==null&&await h.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...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}:{}});h=new li({client:b,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async R=>b.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),y!==void 0&&y.setPublish(async R=>b.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let k=R=>b.putMessage({conversation_id:wf,payload:R});b.start();let P=t.chatLogTailStore===void 0?void 0:qW({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??pS,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let U=t.deviceId??i,j=`${u}/usage/`,A;return A=t.usageStore===void 0?void 0:xv({meter:S,store:t.usageStore,userId:u,deviceId:U,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:re,ceilingUsd:X})=>{t.log?.(`[usage] month ${R} cost $${re.toFixed(4)} >= ceiling $${X} \u2014 blocking mailbox`),b.stop().catch(()=>{}),A?.stop()},publishOwnRollup:async(R,re)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${j}${U}-${R}.json`,Body:JSON.stringify({...re,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let re={put:0,get:0,list:0},X;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:j,MaxKeys:1e3,...X!==void 0?{ContinuationToken:X}:{}}));for(let x of N.Contents??[]){let C=x.Key??"";if(C.endsWith(`-${R}.json`))try{let H=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(H.Body===void 0)continue;let W=JSON.parse(await H.Body.transformToString("utf-8"));re.put+=W.put??0,re.get+=W.get??0,re.list+=W.list??0}catch{}}X=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(X!==void 0);return re},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:b,fetchClient:h,publishDaemonEvent:k,async stop(){P?.stop(),A!==void 0&&(await A.flushNow().catch(()=>{}),A.stop()),await h.stop().catch(()=>{}),await b.stop().catch(()=>{})}}}async function hS(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ya(t.rootDir),n=Kr({identityId:ui,userId:ui,deviceId:oS}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new or({bucket:"local",identityId:ui,userId:ui,deviceId:oS,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&yf(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Ef(c.payload)){await i.onInbound(c.payload);return}if(!Tf(c.payload)){if(o!==void 0&&vf(c.payload)){Mf({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??nl,readIntervalMs:t.readIntervalMs??nl,heartbeatIdleMs:t.heartbeatIdleMs??nl,backoffReadIntervalMs:t.backoffReadIntervalMs??nl});r=new li({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:wf,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:ui,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function aS(t){let e=t??fS(mS(),".lmctl","cli-tokens.json");try{let n=sl(e,"utf8");return JSON.parse(n)}catch{return{}}}function HW(t,e){if(e===void 0||e==="")return;let n={};try{let s=sl(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};dS(Df(t),{recursive:!0,mode:448}),uS(t,JSON.stringify(r,null,2));try{cS(t,384)}catch{}}function XW(t){let e={};try{let r=sl(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,dS(Df(t),{recursive:!0,mode:448}),uS(t,JSON.stringify(n,null,2));try{cS(t,384)}catch{}}async function lS(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new OW({region:t.region}).send(new CW({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{HW(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function JW(t){if(t===null||typeof t!="object")return!1;let e=t,n=[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 n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var pS,nl,il,jW,PW,FW,ui,oS,jf=w(()=>{"use strict";Ma();mf();hf();Av();Lv();Ov();Cv();$v();Sf();Oa();bf();xf();rS();pS=3e3,nl=1e3,il="79u5jhkk46qofog661c9i0bdcs",jW="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",PW="us-east-1_4iUdFggDn",FW="lmctl-next-preview-mailbox-254332045686";ui="local",oS="local"});import{spawn as Wf}from"node:child_process";import{createInterface as gS}from"node:readline";var Pf,Ff,Uf,yS,ES=w(()=>{"use strict";co();ce();Rs();Pf=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=Wf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=gS({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.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"}),n.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,n.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,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}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 n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{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(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}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,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
|
|
2404
2404
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
|
|
2405
2405
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let o=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let a=n.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(n.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r===void 0)return;let s=n.params??{},i=this.normalizeNotification(r,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(e,n){if(e==="thread/started"){let r=n.thread;return typeof r?.id=="string"&&(this.threadId=r.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:n}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:n.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof n.delta=="string"?n.delta:""}};if(e==="item/started"||e==="item/completed"){let r=n.item;return r?.type!==void 0&&r.type!=="agentMessage"&&r.type!=="userMessage"?{event_type:"tool_call",payload:{name:r.name??r.type,status:e==="item/started"?"started":"completed",item:r}}:{event_type:"notification",payload:{method:e,params:n}}}if(e==="turn/completed"){let r=n.turn;return typeof r?.id=="string"&&this.ctx?.turnMap.delete(r.id),{event_type:"turn_complete",payload:n}}if(e==="error"){let r=n.error;return{event_type:"error",payload:{message:typeof r?.message=="string"?r.message:JSON.stringify(n),raw:n}}}return{event_type:"notification",payload:{method:e,params:n}}}},Ff=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,n){this.ctx=n;let r=Wf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=r,r.stdout.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
|
|
2406
2406
|
`);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),r}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 n=`claude-${Date.now()}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});let r=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(r+`
|
|
2407
2407
|
`)}catch(s){throw this.ctx?.turnMap.delete(n),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}catch{return}let r=typeof n.type=="string"?n.type:"";if(r==="system"&&n.subtype==="init"){let s=typeof n.session_id=="string"?n.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:n}}));return}if(r==="assistant"){let i=n.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(r==="result"){let s=typeof n.session_id=="string"?n.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:n.result,session_id:s,raw:n}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n}})}},Uf=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,n){this.ctx=n;let r=e.cwd??process.cwd();if(e.provider==="opencode")try{lo(r)}catch(i){M({event:"opencode_config_install_failed",cwd:r,error_message:i instanceof Error?i.message:String(i)})}let s=Wf(e.command,e.args,{cwd:r,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=gS({input:s.stdout}),this.rl.on("line",i=>{n.generation===n.currentGeneration()&&this.handleLine(i)}),s.stderr?.on("data",i=>{if(n.generation!==n.currentGeneration())return;let o=i instanceof Buffer?i.toString("utf8"):String(i);n.emit({event_type:"notification",payload:{source:"stderr",text:o}})});try{await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;if(this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,e.provider==="kimi"){if(this.sessionId===void 0)throw new Error("Kimi ACP session/new response missing sessionId");try{await this.rpc("session/set_config_option",{sessionId:this.sessionId,configId:"mode",value:"auto"})}catch(a){let l=a instanceof Error?a.message:String(a);throw M({event:"acp_permission_mode_failed",provider:e.provider,config_id:"mode",value:"auto",error_message:l}),new Error(`Cannot set Kimi ACP permission mode to auto: ${l}`)}}return n.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}catch(i){try{await this.stop()}catch{}try{s.kill("SIGTERM")}catch{}throw i}}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let n=`acp-${Date.now()}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(n)}}async stop(){this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0);for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear(),this.child!==void 0&&await et(this.child)}async rpc(e,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
|
|
2408
2408
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
|
|
2409
2409
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let s=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let i=n.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(n.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r!==void 0){if(typeof n.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`Method not found: ${r} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
|
|
2410
|
-
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:r,id:n.id,params:n.params}});return}if(r==="session/update"){let s=n.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:r,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n.params}})}}},yS=t=>{switch(t){case"codex":return new Pf;case"claude":case"qwen":return new Ff;case"gemini":case"copilot":case"opencode":case"kimi":return new Uf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as GW}from"node:crypto";import{existsSync as Qee,mkdirSync as KW,readFileSync as VW,writeFileSync as YW}from"node:fs";import{homedir as zW}from"node:os";import{dirname as ZW,join as QW}from"node:path";function ol(){return process.env.LMCTL_DEVICE_FILE??QW(zW(),".lmctl","device.json")}function
|
|
2410
|
+
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:r,id:n.id,params:n.params}});return}if(r==="session/update"){let s=n.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:r,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n.params}})}}},yS=t=>{switch(t){case"codex":return new Pf;case"claude":case"qwen":return new Ff;case"gemini":case"copilot":case"opencode":case"kimi":return new Uf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as GW}from"node:crypto";import{existsSync as Qee,mkdirSync as KW,readFileSync as VW,writeFileSync as YW}from"node:fs";import{homedir as zW}from"node:os";import{dirname as ZW,join as QW}from"node:path";function ol(){return process.env.LMCTL_DEVICE_FILE??QW(zW(),".lmctl","device.json")}function ar(t=ol()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let n=JSON.parse(VW(t,"utf8"));return typeof n.device_id!="string"||n.device_id===""?null:{device_id:n.device_id,created_at:typeof n.created_at=="string"?n.created_at:""}}catch{return null}}function qf(t=ol()){let e=ar(t);if(e!==null&&e.created_at!=="env")return e;let n={device_id:GW(),created_at:new Date().toISOString()};return KW(ZW(t),{recursive:!0}),YW(t,`${JSON.stringify(n,null,2)}
|
|
2411
2411
|
`,{encoding:"utf8",mode:384}),n}var Bf=w(()=>{"use strict"});import{mkdirSync as eq,readFileSync as wS,rmSync as tq,writeFileSync as nq}from"node:fs";import{dirname as TS,join as rq}from"node:path";function Jt(t=z()){return rq(TS(t),"serve.pid")}function vS(t,e){let n=Jt(e);return eq(TS(n),{recursive:!0}),nq(n,`${JSON.stringify(t,null,2)}
|
|
2412
|
-
`,"utf-8"),n}function Hf(t){let e=Jt(t),n;try{n=wS(e,"utf-8")}catch{return null}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0?null:{pid:r.pid,startedAt:typeof r.startedAt=="string"?r.startedAt:"unknown",port:Number.isInteger(r.port)?r.port:0,bind:typeof r.bind=="string"?r.bind:"unknown",dbPath:typeof r.dbPath=="string"?r.dbPath:"unknown",startToken:typeof r.startToken=="string"?r.startToken:null}}catch{return null}}function ts(t){tq(Jt(t),{force:!0})}function al(t){let e=sq(t),n=Hf(t);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(t_(n.pid,n.startToken??null)){case"same":return{entry:n,running:!0,stale:!1,corrupt:!1};case"different":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:n,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function sq(t){let e=Jt(t),n;try{n=wS(e,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function SS(){return tc(process.pid)}var bS=w(()=>{"use strict"
|
|
2412
|
+
`,"utf-8"),n}function Hf(t){let e=Jt(t),n;try{n=wS(e,"utf-8")}catch{return null}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0?null:{pid:r.pid,startedAt:typeof r.startedAt=="string"?r.startedAt:"unknown",port:Number.isInteger(r.port)?r.port:0,bind:typeof r.bind=="string"?r.bind:"unknown",dbPath:typeof r.dbPath=="string"?r.dbPath:"unknown",startToken:typeof r.startToken=="string"?r.startToken:null}}catch{return null}}function ts(t){tq(Jt(t),{force:!0})}function al(t){let e=sq(t),n=Hf(t);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(t_(n.pid,n.startToken??null)){case"same":return{entry:n,running:!0,stale:!1,corrupt:!1};case"different":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:n,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function sq(t){let e=Jt(t),n;try{n=wS(e,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function SS(){return tc(process.pid)}var bS=w(()=>{"use strict";Mt();qe()});var PS={};me(PS,{_resetStdoutEpipeGuardForTests:()=>dq,bootstrapAgentRestMailbox:()=>CS,installStdoutEpipeGuard:()=>AS,publishRegisteredWorkflowsOnStart:()=>OS,resolveLocalMailboxDir:()=>DS,resolveLocalWebuiDir:()=>MS,resolveServeConfig:()=>$S,runServe:()=>lq,runServeStatus:()=>RS,runServeStop:()=>LS,validateServeArgs:()=>jS});import{randomBytes as iq}from"node:crypto";import{existsSync as NS}from"node:fs";import{isIP as kS}from"node:net";import{homedir as oq}from"node:os";import{isAbsolute as xS,resolve as Xf}from"node:path";async function lq(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(aq),0;let n=t[0];return n==="status"?RS(t.slice(1),e):n==="stop"?LS(t.slice(1),e):n!=="start"?(e.stderr.write(n===void 0?IS:`error: unknown serve subcommand: ${n}
|
|
2413
2413
|
|
|
2414
2414
|
${IS.replace(/^error: [^\n]*\n\n/,"")}`),2):cq(t.slice(1),e)}async function cq(t,e){let n=jS(t,process.env);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
2415
2415
|
`),2;let r=Be({path:z()}),s={portCli:Eq(t)},i;try{i=$S({dal:r,cli:s,env:process.env,parsed:n,io:e})}catch(b){return r.close(),e.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
|
|
@@ -2418,7 +2418,7 @@ ${IS.replace(/^error: [^\n]*\n\n/,"")}`),2):cq(t.slice(1),e)}async function cq(t
|
|
|
2418
2418
|
`)}let l=n.noDaemon?void 0:pv({dal:r,intervalMs:ai()}),c=a!==void 0?{missing:[],tfstateCandidatesChecked:[]}:fi({env:process.env});c.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${c.missing.join(", ")}; running without cloud sync`+(c.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${c.tfstateCandidatesChecked.length} candidate path${c.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${c.tfstatePathUsed} did not supply the missing fields)`)+`
|
|
2419
2419
|
`);let d=await yq({log:b=>e.stderr.write(`${b}
|
|
2420
2420
|
`)}),u=new Ua({adapterFactory:yS,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:b=>e.stderr.write(`${b}
|
|
2421
|
-
`)}),f=
|
|
2421
|
+
`)}),f=ar()?.device_id,m=sv({dal:r,daemon:l,...c.config!==void 0?{webuiRuntimeConfig:hq(c.config,f)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:u,...a!==void 0?{localWebui:{webuiDir:a.webuiDir,localMailbox:{s3:a.s3,commands:a.commands}}}:{},authDisabled:n.insecureNoAuth}),p=process.env.LMCTL_USAGE_QUOTA_USD,_=p!==void 0&&p!==""?Number(p):NaN,h=Number.isFinite(_)&&_>0?_:void 0,g=await CS({dal:r,app:m,io:e,mailbox:c.config===void 0?void 0:{...c.config,cursorStore:r,chatLogTailStore:r,promptTriggerStore:r,usageStore:r,...h!==void 0?{usageQuotaUsd:h}:{},...f!==void 0?{deviceId:f}:{}},...a!==void 0?{localMailbox:{rootDir:a.rootDir,s3:a.s3,commands:a.commands,promptTriggerStore:r}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:u});await OS({dal:r,mailbox:g.mailbox,io:e});let{serve:y}=await import("@hono/node-server"),E=await new Promise((b,k)=>{let P,U=j=>k(j);P=y({fetch:m.fetch,port:i.port,hostname:n.bind},()=>{P.removeListener?.("error",U),b(P)}),P.once("error",U)}).catch(async b=>(l!==void 0&&await l.stop().catch(()=>{}),await g.stop().catch(()=>{}),d!==void 0&&await d.stop().catch(()=>{}),await u.stop().catch(()=>{}),r.close(),e.stderr.write(`error: could not bind ${n.bind}:${i.port}: ${b instanceof Error?b.message:String(b)}
|
|
2422
2422
|
`),null));if(E===null)return 2;e.stdout.write(`listening on ${n.bind}:${i.port}
|
|
2423
2423
|
`);let S=z();try{let b=al(S);b.running&&b.entry!==null&&b.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${b.entry.pid}, port ${b.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
|
|
2424
2424
|
`);let k=vS({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:n.bind,dbPath:S,startToken:SS()},S);e.stdout.write(`pidfile ${k} (pid ${process.pid})
|
|
@@ -2463,7 +2463,7 @@ ${IS.replace(/^error: [^\n]*\n\n/,"")}`),2):cq(t.slice(1),e)}async function cq(t
|
|
|
2463
2463
|
`)}catch(n){let r=n instanceof Error?n.message:String(n);t.io?.stderr.write(`[mailbox] WARNING: cloud mailbox auto-delivery is DISABLED; daemon continues without remote inbox relay: ${r}
|
|
2464
2464
|
`)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function $S(t){let{dal:e,cli:n,env:r,parsed:s,io:i}=t,o=[],a,l=e.getConfig("api.port");if(n.portCli!==void 0)a=n.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(r.LMCTL_API_PORT!==void 0&&r.LMCTL_API_PORT.length>0){let m=Number(r.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${r.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=e.getConfig("api.token");r.LMCTL_API_TOKEN!==void 0&&r.LMCTL_API_TOKEN.length>0?(c=r.LMCTL_API_TOKEN,d===null?o.push("api.token"):d!==c&&i.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this serve process.
|
|
2465
2465
|
`)):d!==null?c=d:(c=iq(32).toString("hex"),e.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=e.getConfig("api.url");f!==null?u=f:r.LMCTL_API_URL!==void 0&&r.LMCTL_API_URL.length>0?(u=r.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,e.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${gq(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
|
|
2466
|
-
`);return{port:a,apiUrl:u,apiToken:c}}function gq(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 yq(t){let e;try{e=await import("node-pty")}catch(n){let r=n instanceof Error?n.message:String(n);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${r})`);return}return new Fa({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function MS(t,e){let n=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(n===void 0)return null;let r=xS(n)?n:Xf(process.cwd(),n);return NS(`${r}/index.html`)?r:null}function DS(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?xS(e)?e:Xf(process.cwd(),e):Xf(oq(),".lmctl","local-mailbox")}function Eq(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let n=t[e+1];if(n!==void 0&&!n.startsWith("--")){let r=Number(n);if(Number.isInteger(r)&&r>0&&r<=65535)return r}}}function jS(t,e=process.env){let n=Tq(t);return typeof n=="string"?n:!wq(n.bind)&&!n.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${n.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:n}function wq(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let n=e.slice(7);return kS(n)===4&&n.split(".")[0]==="127"}return kS(e)===4&&e.split(".")[0]==="127"}function Tq(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let n=0;n<t.length;n+=1){let r=t[n];if(r==="--port"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;continue}if(r==="--bind"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(r==="--no-daemon"){e.noDaemon=!0;continue}if(r==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(r==="--webui"){let s=t[n+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},n+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${r}`}return e}var aq,IS,Jf,fq,pq,_q,FS=w(()=>{"use strict";ct();av();cf();gv();Va();cu();jf();mf();Zu();Qu();ES();Bf();qe()
|
|
2466
|
+
`);return{port:a,apiUrl:u,apiToken:c}}function gq(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 yq(t){let e;try{e=await import("node-pty")}catch(n){let r=n instanceof Error?n.message:String(n);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${r})`);return}return new Fa({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function MS(t,e){let n=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(n===void 0)return null;let r=xS(n)?n:Xf(process.cwd(),n);return NS(`${r}/index.html`)?r:null}function DS(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?xS(e)?e:Xf(process.cwd(),e):Xf(oq(),".lmctl","local-mailbox")}function Eq(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let n=t[e+1];if(n!==void 0&&!n.startsWith("--")){let r=Number(n);if(Number.isInteger(r)&&r>0&&r<=65535)return r}}}function jS(t,e=process.env){let n=Tq(t);return typeof n=="string"?n:!wq(n.bind)&&!n.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${n.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:n}function wq(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let n=e.slice(7);return kS(n)===4&&n.split(".")[0]==="127"}return kS(e)===4&&e.split(".")[0]==="127"}function Tq(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let n=0;n<t.length;n+=1){let r=t[n];if(r==="--port"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;continue}if(r==="--bind"){let s=t[++n];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(r==="--no-daemon"){e.noDaemon=!0;continue}if(r==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(r==="--webui"){let s=t[n+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},n+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${r}`}return e}var aq,IS,Jf,fq,pq,_q,FS=w(()=>{"use strict";ct();av();cf();gv();Va();cu();jf();mf();Zu();Qu();ES();Bf();qe();Mt();Xd();bS();aq=`usage: lmctl serve <start|status|stop> [options]
|
|
2467
2467
|
|
|
2468
2468
|
Manage the local lmctl daemon: HTTP API, web UI, queue daemon, terminal
|
|
2469
2469
|
manager, and agent services. A subcommand is REQUIRED \u2014 bare \`lmctl serve\`
|
|
@@ -2523,29 +2523,29 @@ Run 'lmctl serve --help' for details.
|
|
|
2523
2523
|
`)}function I(t,e){return t.stderr.write(`error: ${e}
|
|
2524
2524
|
`),1}function Ue(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
|
|
2525
2525
|
`),2}var Ce=w(()=>{"use strict";ct();qe()});import{createHash as vq}from"node:crypto";import{existsSync as US,readFileSync as WS,realpathSync as Sq}from"node:fs";import{dirname as bq,resolve as qS}from"node:path";function we(t,e){let n=qS(t);if(US(n))return Sq(n);if(e!==void 0){let r=Iq(t,n,e);if(r!==null)return r}return n}function cl(t,e){let n=bq(e),r=Of(t,Lf(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=qS(n,s.sessiondir));return r}function nt(t,e,n=r=>{process.stderr.write(`warning: ${r}
|
|
2526
|
-
`)}){let r=we(t,kq(e)?e:void 0);if(US(r)){let i=WS(r,"utf8"),o=cl(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&Nq(o)&&Aq(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (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 kq(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function Iq(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function Nq(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=Gf)}function Kf(t,e,n){let r=we(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=Gf);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=we(i.teamfile_path),o===r)continue;a=WS(o,"utf8")}catch(c){if(xq(c))continue;throw c}let l=cl(a,o);for(let c of s){let d=l.members.find(u=>u.teamfile===void 0&&u.session===c.session&&(u.session?.length??0)>=Gf);if(d!==void 0)throw new ll(`sessionid ownership conflict: ${r}:${c.alias} and ${o}:${d.alias} both use sessionid "${c.session}"`)}}}function xq(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function Aq(t,e,n,r,s){try{Kf(t,e,n)}catch(o){if(!(o instanceof ll))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:vq("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var Gf,ll,Gt=w(()=>{"use strict";Xt();Gf=5,ll=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as Rq}from"node:fs";import{dirname as BS}from"node:path";function Cq(t){return Lq.test(t)||Oq.test(t)}function HS(t){return dl.test(t)}function
|
|
2526
|
+
`)}){let r=we(t,kq(e)?e:void 0);if(US(r)){let i=WS(r,"utf8"),o=cl(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&Nq(o)&&Aq(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (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 kq(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function Iq(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function Nq(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=Gf)}function Kf(t,e,n){let r=we(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=Gf);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=we(i.teamfile_path),o===r)continue;a=WS(o,"utf8")}catch(c){if(xq(c))continue;throw c}let l=cl(a,o);for(let c of s){let d=l.members.find(u=>u.teamfile===void 0&&u.session===c.session&&(u.session?.length??0)>=Gf);if(d!==void 0)throw new ll(`sessionid ownership conflict: ${r}:${c.alias} and ${o}:${d.alias} both use sessionid "${c.session}"`)}}}function xq(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function Aq(t,e,n,r,s){try{Kf(t,e,n)}catch(o){if(!(o instanceof ll))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:vq("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var Gf,ll,Gt=w(()=>{"use strict";Xt();Gf=5,ll=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as Rq}from"node:fs";import{dirname as BS}from"node:path";function Cq(t){return Lq.test(t)||Oq.test(t)}function HS(t){return dl.test(t)}function lr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!n.endsWith(".lmctl")||!dl.test(r)?null:{teamfile:n,alias:r}}function Xe(t,e,n){if(!t.endsWith(".lmctl"))throw new be(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!HS(e))throw new be(`lmctl: "${e}" is not a valid alias (must match ${dl.source}).`);let r=we(t,n);if(n===void 0&&!Rq(r))throw new be(`lmctl: teamfile not found: ${t}`);let s;try{s=nt(r,n)}catch(o){throw new be(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new be(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=Qv(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new be(`lmctl: alias "${e}" not found in ${t}.
|
|
2527
2527
|
Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=$f(i,BS(r));return{teamfile:r,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 be(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
|
|
2528
|
-
Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??BS(r),isLead:pt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function Kt(t,e){let{target:n,alias:r,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${n}" \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(n!==void 0){let o=
|
|
2528
|
+
Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??BS(r),isLead:pt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function Kt(t,e){let{target:n,alias:r,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${n}" \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(n!==void 0){let o=lr(n);if(o!==null)return r!==void 0&&r!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${n}" AND second positional "${r}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(n.endsWith(".lmctl"))return r!==void 0?HS(r)?{mode:"ai-team",teamfile:n,alias:r}:{mode:"error",message:`lmctl ${t.name}: "${r}" is not a valid alias (must match ${dl.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:n}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
2529
2529
|
Use: lmctl ${t.name} ${n}:<alias> or lmctl ${t.name} ${n} <alias>`};if(Cq(n)){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${r}" but "${n}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${n}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:n};return s.provider!==void 0&&(a.provider=s.provider),a}return r!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${r}" but "${n}" is not a teamfile path.
|
|
2530
2530
|
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 "${n}".
|
|
2531
2531
|
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.
|
|
2532
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var be,Lq,Oq,dl,
|
|
2533
|
-
`,"utf8"),_t.renameSync(n,t)}catch(r){try{_t.unlinkSync(n)}catch{}throw r}}function Bq(t,e){_t.mkdirSync(mi(t),{recursive:!0});let n=ze(mi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{_t.writeFileSync(n,e,"utf8"),_t.renameSync(n,t)}catch(r){try{_t.unlinkSync(n)}catch{}throw r}}function Vt(t,e,n){try{if(!_t.existsSync(t))return;let r=JSON.parse(_t.readFileSync(t,"utf8"));if(!ns(r)||!ns(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,qq(t,r),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function
|
|
2534
|
-
`)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function XS(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function Jq(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=YS(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=Gq(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ul&&c[1]!==fl)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=zS(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=Vq(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let r=new Set;for(let[s,i]of e.entries())s===ul&&QS(i.command,i.args)&&r.add(s),s===fl&&eb(i.command,i.args)&&r.add(s);return r}function Gq(t,e){if(t.startsWith("mcp_servers"))return ml(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=ml(t);return n===null?null:[...e,...n]}function YS(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:ml(e[1])}function Kq(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return ml(n)}function ml(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function zS(t){let e=ZS(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function Vq(t){let e=ZS(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>zS(s.trim()));return r.some(s=>s===null)?null:r}function ZS(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Yq(t){return ns(t)?t.type==="stdio"&&typeof t.command=="string"&&QS(t.command,t.args):!1}function zq(t){return!ns(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&nb(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"&&tb(t.command[0],[t.command[1],t.command[2]])}function Zq(t){return ns(t)?t.type==="stdio"&&eb(t.command,t.args):!1}function Qq(t){return!ns(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&rb(t.command[0])&&t.command[1]==="mcp"}function QS(t,e){return nb(t)&&sb(e)||tb(t,e)}function eb(t,e){return rb(t)&&sb(e)}function tb(t,e){return eB(t)&&Array.isArray(e)&&e.length===2&&tB(e[0])&&e[1]==="mcp"}function nb(t){return typeof t=="string"&&Yf(t)==="lmctl"}function rb(t){return typeof t=="string"&&Yf(t)==="lmctl0"}function eB(t){if(typeof t!="string")return!1;let e=Yf(t).toLowerCase();return e==="node"||e==="node.exe"}function tB(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 Yf(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function sb(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function ns(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ul,fl,Wq,_t,Vf,pi=w(()=>{"use strict";ce();ul="lmctl",fl="lmctl0",Wq={existsSync:$q,mkdirSync:Mq,readFileSync:Dq,writeFileSync:Fq,renameSync:jq,unlinkSync:Pq},_t=Wq});function ab(t){let e=ib(t.registry,t.fromTeamfile);if(e===void 0)return ss(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ob(e,t.fromAlias))return ss(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let n=ib(t.registry,t.toTeamfile);return n===void 0?ss(`target team is not registered in policy graph: ${t.toTeamfile}`):ob(n,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 ib(t,e){return t.teams.find(n=>n.teamfile===e)}function ob(t,e){return t.aliases.some(n=>n===e)}function ss(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=w(()=>{"use strict"});import{basename as nB}from"node:path";function ub(t,e){let n=new Date(e.now.getTime()-is()).toISOString(),r=pb(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=oB(e.sender,r),i=aB(e.sender,r);i!==null&&i.teamfile===e.root&&!db(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=>db(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,d=c!==null&&e.now.getTime()-c<rB,u=zf(e.sender,r).length;return{stop:l.length>=1&&d&&u>=sB,chain:lB(a)}}function fb(t,e){let n=new Date(e.now.getTime()-is()).toISOString(),r=pb(t,n),s=zf(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function is(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cb;let n=Number(e);return!Number.isFinite(n)||n<=0?cb:n}function mb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function iB(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function pb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(iB).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function oB(t,e,n={}){let r=new Map;for(let a of e)r.set(lr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([lr(t)]);for(let a=0;a<64;a+=1){let l=r.get(lr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=lr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function zf(t,e){let n=lr(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=lr(l.sender),d=lr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(d)||(r.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function aB(t,e){let n=zf(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function db(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function lr(t){return`${t.teamfile}\0${t.alias}`}function lB(t){return t.map(e=>`${nB(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var rB,sB,cb,Zf=w(()=>{"use strict";rB=6e4,sB=2,cb=8*60*60*1e3});function pl(t){return dB.has(t)}function em(){return Qf===null&&(Qf=Dt(Ut())),Qf}function tm(t,e,n={}){if(!pl(t))return null;try{let r=em().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?oo({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?cB[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,..._b[t]??[]]}catch{return null}}function _l(t,e,n={}){let r=tm(t,e,n);return r===null?null:r.join(" ")}function $e(t,e){return em().getSession(t,e)}async function jn(t){return(await em().resolveSessions(t)).map(n=>n.provider.name)}var _b,cB,dB,hb,Qf,xt=w(()=>{"use strict";ut();vc();_b={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},cB={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]},dB=new Set(Object.keys(_b)),hb=/^[\w.:-]+$/;Qf=null});function uB(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return gb;let n=Number(e);return!Number.isFinite(n)||n<=0?gb:n}async function fB(t,e,n){try{let r=Xe(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await jn(s);if(c.length!==1)return null;i=c[0]}let o=await $e(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 yb(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??uB(),o=await fB(t,n,r),a=o!==null&&o>=i;return a&&M({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,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 gb,Eb=w(()=>{"use strict";ce();xt();Nt();gb=36e5});function mB(t){return t===null?null:ke(t)?"live":"dead"}function nm(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:mB(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function pB(t){let e=Math.floor(t/1e3),n=Math.floor(e/3600),r=Math.floor(e%3600/60),s=e%60;return n>0?`${n}h ${String(r).padStart(2,"0")}m`:r>0?`${r}m ${String(s).padStart(2,"0")}s`:`${s}s`}function rm(t){let e=[];return t.idle_ms!==null&&e.push(`active ${pB(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var wb=w(()=>{"use strict";$t()});import{randomUUID as _B}from"node:crypto";import{hostname as Tb,networkInterfaces as hB}from"node:os";function vb(t){let e=(t.now??new Date).toISOString();return{lock_id:_B(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Tb(),holder_ips:t.ips??TB(),started_at:e,last_heartbeat:e}}function Sb(t=process.env){return bb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,gB)}function EB(t=process.env){return bb(t.LMCTL_TERMINAL_LOCK_STALE_MS,yB)}function sm(t,e={}){let n=e.now??new Date,r=e.localHost??Tb(),s=e.staleMs??EB();if(t.holder_host===r)return(e.isProcessAlive??wB)(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)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function im(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function bb(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function wB(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 TB(){let t=new Set;for(let e of Object.values(hB()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var gB,yB,om=w(()=>{"use strict";gB=15e3,yB=12e4});function am(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2532
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var be,Lq,Oq,dl,xt=w(()=>{"use strict";Xt();Gt();be=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},Lq=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Oq=/^ses_[A-Za-z0-9_-]+$/,dl=/^[A-Za-z][A-Za-z0-9_-]*$/});import{existsSync as $q,mkdirSync as Mq,readFileSync as Dq,renameSync as jq,unlinkSync as Pq,writeFileSync as Fq}from"node:fs";import{homedir as JS}from"node:os";import{dirname as mi,join as ze,resolve as Uq}from"node:path";function rs(t,e,n){let r=mi(Uq(n)),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??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Vt(ze(o,".mcp.json"),"mcpServers",[Dn(),jn()]),a.has("opencode")&&Vt(ze(o,".opencode","opencode.json"),"mcp",[KS(),VS()]),a.has("kimi")&&Vt(ze(o,".kimi-code","mcp.json"),"mcpServers",[Dn(),jn()]);for(let o of s)Hq(o)}function GS(t=Vf??JS()){return ze(t,".copilot","mcp-config.json")}function qq(t,e){_t.mkdirSync(mi(t),{recursive:!0});let n=ze(mi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{_t.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
2533
|
+
`,"utf8"),_t.renameSync(n,t)}catch(r){try{_t.unlinkSync(n)}catch{}throw r}}function Bq(t,e){_t.mkdirSync(mi(t),{recursive:!0});let n=ze(mi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{_t.writeFileSync(n,e,"utf8"),_t.renameSync(n,t)}catch(r){try{_t.unlinkSync(n)}catch{}throw r}}function Vt(t,e,n){try{if(!_t.existsSync(t))return;let r=JSON.parse(_t.readFileSync(t,"utf8"));if(!ns(r)||!ns(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,qq(t,r),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Dn(){return{name:fl,shouldRemove:Zq}}function KS(){return{name:fl,shouldRemove:Qq}}function jn(){return{name:ul,shouldRemove:Yq}}function VS(){return{name:ul,shouldRemove:zq}}function Hq(t){let e=Vf??JS();switch(t){case"copilot":Vt(GS(e),"mcpServers",[Dn(),jn()]);return;case"claude":Vt(ze(e,".claude.json"),"mcpServers",[Dn(),jn()]);return;case"gemini":Vt(ze(e,".gemini","settings.json"),"mcpServers",[Dn(),jn()]);return;case"qwen":Vt(ze(e,".qwen","settings.json"),"mcpServers",[Dn(),jn()]);return;case"agy":Vt(ze(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Dn(),jn()]);return;case"opencode":Vt(ze(e,".config","opencode","opencode.json"),"mcp",[KS(),VS()]);return;case"kimi":Vt(ze(Vf===void 0?process.env.KIMI_CODE_HOME??ze(e,".kimi-code"):ze(e,".kimi-code"),"mcp.json"),"mcpServers",[Dn(),jn()]);return;case"codex":Xq(ze(e,".codex","config.toml"));return;default:return}}function Xq(t){try{if(!_t.existsSync(t))return;let e=_t.readFileSync(t,"utf8"),n=Jq(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=YS(l);if(c===null)return;if(c!==void 0){if(XS(c,n)){o=!0,a=c[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 d=Kq(l);if(d===null)return;if(d!==void 0&&XS(d,n)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;Bq(t,s.join(`
|
|
2534
|
+
`)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function XS(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function Jq(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=YS(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=Gq(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ul&&c[1]!==fl)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=zS(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=Vq(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let r=new Set;for(let[s,i]of e.entries())s===ul&&QS(i.command,i.args)&&r.add(s),s===fl&&eb(i.command,i.args)&&r.add(s);return r}function Gq(t,e){if(t.startsWith("mcp_servers"))return ml(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=ml(t);return n===null?null:[...e,...n]}function YS(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:ml(e[1])}function Kq(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return ml(n)}function ml(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function zS(t){let e=ZS(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function Vq(t){let e=ZS(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>zS(s.trim()));return r.some(s=>s===null)?null:r}function ZS(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Yq(t){return ns(t)?t.type==="stdio"&&typeof t.command=="string"&&QS(t.command,t.args):!1}function zq(t){return!ns(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&nb(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"&&tb(t.command[0],[t.command[1],t.command[2]])}function Zq(t){return ns(t)?t.type==="stdio"&&eb(t.command,t.args):!1}function Qq(t){return!ns(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&rb(t.command[0])&&t.command[1]==="mcp"}function QS(t,e){return nb(t)&&sb(e)||tb(t,e)}function eb(t,e){return rb(t)&&sb(e)}function tb(t,e){return eB(t)&&Array.isArray(e)&&e.length===2&&tB(e[0])&&e[1]==="mcp"}function nb(t){return typeof t=="string"&&Yf(t)==="lmctl"}function rb(t){return typeof t=="string"&&Yf(t)==="lmctl0"}function eB(t){if(typeof t!="string")return!1;let e=Yf(t).toLowerCase();return e==="node"||e==="node.exe"}function tB(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 Yf(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function sb(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function ns(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ul,fl,Wq,_t,Vf,pi=w(()=>{"use strict";ce();ul="lmctl",fl="lmctl0",Wq={existsSync:$q,mkdirSync:Mq,readFileSync:Dq,writeFileSync:Fq,renameSync:jq,unlinkSync:Pq},_t=Wq});function ab(t){let e=ib(t.registry,t.fromTeamfile);if(e===void 0)return ss(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ob(e,t.fromAlias))return ss(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let n=ib(t.registry,t.toTeamfile);return n===void 0?ss(`target team is not registered in policy graph: ${t.toTeamfile}`):ob(n,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 ib(t,e){return t.teams.find(n=>n.teamfile===e)}function ob(t,e){return t.aliases.some(n=>n===e)}function ss(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=w(()=>{"use strict"});import{basename as nB}from"node:path";function ub(t,e){let n=new Date(e.now.getTime()-is()).toISOString(),r=pb(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=oB(e.sender,r),i=aB(e.sender,r);i!==null&&i.teamfile===e.root&&!db(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=>db(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,d=c!==null&&e.now.getTime()-c<rB,u=zf(e.sender,r).length;return{stop:l.length>=1&&d&&u>=sB,chain:lB(a)}}function fb(t,e){let n=new Date(e.now.getTime()-is()).toISOString(),r=pb(t,n),s=zf(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function is(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cb;let n=Number(e);return!Number.isFinite(n)||n<=0?cb:n}function mb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function iB(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function pb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(iB).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function oB(t,e,n={}){let r=new Map;for(let a of e)r.set(cr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([cr(t)]);for(let a=0;a<64;a+=1){let l=r.get(cr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=cr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function zf(t,e){let n=cr(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=cr(l.sender),d=cr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(d)||(r.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function aB(t,e){let n=zf(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function db(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function cr(t){return`${t.teamfile}\0${t.alias}`}function lB(t){return t.map(e=>`${nB(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var rB,sB,cb,Zf=w(()=>{"use strict";rB=6e4,sB=2,cb=8*60*60*1e3});function pl(t){return dB.has(t)}function em(){return Qf===null&&(Qf=Dt(Ut())),Qf}function tm(t,e,n={}){if(!pl(t))return null;try{let r=em().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?oo({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?cB[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,..._b[t]??[]]}catch{return null}}function _l(t,e,n={}){let r=tm(t,e,n);return r===null?null:r.join(" ")}function $e(t,e){return em().getSession(t,e)}async function Pn(t){return(await em().resolveSessions(t)).map(n=>n.provider.name)}var _b,cB,dB,hb,Qf,At=w(()=>{"use strict";ut();vc();_b={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},cB={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]},dB=new Set(Object.keys(_b)),hb=/^[\w.:-]+$/;Qf=null});function uB(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return gb;let n=Number(e);return!Number.isFinite(n)||n<=0?gb:n}async function fB(t,e,n){try{let r=Xe(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await Pn(s);if(c.length!==1)return null;i=c[0]}let o=await $e(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 yb(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??uB(),o=await fB(t,n,r),a=o!==null&&o>=i;return a&&M({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,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 gb,Eb=w(()=>{"use strict";ce();At();xt();gb=36e5});function mB(t){return t===null?null:ke(t)?"live":"dead"}function nm(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:mB(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function pB(t){let e=Math.floor(t/1e3),n=Math.floor(e/3600),r=Math.floor(e%3600/60),s=e%60;return n>0?`${n}h ${String(r).padStart(2,"0")}m`:r>0?`${r}m ${String(s).padStart(2,"0")}s`:`${s}s`}function rm(t){let e=[];return t.idle_ms!==null&&e.push(`active ${pB(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var wb=w(()=>{"use strict";Mt()});import{randomUUID as _B}from"node:crypto";import{hostname as Tb,networkInterfaces as hB}from"node:os";function vb(t){let e=(t.now??new Date).toISOString();return{lock_id:_B(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Tb(),holder_ips:t.ips??TB(),started_at:e,last_heartbeat:e}}function Sb(t=process.env){return bb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,gB)}function EB(t=process.env){return bb(t.LMCTL_TERMINAL_LOCK_STALE_MS,yB)}function sm(t,e={}){let n=e.now??new Date,r=e.localHost??Tb(),s=e.staleMs??EB();if(t.holder_host===r)return(e.isProcessAlive??wB)(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)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function im(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function bb(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function wB(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 TB(){let t=new Set;for(let e of Object.values(hB()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var gB,yB,om=w(()=>{"use strict";gB=15e3,yB=12e4});function am(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2535
2535
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
2536
2536
|
not officially supported.
|
|
2537
2537
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function fn(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
2538
2538
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
2539
2539
|
Consulted ${ps(z())}
|
|
2540
2540
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function kb(t){return`unknown option --from
|
|
2541
|
-
${am(t)}`}function Ib(t,e){let n=
|
|
2542
|
-
`)}function IB(t){return`${t.teamfile}:${t.alias}`}var wne,vB,SB,xb=w(()=>{"use strict";ut();ce();ct();qe()
|
|
2543
|
-
`}),i=await LB(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:_,rootTeamfile:h,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=MB(n,i);try{rs(n,Fe(m),m)}catch{}r={root_teamfile:h,sender_teamfile:_?.teamfile??null,sender_alias:_?.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 $b(n,m,f.alias);if(y!==null){let A=im(y);return os(i,r,t.prompt,A,"unavailable"),d=lm(A,null),{status:"busy",message:A,teamChatLogId:null}}let E=await xB(n,m,f.alias);if(E.busy){let A=await AB(n,m,f.alias);return A+=await RB(n,m,f.alias),os(i,r,t.prompt,A,"unavailable"),d=lm(A,null),{status:"busy",message:A,teamChatLogId:null}}if(_!==null&&_.teamfile!==m){let A=await O(n,R=>ub(R,{root:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(A.stop){let R=mb(A.chain);return os(i,r,t.prompt,R,"cycle"),d=gl(R,null),{status:"error",errorKind:"cycle",message:R,teamChatLogId:null,messageId:null}}}let S=await BB(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:_?.teamfile??m,sender_alias:_?.alias??"operator",...E.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let A=Mb(m,f.alias,S.current);return A+=` ${rm(nm({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,os(i,r,t.prompt,A,"unavailable"),d=lm(A,null),{status:"busy",message:A,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=qi(A=>O(n,R=>R.heartbeatAgentInflight(s.row,s.leaseId,A)),{intervalMs:Ob,onError:A=>{le()&&Me(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:A instanceof Error?A.message:String(A)}))}});let b=await Nb({sender:_??{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:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:A=>e({kind:"delta",chunk:A}),onProgress:A=>e({kind:"progress",alias:f.alias,event:A}),onPromptBuilt:async A=>{u=A,l===null&&(l=await XB(n,{...r,message:A}),l!==null&&(t.onAccepted?.(Qt(l)),i!==null&&await $B(n,i,l))),i!==null&&await CB(n,i,A)}});u=b.prompt;let k=b.status==="stalled",P=null,U=k?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:b.status==="error"?b.error??b.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,j=k||b.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await Lb(n,l,{...r,message:u,response:b.receipt,status:j,error_detail:U}),c=!0,P=l):P=await GB(n,{...r,message:u,response:b.receipt,status:j,error_detail:U}),k){let A=U;os(i,r,u,A,"error"),d=gl(A,P,b.receipt)}else d=DB(b.receipt,P);return{status:k?"stalled":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:P,messageId:P===null?null:Qt(P),durationMs:b.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await Lb(n,l,{...r,message:u,response:null,status:"error",error_detail:m}),c=!0),os(i,r,u,m,"error"),d=gl(m,l),{status:"error",errorKind:f instanceof be?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:Qt(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await JB(n,r,Qt(l)),s!==null&&await HB(n,s.row,s.leaseId),i!==null&&await OB(n,i,d??gl("chat turn exited without a terminal outcome",null))}}function NB(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function xB(t,e,n){let r=await O(t,i=>(Ev(i,e,n),
|
|
2541
|
+
${am(t)}`}function Ib(t,e){let n=dr(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function dr(t,e){let n=t[As];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=nt(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];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=w(()=>{"use strict";Et();qe();Gt()});function De(t){let e=lr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var hl=w(()=>{"use strict";xt()});function bB(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Be({path:z()})),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&&ke(a.holder_pid)),pollMs:vB,settleMs:SB,maxHoldMs:En(n),onHold:()=>M({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&M({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Nb(t){let e=kB(t.newMessage,{newMessageFrom:t.newMessageFrom??IB(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=le(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),a.holdOpen=bB(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await sn(a);return r&&Me(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs}}function kB(t,e={}){return[`--- new message (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
|
|
2542
|
+
`)}function IB(t){return`${t.teamfile}:${t.alias}`}var wne,vB,SB,xb=w(()=>{"use strict";ut();ce();ct();qe();Mt();gt();wne=60*60*1e3,vB=2e3,SB=5e3});async function Cb(t){let e=t.onEvent??(()=>{}),n=NB(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,d=null,u=t.prompt;try{let f=await O(n,A=>Xe(t.teamfile,t.alias,A)),m=f.teamfile,p=await O(n,A=>PB(A,t.env??process.env)),_=p.sender,h=await FB(n,{explicitRoot:t.rootFlag,sender:_,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),g=_===null?null:await UB(n,{rootTeamfile:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias});g!==null&&!g.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${g.reason}
|
|
2543
|
+
`}),i=await LB(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:_,rootTeamfile:h,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=MB(n,i);try{rs(n,Fe(m),m)}catch{}r={root_teamfile:h,sender_teamfile:_?.teamfile??null,sender_alias:_?.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 $b(n,m,f.alias);if(y!==null){let A=im(y);return os(i,r,t.prompt,A,"unavailable"),d=lm(A,null),{status:"busy",message:A,teamChatLogId:null}}let E=await xB(n,m,f.alias);if(E.busy){let A=await AB(n,m,f.alias);return A+=await RB(n,m,f.alias),os(i,r,t.prompt,A,"unavailable"),d=lm(A,null),{status:"busy",message:A,teamChatLogId:null}}if(_!==null&&_.teamfile!==m){let A=await O(n,R=>ub(R,{root:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(A.stop){let R=mb(A.chain);return os(i,r,t.prompt,R,"cycle"),d=gl(R,null),{status:"error",errorKind:"cycle",message:R,teamChatLogId:null,messageId:null}}}let S=await BB(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:_?.teamfile??m,sender_alias:_?.alias??"operator",...E.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let A=Mb(m,f.alias,S.current);return A+=` ${rm(nm({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,os(i,r,t.prompt,A,"unavailable"),d=lm(A,null),{status:"busy",message:A,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=qi(A=>O(n,R=>R.heartbeatAgentInflight(s.row,s.leaseId,A)),{intervalMs:Ob,onError:A=>{le()&&Me(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:A instanceof Error?A.message:String(A)}))}});let b=await Nb({sender:_??{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:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:A=>e({kind:"delta",chunk:A}),onProgress:A=>e({kind:"progress",alias:f.alias,event:A}),onPromptBuilt:async A=>{u=A,l===null&&(l=await XB(n,{...r,message:A}),l!==null&&(t.onAccepted?.(Qt(l)),i!==null&&await $B(n,i,l))),i!==null&&await CB(n,i,A)}});u=b.prompt;let k=b.status==="stalled",P=null,U=k?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:b.status==="error"?b.error??b.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,j=k||b.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await Lb(n,l,{...r,message:u,response:b.receipt,status:j,error_detail:U}),c=!0,P=l):P=await GB(n,{...r,message:u,response:b.receipt,status:j,error_detail:U}),k){let A=U;os(i,r,u,A,"error"),d=gl(A,P,b.receipt)}else d=DB(b.receipt,P);return{status:k?"stalled":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:P,messageId:P===null?null:Qt(P),durationMs:b.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await Lb(n,l,{...r,message:u,response:null,status:"error",error_detail:m}),c=!0),os(i,r,u,m,"error"),d=gl(m,l),{status:"error",errorKind:f instanceof be?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:Qt(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await JB(n,r,Qt(l)),s!==null&&await HB(n,s.row,s.leaseId),i!==null&&await OB(n,i,d??gl("chat turn exited without a terminal outcome",null))}}function NB(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function xB(t,e,n){let r=await O(t,i=>(Ev(i,e,n),Tr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>yb(i,r,e,n));return{busy:!s,idleReclaim:s}}async function AB(t,e,n){let r=await $b(t,e,n);if(r!==null)return im(r);let s=await O(t,i=>i.getAgentInflight(e,n));return s!==null?Mb(e,n,s):`${n} is busy; wait and retry`}async function RB(t,e,n){let r=await O(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${rm(nm({holderPid:r.holder_pid,since:r.started_at}))}`}async function LB(t,e){try{return(await O(t,r=>r.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:jB(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(n){return le()&&Me(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function OB(t,e,n){try{await O(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){le()&&Me(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function CB(t,e,n){try{await O(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){le()&&Me(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function $B(t,e,n){try{await O(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){le()&&Me(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function MB(t,e){if(e===null)return;let n=setInterval(()=>{O(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{le()&&Me(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},Ob);return n.unref?.(),n}function DB(t,e){return{status:"done",result_summary:hi(t),error:null,team_chat_log_id:e}}function lm(t,e){return{status:"busy",result_summary:hi(t),error:t,team_chat_log_id:e}}function gl(t,e,n){return{status:"error",result_summary:hi(n===void 0?t:n),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 jB(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function PB(t,e){let n=Ib(e,t);if(n.ok)return{sender:De(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(fn("chat"))}async function FB(t,e){if(e.explicitRoot!==void 0)return await O(t,r=>we(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await O(t,r=>fb(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function UB(t,e){return await O(t,n=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:WB(n,e.sender.teamfile,e.receiverTeamfile)}))}function WB(t,e,n){return{teams:[e,n].map(s=>qB(s,t))}}function qB(t,e){let n=nt(t,e),r=pt(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function BB(t,e){return await O(t,n=>{let r=le(),s=wr(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:is(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Me(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:Rb(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Me(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:Rb(s.current)})),{acquired:!1,current:s.current})})}async function $b(t,e,n){return await O(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(sm(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:sm(s).live?s:null})}function Rb(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 HB(t,e,n){try{await O(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
2544
2544
|
`)}}function Mb(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function XB(t,e){let n=gi(e.message);try{return await O(t,r=>r.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:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
|
|
2545
2545
|
`),null}}async function Lb(t,e,n){let r=gi(n.message),s=n.response===null?null:gi(n.response);try{await O(t,i=>i.finishTeamChatLog(e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.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)}
|
|
2546
2546
|
`)}}async function JB(t,e,n){if(e!==null)try{await O(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
|
|
2547
2547
|
`)}}async function GB(t,e){let n=gi(e.message),r=e.response===null?null:gi(e.response);try{return await O(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
2548
|
-
`),null}}function os(t,e,n,r,s){t!==null||e===null||M({event:"chat_attempt_error",reason:s,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,origin:e.origin,error_detail:r,message_preview:hi(n)})}function gi(t){return t.length<=Ab?{text:t,truncated:!1}:{text:t.slice(0,Ab),truncated:!0}}var Ab,Ob,Db=w(()=>{"use strict";
|
|
2548
|
+
`),null}}function os(t,e,n,r,s){t!==null||e===null||M({event:"chat_attempt_error",reason:s,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,origin:e.origin,error_detail:r,message_preview:hi(n)})}function gi(t){return t.length<=Ab?{text:t,truncated:!1}:{text:t.slice(0,Ab),truncated:!0}}var Ab,Ob,Db=w(()=>{"use strict";xt();Xt();pi();lb();Gt();Zf();ce();Ce();gt();Va();Eb();wb();om();_i();hl();xb();bs();Ab=256*1024,Ob=3e4});var qb={};me(qb,{parseIdleTimeoutMs:()=>Ub,resolvePromptInput:()=>Fb,runChat:()=>YB});import{readFileSync as KB}from"node:fs";async function YB(t,e={stdout:process.stdout,stderr:process.stderr}){let n=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${jb}
|
|
2549
2549
|
`),t.length===0?2:0;let r=zB(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2550
2550
|
${jb}
|
|
2551
2551
|
`),2;if(r.promptFile!==void 0){let u=await Fb(r.promptFile,e);if(typeof u!="string")return e.stderr.write(`error: ${u.error}
|
|
@@ -2583,7 +2583,7 @@ ${jb}
|
|
|
2583
2583
|
`),1}}function Pb(t){return`${t}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function zB(t){let e=[],n="yolo",r,s,i,o,a,l,c=!1,d=!1,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --permission-mode";if(y!=="plan"&&y!=="yolo")return`--permission-mode must be one of plan|yolo (got "${y}")`;n=y;continue}if(g==="--idle-timeout"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --idle-timeout";let E=Ub(y);if(typeof E=="string")return E;r=E;continue}if(g==="--session"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --session";s=y;continue}if(g==="--provider"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --provider";i=y;continue}if(g==="--from"||g.startsWith("--from="))return kb("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --root";o=y;continue}if(g==="--prompt-file"){let y=t[++h];if(y===void 0||y!=="-"&&y.startsWith("--"))return"missing value for --prompt-file";a=y;continue}if(g==="--force"||g.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(g==="--json"){d=!0;continue}if(g==="--verbose"){u=!0;continue}if(g==="--run"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --run";l=y;continue}if(g==="--done"){c=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let h={prompt:a!==void 0?"":e[0],permissionMode:n,runFlag:l,done:c,json:d,verbose:u};return a!==void 0&&(h.promptFile=a),h}let f,m,p;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)f=e[0];else if(e.length===2)f=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";p=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=e[0]}else if(e.length===2)f=e[0],p=e[1];else if(e.length===3)f=e[0],m=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let _={prompt:p,permissionMode:n};return f!==void 0&&(_.target=f),m!==void 0&&(_.alias=m),r!==void 0&&(_.idleTimeoutMs=r),s!==void 0&&(_.sessionFlag=s),i!==void 0&&(_.providerFlag=i),o!==void 0&&(_.rootFlag=o),a!==void 0&&(_.promptFile=a),d&&(_.json=d),u&&(_.verbose=u),_}async function Fb(t,e,n=process.stdin){let r;try{r=t==="-"?await ZB(n):KB(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=r.endsWith(`\r
|
|
2584
2584
|
`)?r.slice(0,-2):r.endsWith(`
|
|
2585
2585
|
`)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function ZB(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function Ub(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let n=Number(e[1]),r=e[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function Wb(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;M({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
|
|
2586
|
-
`)}function QB(t,e){return t.slice(-e)}function eH(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Wb(t,e.alias,e.event,n):t.stderr.write(e.message)}var VB,jb,Bb=w(()=>{"use strict";ut();Ce();
|
|
2586
|
+
`)}function QB(t,e){return t.slice(-e)}function eH(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Wb(t,e.alias,e.event,n):t.stderr.write(e.message)}var VB,jb,Bb=w(()=>{"use strict";ut();Ce();xt();Db();_i();ce();qa();on();VB={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},jb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2587
2587
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
2588
2588
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
2589
2589
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -2610,7 +2610,7 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
|
|
|
2610
2610
|
where unconditional narration would bleed into unrelated output).
|
|
2611
2611
|
|
|
2612
2612
|
Send a prompt to a team member or raw provider session, or answer a paused run.`});function yi(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2],o=i==="s"?s:i==="m"?s*60:i==="h"?s*3600:s*86400;return{date:new Date(Date.now()-o*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var cm=w(()=>{"use strict"});var Yb={};me(Yb,{buildSessionInspection:()=>wi,deriveToolCalls:()=>yl,runSession:()=>aH});async function aH(t,e,n=sH){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Gb}
|
|
2613
|
-
`),0;let r=Z(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return lt(e,r.error,!0);let s=yi($(r,"--since"),"--since");if("error"in s)return lt(e,s.error,!0);let i=yi($(r,"--until"),"--until");if("error"in i)return lt(e,i.error,!0);let o=$(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return lt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=Kt(tH,{target:r.positionals[0],alias:r.positionals[1],flags:{session:$(r,"--session"),provider:$(r,"--provider")}});if(l.mode==="error")return lt(e,l.message,!0);if(l.mode==="managed")return lt(e,"session does not support managed-mode targets",!0);let c,d,u,f;try{if(l.mode==="ai-team"){f=l.teamfile;let g=l.alias??await n.resolveLeadAlias(l.teamfile,e),y=await n.resolveTeamTarget(l.teamfile,g,e);c=y.provider,d=y.sessionid,u=y.alias}else if(d=l.sessionid,l.provider!==void 0)c=l.provider;else{let g=await
|
|
2613
|
+
`),0;let r=Z(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return lt(e,r.error,!0);let s=yi($(r,"--since"),"--since");if("error"in s)return lt(e,s.error,!0);let i=yi($(r,"--until"),"--until");if("error"in i)return lt(e,i.error,!0);let o=$(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return lt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=Kt(tH,{target:r.positionals[0],alias:r.positionals[1],flags:{session:$(r,"--session"),provider:$(r,"--provider")}});if(l.mode==="error")return lt(e,l.message,!0);if(l.mode==="managed")return lt(e,"session does not support managed-mode targets",!0);let c,d,u,f;try{if(l.mode==="ai-team"){f=l.teamfile;let g=l.alias??await n.resolveLeadAlias(l.teamfile,e),y=await n.resolveTeamTarget(l.teamfile,g,e);c=y.provider,d=y.sessionid,u=y.alias}else if(d=l.sessionid,l.provider!==void 0)c=l.provider;else{let g=await Pn(d);if(g.length===0)return lt(e,`session "${d}" not found in any provider store`,!0);if(g.length>1)return lt(e,`session "${d}" matches multiple providers (${g.join(", ")}); pass --provider`,!0);c=g[0]}}catch(g){return g instanceof be?lt(e,g.message,!0):lt(e,dm(g))}let m;try{m=await n.loadSession(d,c)}catch(g){return lt(e,`failed to load session: ${dm(g)}`)}if(m===null)return lt(e,`session not found: ${d} (provider=${c})`);let p=s.date?.getTime(),_=i.date?.getTime(),h=[];if(f!==void 0&&u!==void 0)try{h=await n.listInvocations(f,u,{sinceMs:p,untilMs:_},e)}catch(g){return lt(e,`failed to load invocation history: ${dm(g)}`)}return Y(e,wi(m,u,{invocations:h,sinceMs:p,untilMs:_,limit:a})),0}function wi(t,e,n={}){let r=yH(t.messages),s=EH(r,rH),i=mH(t,r!==null),o=yl(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,d=Ei[t.provider],u=e===void 0?d==="none"?"none":"partial":d,f=lH(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??nH))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:Jb,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:pH(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:Ei[t.provider],resultPairing:Kb[t.provider],backgroundTaskCorrelation:cH(t.provider),authorship:u,tokens:iH[t.provider],handled:i.coverage}}}function lH(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function cH(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function yl(t){if(Ei[t.provider]==="none")return[];let e=oH[t.provider]??{},n=new Set,r=[];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??wH(i.toolInput),l=o===void 0?void 0:dH(o,a),c=fH(t.messages,s,i.toolCallId,n,t.provider==="agy"),d=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let u=o===void 0?[]:uH(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)r.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"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:d?.timestamp.toISOString()??null,result:d===void 0?null:d.toolDetailedContent??d.content})}return r}function dH(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=um(e[n]);if(r!==void 0)return r}}function uH(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=um(n[i]),a=um(r[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 fH(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function mH(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 n=Vb(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function pH(t){let e=t.lastTokenUsage,n=hH(t),r=gH(t.provider);return{lastTurn:_H(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function _H(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function hH(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 gH(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 yH(t){let e=Vb(t,"user");return e<0?null:t[e].content}function Vb(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function EH(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function wH(t){if(t!==void 0)try{let e=JSON.parse(t);return TH(e)?e:void 0}catch{return}}function TH(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function um(t){return typeof t=="string"?t:void 0}function lt(t,e,n=!1){return Y(t,{schema_version:Jb,error:e,...n?{usage:Gb}:{}}),1}function dm(t){return t instanceof Error?t.message:String(t)}var Jb,tH,nH,rH,Gb,sH,Ei,Kb,Hb,iH,Xb,oH,El=w(()=>{"use strict";At();Ce();xt();Xt();Gt();cm();Jb=2,tH={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},nH=500,rH=32*1024,Gb=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
|
|
2614
2614
|
`),sH={loadSession:$e,resolveTeamTarget:(t,e,n)=>O(n,r=>Xe(t,e,r)),resolveLeadAlias:async(t,e)=>{let n=await O(e,i=>we(t,i)),r=Fe(n),s=pt(r);if(s===void 0)throw new Error(`${t} has no Lead member; pass <tf>:<alias>`);return s.alias},listInvocations:(t,e,n,r)=>O(r,s=>s.listTrackedInvocationsForTarget(t,e,n).map(i=>({id:i.id,kind:i.kind,origin:i.origin,status:i.status,from_identity:i.from_identity,command:i.command,started_at:i.started_at,ended_at:i.ended_at,exit_code:i.exit_code,error:i.error})))},Ei={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Kb={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},Hb={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(Ei))if(Hb[Kb[t]]>Hb[Ei[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);iH={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Xb={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"]}},oH={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"},WebFetch:{kind:"network",inputKey:"url"},WebSearch:{kind:"network",inputKey:"query"}},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:Xb,lmplayer:Xb,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"}}}});function fm(t){let e;try{e=OH(t)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<e.length;i+=1){let a=e[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=tk(a.argv),c=l===a.argv?a:{...a,argv:l},d=Ti(c.argv[0]?.text??"");if(d==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=ik(r,f.text):s=!0;continue}if(vH.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Je(t)}`});break}let u=MH(c);if(u!==null){let f=u.literal?fm(u.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>Qb(m,r,s)));continue}n.push(...xH(c,d,sk(e,i)).map(f=>Qb(f,r,s)))}return n}function xH(t,e,n){let r=[],s=t.redirects.filter(o=>o.fd===1||o.fd==="&"),i=t.redirects.filter(o=>o.fd===2);for(let o of i){let a=Zb(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Je(t.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=nk(t,e,n);for(let a of s){let l=Zb(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Je(t.raw)}`}):o===null||t.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Je(t.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...RH(t,e,n)),r.length===0&&AH(t,e)){let o=t.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Je(t.raw)})}return r}function AH(t,e){return e===""||NH.has(e)?!1:kH.has(e)?e==="find"?t.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function tk(t){let e=0;for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1;for(;e<t.length&&bH.has(Ti(t[e].text));){let n=Ti(t[e].text);for(e+=1;e<t.length&&t[e].text.startsWith("-");)e+=1;if(n==="timeout"&&e<t.length&&/^\d/.test(t[e].text)&&(e+=1),n==="env")for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1}return e===0?t:t.slice(e)}function nk(t,e,n){if(t.hasSubstitution)return null;let r=t.argv.slice(1);if(e==="echo"){let s=!0,i=0;for(;i<r.length&&/^-[neE]+$/.test(r[i].text);){let a=r[i].text;if(a.includes("n")&&(s=!1),a.includes("e"))return null;i+=1}let o=r.slice(i);return o.every(a=>a.literal)?o.map(a=>a.text).join(" ")+(s?`
|
|
2615
2615
|
`:""):null}if(e==="printf"){if(r.length===0||!r.every(i=>i.literal))return null;let s=r[0].text;return r.length===1?/[%\\]/.test(s)?null:s:s==="%s\\n"||s===`%s
|
|
2616
2616
|
`?r.slice(1).map(i=>`${i.text}
|
|
@@ -2641,15 +2641,15 @@ ${as}`):B(r,"--single-session")?I(e,"--single-session applies to <teamfile> <ali
|
|
|
2641
2641
|
|
|
2642
2642
|
${as}`);if(r.positionals.length===0)return I(e,`restore requires a <teamfile> (or --dir <path>)
|
|
2643
2643
|
|
|
2644
|
-
${as}`);if(r.positionals.length>2)return I(e,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=
|
|
2644
|
+
${as}`);if(r.positionals.length>2)return I(e,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=lr(i),a=o?.teamfile??i,l=r.positionals[1],c=o?.alias??l;if(o!==null&&l!==void 0)return I(e,"restore alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(c===void 0)return I(e,`restore requires an <alias>
|
|
2645
2645
|
|
|
2646
|
-
${as}`);let d;try{d=await n.resolveTeamTarget(a,c,e)}catch(k){if(k instanceof be)return I(e,k.message);throw k}let u;try{u=await n.loadSession(d.sessionid,d.provider)}catch(k){return I(e,`failed to load session: ${Il(k)}`)}if(u===null)return I(e,`session not found: ${d.sessionid} (provider=${d.provider})`);let f=B(r,"--dry-run"),m=B(r,"--force"),p=B(r,"--single-session")||n.resolveTeamRoster===void 0,_=$(r,"--target"),h=_===void 0?void 0:pn(_),g=p?[d]:ZH([d,...await n.resolveTeamRoster(a,e)]),y=[],E=[],S=[];for(let k of g){if(k.sessionid===d.sessionid){S.push({member:k,detail:u}),E.push(
|
|
2646
|
+
${as}`);let d;try{d=await n.resolveTeamTarget(a,c,e)}catch(k){if(k instanceof be)return I(e,k.message);throw k}let u;try{u=await n.loadSession(d.sessionid,d.provider)}catch(k){return I(e,`failed to load session: ${Il(k)}`)}if(u===null)return I(e,`session not found: ${d.sessionid} (provider=${d.provider})`);let f=B(r,"--dry-run"),m=B(r,"--force"),p=B(r,"--single-session")||n.resolveTeamRoster===void 0,_=$(r,"--target"),h=_===void 0?void 0:pn(_),g=p?[d]:ZH([d,...await n.resolveTeamRoster(a,e)]),y=[],E=[],S=[];for(let k of g){if(k.sessionid===d.sessionid){S.push({member:k,detail:u}),E.push(fr(k,"target",0));continue}try{let P=await n.loadSession(k.sessionid,k.provider);if(P===null){E.push(fr(k,"not_found",0)),y.push(`team member ${k.alias}: session ${k.sessionid} not found \u2014 its file history is missing from this recovery`);continue}S.push({member:k,detail:P}),E.push(fr(k,"merged",0))}catch(P){E.push(fr(k,"load_error",0)),y.push(`team member ${k.alias}: session load failed (${Il(P)}) \u2014 its file history is missing from this recovery`)}}let b={toolCalls:wi(u).coverage.toolCalls,structuredReplay:gk[u.provider],shellScan:hm[u.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...bl[u.provider]!==void 0?{structuredNote:bl[u.provider]}:{},shellNote:yk};return Ek(e,{json:B(r,"--json"),dryRun:f,force:m,absTarget:h,loaded:S,members:E,loadWarnings:y,coverage:b,mode:p?"single_session":"team",headerJson:{provider:u.provider,sessionId:u.sessionId,sessionCwd:u.cwd},describe:p?" (single session)":` from ${S.length} team session(s)`})}function mk(t){let e=pn(t),n=[];for(;;)try{return JH(UH(e),...n.reverse())}catch{let r=Nl(e);if(r===e)return pn(t);n.push(hk(e)),e=r}}async function zH(t,e,n,r){if(r.discoverSessions===void 0)return I(n,"--dir is not available: session discovery is not wired in this harness");let s=mk(t),i=B(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(y){return I(n,`session discovery failed: ${Il(y)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],d=0,u=0,f=0;for(let y of o){let E=`${y.provider}:${y.sessionId}`;if(l.has(E)){f+=1;continue}if(l.add(E),typeof y.cwd!="string"||y.cwd.trim()===""){d+=1;continue}let S=mk(y.cwd);S===s||i&&S.startsWith(a)?c.push(y):u+=1}if(c.sort((y,E)=>y.createdAt.getTime()-E.createdAt.getTime()),c.length===0)return I(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${d} had no recorded cwd`);let m=[],p=[],_=[];for(let y of c){let E={teamfile:"",alias:`${y.provider}:${y.sessionId}`,provider:y.provider,sessionid:y.sessionId,sessiondir:y.cwd,isLead:!1};try{let S=await r.loadSession(y.sessionId,y.provider);if(S===null){p.push(fr(E,"not_found",0)),m.push(`session ${E.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}_.push({member:E,detail:S}),p.push(fr(E,"merged",0))}catch(S){p.push(fr(E,"load_error",0)),m.push(`session ${E.alias}: load failed (${Il(S)}) \u2014 its file history is missing from this recovery`)}}let g={crossSession:"directory_merged",providers:[...new Set(_.map(y=>y.detail.provider))].map(y=>({provider:y,structuredReplay:gk[y],shellScan:hm[y]!==void 0?"best_effort":"none",...bl[y]!==void 0?{structuredNote:bl[y]}:{}})),shellNote:yk};return Ek(n,{json:B(e,"--json"),dryRun:B(e,"--dry-run"),force:B(e,"--force"),absTarget:$(e,"--target")===void 0?void 0:pn($(e,"--target")),loaded:_,members:p,loadWarnings:m,coverage:g,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:_.length,excludedNoCwd:d,excludedOutsideDir:u}},describe:` from ${_.length} session(s) recorded in ${s}`})}async function Ek(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=QH(i);for(let _ of o)_.fileOps=l.filter(h=>h.alias===_.alias).length;let{files:c,warnings:d}=await r2(l,{dryRun:n,force:r,targetDir:s}),u=[...a,...d],f=i.flatMap(({member:_,detail:h})=>o2(h,l.filter(g=>g.alias===_.alias),_.alias)),m={files:c.length,written:c.filter(_=>_.action==="written").length,wouldWrite:c.filter(_=>_.action==="would_write").length,skipped:c.filter(_=>_.action==="skipped").length,unreplayable:c.filter(_=>_.action==="unreplayable").length,stitchedFiles:c.filter(_=>_.aliases.length>1).length,unreplayedCalls:f.length,warnings:u.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)Y(t,{schema_version:GH,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:u});else{for(let _ of c){let h=_.aliases.length>1?` [stitched: ${_.aliases.join("+")}]`:"",g=_.detail===null?"":` \u2014 ${_.detail}`;t.stdout.write(`${_.path}: ${_.action} (${_.reason})${h}${g}
|
|
2647
2647
|
`)}for(let _ of f)t.stdout.write(`unreplayed ${_.kind} call ${_.tool} [${_.alias}]${_.path===null?"":` ${_.path}`}: ${_.reason}
|
|
2648
2648
|
`);for(let _ of u)t.stdout.write(`warning: ${_}
|
|
2649
2649
|
`);t.stdout.write(`Restore ${n?"planned":"replayed"} ${m.files} file(s)${e.describe}: ${n?`${m.wouldWrite} would write`:`${m.written} written`}, ${m.skipped} skipped, ${m.unreplayable} unreplayable, ${m.stitchedFiles} stitched, ${m.unreplayedCalls} unreplayed call(s), ${m.warnings} warning(s).
|
|
2650
2650
|
`),p&&t.stdout.write(`warning: recovery is incomplete \u2014 see per-file reasons above
|
|
2651
|
-
`)}return p?1:0}function ZH(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function ur(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function QH(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=wk(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function wk(t){let e=KH[t.provider]??{},n=hm[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??u2(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=e2(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...t2(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=n2(i[l]);if(c===null)continue;for(let d of fm(c))r.push({effect:d,source:"shell",...o})}}return r}function e2(t,e){let n=vl(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=vl(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=vl(e,t.oldKeys),s=vl(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function t2(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=ck(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...e}))}function n2(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function r2(t,e){let n=new Map,r=[],s=new Set,i=[],o=(u,f,m)=>{let p=n.get(u);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(u,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(u,f)=>{let m=c2(u,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(u)){s.add(u);let p=m.reason==="symlink_path";r.push({path:u,sessionPath:u,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(u,f)=>{if(u.state==="known")return u.content;if(u.ops>1||!mm(f))return null;try{return await qH(f,"utf8")}catch{return null}},c=(u,f,m)=>{u.state="unknown",u.content=null,u.unknownReason=f,m!==void 0&&(u.unknownDetail=m)};for(let u of t){let f=u.effect;switch(f.kind){case"write":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;let _=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=_+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=i2(_,f.oldString,f.newString,f.replaceAll);if(h===null){c(p,"edit_mismatch");break}p.state="known",p.content=h;break}case"hunks":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=dk(_,f.hunks);if(h===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=h,f.moveTo!==void 0){let g=a(f.moveTo,u);if(g!==null){let y=o(g,f.moveTo,u);y.state="known",y.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state="deleted",p.content=null,f.recursive){let _=m.endsWith("/")?m:`${m}/`;for(let[h,g]of n)h.startsWith(_)&&(g.state="deleted",g.content=null,g.lastOp=u.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,u),p=a(f.to,u),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,u);_!==void 0&&_.state==="known"?(h.state="known",h.content=_.content,delete h.unknownReason,delete h.unknownDetail):c(h,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let h=o(m,f.from,u);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,u);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,u);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,u);else if(!mm(m)){let _=o(m,f.path,u);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${u.tool} @ ${u.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&a2(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of l2(f.tokens)){let _=a(p,u);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,u);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${u.tool} @ ${u.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let d=[...r];for(let[u,f]of n)d.push(await s2(u,f,e));return{files:d,warnings:i}}async function s2(t,e,n){if(n.targetDir!==void 0&&kl(n.targetDir,t))return dr(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=mm(t)?await XH(t):null,s=r?.mtime??null;if(e.state==="deleted")return dr(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return dr(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return dr(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return dr(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await pm(Nl(t),{recursive:!0}),await _k(t,e.content,"utf8"),await pk(t,e.lastOp,e.lastOp);else try{await d2(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof mn)return dr(t,e,"unreplayable","symlink_path",s,o.message);throw o}return dr(t,e,"written",i,s,null)}function i2(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function o2(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=wi(t),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function a2(t,e,n){let r=hk(e);for(let s of t)if(s===e||s===n||s.includes(e)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function l2(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Sl(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function c2(t,e,n){if(n===void 0)return Sl(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:pn(e,t)};let r=Sl(t)?e===""?void 0:_m(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=pn(n,r),i=_m(n,s);return i===""||i.startsWith("..")||Sl(i)?{reason:"outside_target"}:kl(n,s)?{reason:"symlink_path"}:{abs:s}}function kl(t,e){let n=e;for(;;){try{if(FH(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Nl(n);if(r===n)return!0;n=r}}async function d2(t,e,n,r){try{let l=await Tl(t);if(l.isSymbolicLink()||!l.isDirectory())throw new mn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await pm(t,{recursive:!0});let c=await Tl(t);if(c.isSymbolicLink()||!c.isDirectory())throw new mn(`unsafe restore root: ${t}`)}let s=_m(t,Nl(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=pn(i,l);try{let c=await Tl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new mn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await pm(i);let d=await Tl(i);if(d.isSymbolicLink()||!d.isDirectory())throw new mn(`unsafe restore parent: ${i}`)}}if(kl(t,e))throw new mn(`restore target contains a symbolic link: ${e}`);let o=await WH(pn(i,".lmctl-restore-")),a=pn(o,"content.tmp");try{if(await _k(a,n,{encoding:"utf8",flag:"wx"}),await pk(a,r,r),kl(t,e))throw new mn(`restore target contains a symbolic link: ${e}`);await BH(a,e)}finally{await HH(o,{recursive:!0,force:!0})}}function dr(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function vl(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function u2(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Il(t){return t instanceof Error?t.message:String(t)}var GH,as,gk,bl,yk,fk,KH,hm,VH,mn,vk=w(()=>{"use strict";xt();ut();El();ok();uk();Ce();Nt();Gt();GH=2,as=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
|
|
2652
|
-
`),gk={claude:"full",kimi:"full",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},bl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},yk="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",fk={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},KH={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:fk,lmplayer:fk,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},hm={claude:{Bash:"command"},kimi:{Bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},VH={loadSession:$e,resolveTeamTarget:(t,e,n)=>O(n,r=>Xe(t,e,r)),resolveTeamRoster:(t,e)=>O(e,n=>{let r=we(t,n),s=nt(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Xe(t,o.alias,n))}catch{}return i}),discoverSessions:()=>
|
|
2651
|
+
`)}return p?1:0}function ZH(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function fr(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function QH(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=wk(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function wk(t){let e=KH[t.provider]??{},n=hm[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??u2(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=e2(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...t2(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=n2(i[l]);if(c===null)continue;for(let d of fm(c))r.push({effect:d,source:"shell",...o})}}return r}function e2(t,e){let n=vl(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=vl(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=vl(e,t.oldKeys),s=vl(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function t2(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=ck(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...e}))}function n2(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function r2(t,e){let n=new Map,r=[],s=new Set,i=[],o=(u,f,m)=>{let p=n.get(u);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(u,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(u,f)=>{let m=c2(u,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(u)){s.add(u);let p=m.reason==="symlink_path";r.push({path:u,sessionPath:u,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(u,f)=>{if(u.state==="known")return u.content;if(u.ops>1||!mm(f))return null;try{return await qH(f,"utf8")}catch{return null}},c=(u,f,m)=>{u.state="unknown",u.content=null,u.unknownReason=f,m!==void 0&&(u.unknownDetail=m)};for(let u of t){let f=u.effect;switch(f.kind){case"write":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;let _=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=_+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=i2(_,f.oldString,f.newString,f.replaceAll);if(h===null){c(p,"edit_mismatch");break}p.state="known",p.content=h;break}case"hunks":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=dk(_,f.hunks);if(h===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=h,f.moveTo!==void 0){let g=a(f.moveTo,u);if(g!==null){let y=o(g,f.moveTo,u);y.state="known",y.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state="deleted",p.content=null,f.recursive){let _=m.endsWith("/")?m:`${m}/`;for(let[h,g]of n)h.startsWith(_)&&(g.state="deleted",g.content=null,g.lastOp=u.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,u),p=a(f.to,u),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,u);_!==void 0&&_.state==="known"?(h.state="known",h.content=_.content,delete h.unknownReason,delete h.unknownDetail):c(h,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let h=o(m,f.from,u);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,u);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,u);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,u);else if(!mm(m)){let _=o(m,f.path,u);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${u.tool} @ ${u.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&a2(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of l2(f.tokens)){let _=a(p,u);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,u);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${u.tool} @ ${u.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let d=[...r];for(let[u,f]of n)d.push(await s2(u,f,e));return{files:d,warnings:i}}async function s2(t,e,n){if(n.targetDir!==void 0&&kl(n.targetDir,t))return ur(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=mm(t)?await XH(t):null,s=r?.mtime??null;if(e.state==="deleted")return ur(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return ur(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return ur(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return ur(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await pm(Nl(t),{recursive:!0}),await _k(t,e.content,"utf8"),await pk(t,e.lastOp,e.lastOp);else try{await d2(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof mn)return ur(t,e,"unreplayable","symlink_path",s,o.message);throw o}return ur(t,e,"written",i,s,null)}function i2(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function o2(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=wi(t),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function a2(t,e,n){let r=hk(e);for(let s of t)if(s===e||s===n||s.includes(e)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function l2(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Sl(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function c2(t,e,n){if(n===void 0)return Sl(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:pn(e,t)};let r=Sl(t)?e===""?void 0:_m(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=pn(n,r),i=_m(n,s);return i===""||i.startsWith("..")||Sl(i)?{reason:"outside_target"}:kl(n,s)?{reason:"symlink_path"}:{abs:s}}function kl(t,e){let n=e;for(;;){try{if(FH(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Nl(n);if(r===n)return!0;n=r}}async function d2(t,e,n,r){try{let l=await Tl(t);if(l.isSymbolicLink()||!l.isDirectory())throw new mn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await pm(t,{recursive:!0});let c=await Tl(t);if(c.isSymbolicLink()||!c.isDirectory())throw new mn(`unsafe restore root: ${t}`)}let s=_m(t,Nl(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=pn(i,l);try{let c=await Tl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new mn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await pm(i);let d=await Tl(i);if(d.isSymbolicLink()||!d.isDirectory())throw new mn(`unsafe restore parent: ${i}`)}}if(kl(t,e))throw new mn(`restore target contains a symbolic link: ${e}`);let o=await WH(pn(i,".lmctl-restore-")),a=pn(o,"content.tmp");try{if(await _k(a,n,{encoding:"utf8",flag:"wx"}),await pk(a,r,r),kl(t,e))throw new mn(`restore target contains a symbolic link: ${e}`);await BH(a,e)}finally{await HH(o,{recursive:!0,force:!0})}}function ur(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function vl(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function u2(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Il(t){return t instanceof Error?t.message:String(t)}var GH,as,gk,bl,yk,fk,KH,hm,VH,mn,vk=w(()=>{"use strict";At();ut();El();ok();uk();Ce();xt();Gt();GH=2,as=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
|
|
2652
|
+
`),gk={claude:"full",kimi:"full",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},bl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},yk="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",fk={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},KH={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:fk,lmplayer:fk,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},hm={claude:{Bash:"command"},kimi:{Bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},VH={loadSession:$e,resolveTeamTarget:(t,e,n)=>O(n,r=>Xe(t,e,r)),resolveTeamRoster:(t,e)=>O(e,n=>{let r=we(t,n),s=nt(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Xe(t,o.alias,n))}catch{}return i}),discoverSessions:()=>zn({})};mn=class extends Error{}});var vi,_re,gm=w(()=>{"use strict";vi=[{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}],_re=vi.length});import{spawn as f2}from"node:child_process";async function bk(t,e,n){let r=p2.get(t);if(r===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 r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return _2(r.name,s)}function _2(t,e){return t==="lmctl_chat"?h2(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function h2(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 n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",n,r,e];return le()&&Me(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),g2(s,process.cwd())}function g2(t,e){return new Promise(n=>{let r=!1,s,i=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},o=f2("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=y2(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="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){le()&&Me(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2653
2653
|
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function y2(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Sk;let n=Number(e);return!Number.isFinite(n)||n<=0?Sk:n}function ym(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:m2),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:r,token:i}}var m2,Sk,p2,Em=w(()=>{"use strict";gm();ce();m2="http://127.0.0.1:8787",Sk=30*60*1e3,p2=new Map(vi.map(t=>[t.name,t]))});async function v2(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(wm({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:E2,capabilities:{tools:{listChanged:!1}},serverInfo:{name:w2,version:T2}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:vi.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 bk(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:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function wm(t){return`${JSON.stringify(t)}
|
|
2654
2654
|
`}async function kk(t,e){let n=!1,r="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(wm({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await v2(l,t);c.kind==="response"?t.io.write(wm(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=r.indexOf(`
|
|
2655
2655
|
`);for(;u!==-1;){let f=r.slice(0,u);r=r.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=r.indexOf(`
|
|
@@ -2660,20 +2660,20 @@ ${as}`);let d;try{d=await n.resolveTeamTarget(a,c,e)}catch(k){if(k instanceof be
|
|
|
2660
2660
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2661
2661
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2662
2662
|
`});var Rk={};me(Rk,{runDevice:()=>j2});import{readFileSync as N2}from"node:fs";import{homedir as x2}from"node:os";import{join as A2}from"node:path";import{CognitoIdentityClient as R2,GetIdCommand as L2}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as O2}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as C2,ListObjectsV2Command as $2,PutObjectCommand as M2,S3Client as D2}from"@aws-sdk/client-s3";async function j2(t,e={stdout:process.stdout,stderr:process.stderr}){let[n]=t;if(n===void 0||n==="--help"||n==="-h"||n==="help")return e.stdout.write(Tm),0;if(n==="init"){let r=qf();return e.stdout.write(`${r.device_id}
|
|
2663
|
-
`),0}if(n==="id"){let r=
|
|
2663
|
+
`),0}if(n==="id"){let r=ar();return r===null?(e.stderr.write(`error: no device id initialized at ${ol()}; run 'lmctl device init'
|
|
2664
2664
|
`),1):(e.stdout.write(`${r.device_id}
|
|
2665
2665
|
`),0)}return n==="login"?await P2(t.slice(1),e):n==="prompt"?await U2(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
2666
2666
|
`),1)}async function P2(t,e){let n=F2(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
2667
2667
|
${Tm}`),2;let r=fi();if(r.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${r.missing.join(", ")}
|
|
2668
2668
|
`),1;Gv({userId:n.userId,refreshToken:n.accessKey});let s,i,o;try{let c=await Qa({region:r.config.region,clientId:r.config.cognitoClientId??il,refreshToken:n.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${d}
|
|
2669
2669
|
`),1}let a=ci(s);if(a!==null&&a!==n.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${n.userId}
|
|
2670
|
-
`),1;Nf({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:n.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=
|
|
2670
|
+
`),1;Nf({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:n.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=ar()??qf();return e.stdout.write(`logged in as ${n.userId}
|
|
2671
2671
|
device id: ${l.device_id}
|
|
2672
2672
|
mailbox prefix: ${n.userId}/${l.device_id}/
|
|
2673
2673
|
access key stored at ${di()}
|
|
2674
2674
|
`),0}function F2(t){let e,n;for(let r=0;r<t.length;r+=1){let s=t[r];if(s==="--user-id"){let i=t[++r];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";e=i;continue}if(s==="--access-key"){let i=t[++r];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";n=i;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":n===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:n}}async function U2(t,e){let n=W2(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
2675
2675
|
${Tm}`),2;let r=fi();if(r.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${r.missing.join(", ")}
|
|
2676
|
-
`),1;let s=B2();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${r.config.region}.amazonaws.com/${r.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await q2({region:r.config.region,identityPoolId:r.config.identityPoolId,idpProvider:o,idToken:i}),l=O2({identityId:a,logins:{[o]:i},clientConfig:{region:r.config.region}}),c=r.config.deviceId??
|
|
2676
|
+
`),1;let s=B2();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${r.config.region}.amazonaws.com/${r.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await q2({region:r.config.region,identityPoolId:r.config.identityPoolId,idpProvider:o,idToken:i}),l=O2({identityId:a,logins:{[o]:i},clientConfig:{region:r.config.region}}),c=r.config.deviceId??ar()?.device_id,d=ci(i)??void 0,u=new or({bucket:r.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...r.config.mailboxKey!==void 0?{mailboxKey:r.config.mailboxKey}:{},s3:new D2({region:r.config.region,credentials:l}),commands:{ListObjectsV2Command:$2,GetObjectCommand:C2,PutObjectCommand:M2},selfRole:"browser",onMessage:async()=>{}}),f=Dv({root_teamfile:n.root,text:n.text,...n.promptId!==void 0?{prompt_id:n.promptId}:{}}),m=await u.putMessage({conversation_id:Mv,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
2677
2677
|
`),0}function W2(t){let e,n,r;for(let s=0;s<t.length;s+=1){let i=t[s];if(i==="--root"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";e=o;continue}if(i==="--text"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";n=o;continue}if(i==="--prompt-id"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";r=o;continue}return`unknown argument: ${i}`}return e===void 0?"missing --root <teamfile>":n===void 0?"missing --text <prompt>":{root:e,text:n,...r!==void 0?{promptId:r}:{}}}async function q2(t){let n=await new R2({region:t.region}).send(new L2({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return n.IdentityId}function B2(t=process.env.LMCTL_TOKEN_PATH??A2(x2(),".lmctl","cli-tokens.json")){try{return JSON.parse(N2(t,"utf8"))}catch{return null}}var Tm,Lk=w(()=>{"use strict";Bf();jf();Ma();Sf();bf();xf();kf();Tm=`usage: lmctl device <id|init|login|prompt>
|
|
2678
2678
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
2679
2679
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
@@ -2689,37 +2689,37 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
|
2689
2689
|
WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2690
2690
|
AND ts >= ?
|
|
2691
2691
|
ORDER BY seq ASC
|
|
2692
|
-
`).all(e.since).map(H2),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new
|
|
2692
|
+
`).all(e.since).map(H2),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Fn(`${l.stream_id} ${l.event_type} is missing receiver identity`);let c=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},d=X2(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:c,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:d.message_id,parent_link:d.link,orphaned_to_root:d.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let c=s.get(l.parent_message_id);if(c===void 0){l.orphaned_to_root=!0;continue}c.children.push(l)}let i=e.cursorSeq??null,o=[...s.values()].filter(l=>$k(l,e.root)&&!J2(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>Mk(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function H2(t){try{let e=JSON.parse(t.payload);if(!Dk(e))throw new Fn(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Fn?e:new Fn(`message_event seq ${t.seq} payload is invalid JSON`)}}function X2(t){if(t.event_type==="RESPONSE_CREATE"){let r=Ok(t.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let e=Dk(t.payload.causation)?t.payload.causation:null,n=Ok(e?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function $k(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function J2(t,e,n){let r=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=e.get(s);if(i===void 0)return!1;if($k(i,n))return!0;s=i.parent_message_id}return!1}function Mk(t,e){let{seq:n,children:r,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:r.map(o=>Mk(o,i))}}function Dk(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Ok(t){return typeof t=="string"&&t.length>0?t:null}var Fn,jk=w(()=>{"use strict";Fn=class extends Error{errorKind="data_error"}});var Jk={};me(Jk,{runMail:()=>lX});import{hostname as G2}from"node:os";async function lX(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(Q2),0;let[n,...r]=t,s=_n(r);try{switch(n){case"sent":return await cX(r,e);case"history":return await dX(r,e);case"seen":return await uX(r,e);case"pending":return await fX(r,e);case"read":return await pX(r,e);case"handle":return await hX(r,e);case"ack":return await _X(r,e);case"tree":return await gX(r,e);default:return ne(e,s,"invalid_command",`unknown mail command: ${n}`)}}catch(i){return i instanceof Ze||i instanceof Fn?ne(e,s,i.errorKind,i.message):ne(e,s,"internal",i instanceof Error?i.message:String(i))}}async function cX(t,e){if(qn(t))return e.stdout.write(eX),0;let n=_n(t),r=Z(xl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return ne(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=bm($(r,"--to"));if("error"in s)return ne(e,n,"invalid_arguments",s.error);let i=xX($(r,"--since"));if("error"in i)return ne(e,n,"invalid_arguments",i.error);let o=$(r,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return ne(e,n,"invalid_arguments","--status must be queued or delivered");let a=Im($(r,"--limit"));if("error"in a)return ne(e,n,"invalid_arguments",a.error);let l=Xk($(r,"--cursor"),"sent");if("error"in l)return ne(e,n,"invalid_arguments",l.error);if(l.value!==null&&($(r,"--to")!==void 0||$(r,"--since")!==void 0||o!==void 0))return ne(e,n,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let c=await O(e,d=>{let u=l.value===null?De(km(d,e,"mail sent")):De(l.value.self),f=l.value===null?s.value:l.value.to===null?null:De(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,_=yX(d,u,f,m,p??void 0,a.value,l.value?.seq??null),h=_.next_seq===null?null:Hk({v:1,kind:"sent",seq:_.next_seq,self:u.value,to:f?.value??null,since:m,status:p});return{schema_version:Un,schema:"event-log-v1",identity:u.value,filters:{to:f?.value??null,since:m,status:p},messages:_.messages,next_cursor:h}});if(B(r,"--json"))Y(e,c);else{e.stdout.write(`Messages sent from ${c.identity}
|
|
2693
2693
|
`);for(let d of c.messages)e.stdout.write(`${d.created_at} ${d.message_id} ${d.message_type} ${d.lifecycle_state} -> ${d.receiver.teamfile}:${d.receiver.alias}
|
|
2694
2694
|
`);c.messages.length===0&&e.stdout.write(`(none)
|
|
2695
|
-
`)}return 0}async function dX(t,e){if(
|
|
2695
|
+
`)}return 0}async function dX(t,e){if(qn(t))return e.stdout.write(iX),0;let n=_n(t),r=Z(t,[],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);let s=bi(r.positionals,"history");if("error"in s)return ne(e,n,"invalid_id",s.error);let i=await O(e,a=>{let l=Uk(a,s.value);return l!==null&&Ka(a,l),Wk(a,s.value)}),o={schema_version:Un,schema:"event-log-v1",message_id:s.value,events:i};if(B(r,"--json"))Y(e,o);else{e.stdout.write(`History for ${s.value}
|
|
2696
2696
|
`);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
|
|
2697
|
-
`)}return 0}async function uX(t,e){if(
|
|
2697
|
+
`)}return 0}async function uX(t,e){if(qn(t))return e.stdout.write(oX),0;let n=_n(t),r=Z(t,[],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);let s=bi(r.positionals,"seen");if("error"in s)return ne(e,n,"invalid_id",s.error);let i=await O(e,o=>wX(o,s.value));return B(r,"--json")?Y(e,i):(e.stdout.write(`${s.value}
|
|
2698
2698
|
`),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
|
|
2699
2699
|
`),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
|
|
2700
2700
|
`),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
|
|
2701
|
-
`)),0}async function fX(t,e){if(
|
|
2701
|
+
`)),0}async function fX(t,e){if(qn(t))return e.stdout.write(tX),0;let n=_n(t),r=Z(xl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return ne(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=bm($(r,"--receiver"));if("error"in s)return ne(e,n,"invalid_arguments",s.error);let i=Im($(r,"--limit"));if("error"in i)return ne(e,n,"invalid_arguments",i.error);let o=await O(e,l=>{let c=s.value;if(c===null){let m=dr(e.env??process.env,l);if(m.ok)c=De(m.identity);else if(m.reason==="not-found")throw new Ze("self_identity",fn("mail pending"))}let d=c===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",u=c===null?[]:[c.teamfile,c.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
2702
2702
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq
|
|
2703
2703
|
FROM message_pending ${d}
|
|
2704
|
-
ORDER BY created_seq ASC LIMIT ?`).all(...u,i.value);return{receiver:c,messages:f}}),a={schema_version:
|
|
2704
|
+
ORDER BY created_seq ASC LIMIT ?`).all(...u,i.value);return{receiver:c,messages:f}}),a={schema_version:Un,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(B(r,"--json"))Y(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
|
|
2705
2705
|
`);else for(let l of a.messages){let c=l.sender===null?"operator":`${l.sender.teamfile}:${l.sender.alias}`;e.stdout.write(`${l.message_id} ${l.lifecycle_state} ${c} -> ${l.receiver.teamfile}:${l.receiver.alias}
|
|
2706
2706
|
`)}return 0}function Uk(t,e){let n=/^msg_tcl_(\d+)$/.exec(e);if(n===null)return null;let r=Number(n[1]);return t.db.prepare(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
|
|
2707
2707
|
FROM tracked_invocation
|
|
2708
2708
|
WHERE team_chat_log_id = ? AND status = 'running'
|
|
2709
2709
|
ORDER BY id DESC LIMIT 1`).get(r)??null}function mX(t,e){let n=t.db.prepare(`SELECT event_type, payload FROM message_event
|
|
2710
2710
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2711
|
-
ORDER BY seq ASC LIMIT 1`).get(e);if(n===void 0)throw new Ze("not_found",`no such message: ${e}`);let r=JSON.parse(n.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e),i=Uk(t,e),o=i===null?null:yn(i);return{schema_version:
|
|
2711
|
+
ORDER BY seq ASC LIMIT 1`).get(e);if(n===void 0)throw new Ze("not_found",`no such message: ${e}`);let r=JSON.parse(n.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e),i=Uk(t,e),o=i===null?null:yn(i);return{schema_version:Un,schema:"event-log-v1",message_id:e,message_type:n.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:r.in_reply_to_message_id??null,sender:r.sender,receiver:r.receiver,content:r.content??"",pending_state:s?.lifecycle_state??null,holder_liveness:o,effective_status:o==="dead"?"aborted":null}}async function pX(t,e){if(qn(t))return e.stdout.write(nX),0;let n=_n(t),r=Z(t,[],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);let s=bi(r.positionals,"read");if("error"in s)return ne(e,n,"invalid_id",s.error);let i=await O(e,o=>mX(o,s.value));if(B(r,"--json"))Y(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}`})
|
|
2712
2712
|
`),e.stdout.write(`from: ${o}
|
|
2713
2713
|
`),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
|
|
2714
2714
|
`),e.stdout.write(`state: ${i.pending_state??"terminal"}
|
|
2715
2715
|
`),i.effective_status==="aborted"&&e.stdout.write(`effective_status: aborted (holder verified dead; run \`lmctl mail history ${i.message_id}\` to persist)
|
|
2716
2716
|
`),e.stdout.write(`---
|
|
2717
2717
|
${i.content}
|
|
2718
|
-
`)}return 0}async function _X(t,e){if(
|
|
2719
|
-
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let d=
|
|
2720
|
-
`),0}async function hX(t,e){if(
|
|
2721
|
-
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let c=De(km(a,e,"mail handle"));return{identity:c,handling:h_(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:
|
|
2722
|
-
`),0}async function gX(t,e){if(
|
|
2718
|
+
`)}return 0}async function _X(t,e){if(qn(t))return e.stdout.write(rX),0;let n=_n(t),r=Z(xl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);let s=bi(r.positionals,"ack");if("error"in s)return ne(e,n,"invalid_id",s.error);let i=$(r,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
|
|
2719
|
+
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let d=dr(e.env??process.env,l);if(!d.ok&&d.reason==="not-found")throw new Ze("self_identity",fn("mail ack"));let u=d.ok?d.identity:"operator",f=l.db.transaction(()=>{let m=g_(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:G2(),terminalizePending:B(r,"--terminalize-pending")});if(d.ok){let p=De(d.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:u,ack:f}}),a={schema_version:Un,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return B(r,"--json")?Y(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
|
|
2720
|
+
`),0}async function hX(t,e){if(qn(t))return e.stdout.write(sX),0;let n=_n(t),r=Z(t,[],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);let s=bi(r.positionals,"handle");if("error"in s)return ne(e,n,"invalid_id",s.error);let i=await O(e,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
|
|
2721
|
+
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let c=De(km(a,e,"mail handle"));return{identity:c,handling:h_(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:Un,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return B(r,"--json")?Y(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
|
|
2722
|
+
`),0}async function gX(t,e){if(qn(t))return e.stdout.write(aX),0;let n=_n(t),r=Z(xl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return ne(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return ne(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=Bk($(r,"--since"),K2);if("error"in s)return ne(e,n,"invalid_arguments",s.error);let i=bm($(r,"--root"));if("error"in i)return ne(e,n,"invalid_arguments",i.error);let o=Im($(r,"--limit"));if("error"in o)return ne(e,n,"invalid_arguments",o.error);let a=Xk($(r,"--cursor"),"tree");if("error"in a)return ne(e,n,"invalid_arguments",a.error);if(a.value!==null&&($(r,"--root")!==void 0||$(r,"--since")!==void 0))return ne(e,n,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await O(e,c=>{let d=a.value===null?i.value??De(km(c,e,"mail tree")):De(a.value.root),u=a.value?.since??s.iso,f=a.value?.since_label??$(r,"--since")??"24h",m=Ck(c,{root:{teamfile:d.teamfile,alias:d.alias},since:u,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:Hk({v:1,kind:"tree",seq:m.next_seq,root:d.value,since:u,since_label:f});return{schema_version:Un,schema:"event-log-v1",root:{teamfile:d.teamfile,alias:d.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(B(r,"--json"))Y(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
|
|
2723
2723
|
`);for(let c of l.sent)qk(e,c,0);l.sent.length===0&&e.stdout.write(`(none)
|
|
2724
2724
|
`),e.stdout.write(`
|
|
2725
2725
|
Note: ${l.orphan_policy}
|
|
@@ -2733,7 +2733,7 @@ Note: ${l.orphan_policy}
|
|
|
2733
2733
|
WHERE ${a.join(" AND ")}
|
|
2734
2734
|
ORDER BY e.seq DESC
|
|
2735
2735
|
LIMIT ?
|
|
2736
|
-
`).all(...l),d=c.length>i,u=c.slice(0,i);return{messages:u.map(m=>{if(m.receiver_teamfile===null||m.receiver_alias===null)throw new Ze("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:EX(t,m)}}),next_seq:d?u.at(-1).seq:null}}function EX(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 wX(t,e){let n=Wk(t,e),r=n.find(f=>AX(f.event_type))??n[0],s=[...n].reverse().find(f=>Z2.includes(f.event_type))??null,i=[...n].reverse().find(f=>f.event_type==="HANDLED")??null,o=TX(t,e,n),a=IX(t,e),l=Si(r.payload.provider_prompt),c=bX(r.payload),d=await vX(o,{messageId:e,providerPrompt:l,legacyMailboxId:c,evidenceAt:s?.ts??i?.ts??null}),u=a===null&&d.matched_index!==null&&d.messages!==null?kX(d.messages,d.matched_index):null;return{schema_version:
|
|
2736
|
+
`).all(...l),d=c.length>i,u=c.slice(0,i);return{messages:u.map(m=>{if(m.receiver_teamfile===null||m.receiver_alias===null)throw new Ze("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:EX(t,m)}}),next_seq:d?u.at(-1).seq:null}}function EX(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 wX(t,e){let n=Wk(t,e),r=n.find(f=>AX(f.event_type))??n[0],s=[...n].reverse().find(f=>Z2.includes(f.event_type))??null,i=[...n].reverse().find(f=>f.event_type==="HANDLED")??null,o=TX(t,e,n),a=IX(t,e),l=Si(r.payload.provider_prompt),c=bX(r.payload),d=await vX(o,{messageId:e,providerPrompt:l,legacyMailboxId:c,evidenceAt:s?.ts??i?.ts??null}),u=a===null&&d.matched_index!==null&&d.messages!==null?kX(d.messages,d.matched_index):null;return{schema_version:Un,schema:"event-log-v1",message_id:e,receiver:r.receiver_teamfile===null||r.receiver_alias===null?null:{teamfile:r.receiver_teamfile,alias:r.receiver_alias},db:{delivered:s!==null,handled:i!==null,delivered_at:s?.ts??i?.ts??null,delivered_by:s===null?null:NX(s.payload)},transcript:{checked:d.checked,found:d.matched_index!==null,seen_at:d.seen_at,session_id:o?.session_id??null,provider:o?.provider??null,reason:d.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 Wk(t,e){let n=t.db.prepare("SELECT * FROM message_event WHERE stream_id = ? ORDER BY seq ASC").all(e);if(n.length===0)throw new Ze("not_found",`message stream not found: ${e}`);return n.map(Sm)}function Sm(t){try{let e=JSON.parse(t.payload);if(!ls(e))throw new Ze("data_error",`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Ze?e:new Ze("data_error",`message_event seq ${t.seq} payload is invalid JSON`)}}function TX(t,e,n){for(let s of[...n].reverse()){let i=Fk(s.payload,null);if(i!==null)return i}let r=t.db.prepare(`
|
|
2737
2737
|
SELECT invocation_id FROM invocation_state
|
|
2738
2738
|
WHERE request_message_id = ?
|
|
2739
2739
|
ORDER BY started_at ASC, invocation_id ASC
|
|
@@ -2758,7 +2758,7 @@ Note: ${l.orphan_policy}
|
|
|
2758
2758
|
ORDER BY response.seq ASC
|
|
2759
2759
|
LIMIT 1
|
|
2760
2760
|
`).get(e,e);return n===void 0?null:Sm(n)}function NX(t){let e=ls(t.delivered_by)?t.delivered_by:null;return{lease_id:Si(e?.lease_id,t.lease_id),pid:CX(e?.pid,t.pid,t.holder_pid),host:Si(e?.host,t.host,t.holder_host)}}function qk(t,e,n){let r=" ".repeat(n),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${r}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
|
|
2761
|
-
`);for(let i of e.children)qk(t,i,n+1)}function bi(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let n=t[0];return Y2.test(n)?{value:n}:{error:`invalid message_id: ${n}; expected msg_<id>`}}function bm(t){if(t===void 0)return{value:null};try{return{value:De(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function xl(t,e){let n=new Set(e),r=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&n.has(o)?r.push(o,s.slice(i+1)):r.push(s)}return r}function xX(t){return t===void 0?{iso:null}:Bk(t,null)}function Bk(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let n=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2]==="m"?6e4:n[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 r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function km(t,e,n){let r=
|
|
2761
|
+
`);for(let i of e.children)qk(t,i,n+1)}function bi(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let n=t[0];return Y2.test(n)?{value:n}:{error:`invalid message_id: ${n}; expected msg_<id>`}}function bm(t){if(t===void 0)return{value:null};try{return{value:De(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function xl(t,e){let n=new Set(e),r=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&n.has(o)?r.push(o,s.slice(i+1)):r.push(s)}return r}function xX(t){return t===void 0?{iso:null}:Bk(t,null)}function Bk(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let n=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2]==="m"?6e4:n[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 r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function km(t,e,n){let r=dr(e.env??process.env,t);if(r.ok)return r.identity;throw r.reason==="not-found"?new Ze("self_identity",fn(n)):new Ze("self_identity",am(n))}function qn(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function _n(t){return t.includes("--json")}function ne(t,e,n,r){return e?(Y(t,{status:"error",errorKind:n,message:r}),1):I(t,r)}function Im(t){if(t===void 0)return{value:V2};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>Pk?{error:`invalid --limit value: ${t}; expected 1..${Pk}`}:{value:e}}function Hk(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function Xk(t,e){if(t===void 0)return{value:null};try{let n=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!ls(n)||n.v!==1||n.kind!==e||typeof n.seq!="number"||!Number.isSafeInteger(n.seq)||n.seq<1?{error:"invalid --cursor value"}:n.kind==="sent"?typeof n.self!="string"||!vm(n.self)||!(n.to===null||typeof n.to=="string"&&vm(n.to))||!(n.since===null||typeof n.since=="string"&&Number.isFinite(Date.parse(n.since)))||!(n.status===null||n.status==="queued"||n.status==="delivered")?{error:"invalid --cursor value"}:{value:n}:typeof n.root!="string"||!vm(n.root)||typeof n.since!="string"||!Number.isFinite(Date.parse(n.since))||typeof n.since_label!="string"||n.since_label.length===0?{error:"invalid --cursor value"}:{value:n}}catch{return{error:"invalid --cursor value"}}}function vm(t){try{return De(t),!0}catch{return!1}}function AX(t){return z2.includes(t)}function RX(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","ClaudeMock"].includes(t)}function ls(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function LX(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${n}(?:$|[^A-Za-z0-9_-])`).test(t)}function OX(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function Si(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function CX(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var K2,V2,Pk,Un,Y2,z2,Z2,Wn,Q2,eX,tX,nX,rX,sX,iX,oX,aX,Ze,Gk=w(()=>{"use strict";gt();Va();bs();At();jk();Ce();hl();_i();K2=24*60*60*1e3,V2=100,Pk=1e3,Un=1,Y2=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,z2=["CREATE","RESPONSE_CREATE"],Z2=["DELIVERED","RESPONSE_DELIVERED"],Wn=`schema_version is the output-contract version consumers must switch on.
|
|
2762
2762
|
schema identifies the backing event-log substrate; it is not a second output version.`,Q2=`usage:
|
|
2763
2763
|
lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
|
|
2764
2764
|
lmctl mail history <message_id> [--json]
|
|
@@ -2821,7 +2821,7 @@ With --json, the stable external contract is:
|
|
|
2821
2821
|
{"schema_version":1,"schema":"event-log-v1","identity":"<teamfile>:<alias>",
|
|
2822
2822
|
"filters":{"to":null,"since":null,"status":null},
|
|
2823
2823
|
"messages":[...],"next_cursor":"<opaque token>"|null}
|
|
2824
|
-
${
|
|
2824
|
+
${Wn}
|
|
2825
2825
|
Default text output is human-readable and may change without notice.
|
|
2826
2826
|
`,tX=`usage:
|
|
2827
2827
|
lmctl mail pending [--receiver <teamfile:alias>] [--limit N] [--json]
|
|
@@ -2844,7 +2844,7 @@ With --json, the stable external contract is:
|
|
|
2844
2844
|
"sender":{"teamfile":"...","alias":"..."}|null,
|
|
2845
2845
|
"receiver":{"teamfile":"...","alias":"..."},
|
|
2846
2846
|
"lifecycle_state":"queued"|"claimed","created_seq":N}]}
|
|
2847
|
-
${
|
|
2847
|
+
${Wn}
|
|
2848
2848
|
Default text output is human-readable and may change without notice.
|
|
2849
2849
|
`,nX=`usage:
|
|
2850
2850
|
lmctl mail read <message_id> [--json]
|
|
@@ -2863,7 +2863,7 @@ With --json, the stable external contract is:
|
|
|
2863
2863
|
"pending_state":"queued"|"claimed"|null}
|
|
2864
2864
|
pending_state null means the message is terminal (delivered or acknowledged);
|
|
2865
2865
|
read never changes it.
|
|
2866
|
-
${
|
|
2866
|
+
${Wn}
|
|
2867
2867
|
Default text output is human-readable and may change without notice.
|
|
2868
2868
|
`,rX=`usage:
|
|
2869
2869
|
lmctl mail ack <message_id> [--terminalize-pending] [--note <text>] [--json]
|
|
@@ -2899,7 +2899,7 @@ appended false means this actor had already acknowledged (deduplicated
|
|
|
2899
2899
|
repeat). pending_outcome "record-only" = terminalize not requested;
|
|
2900
2900
|
"removed" = this ack terminalized the queued message; "claimed" = a delivery
|
|
2901
2901
|
in flight won instead; "not-pending" = the message was already terminal.
|
|
2902
|
-
${
|
|
2902
|
+
${Wn}
|
|
2903
2903
|
Default text output is human-readable and may change without notice.
|
|
2904
2904
|
`,sX=`usage:
|
|
2905
2905
|
lmctl mail handle <message_id> [--json]
|
|
@@ -2920,7 +2920,7 @@ With --json, the stable external contract is:
|
|
|
2920
2920
|
"appended":true|false}
|
|
2921
2921
|
appended false means this actor had already declared handling for this message;
|
|
2922
2922
|
the causal pointer and its one-hour freshness timestamp are still refreshed.
|
|
2923
|
-
${
|
|
2923
|
+
${Wn}
|
|
2924
2924
|
Default text output is human-readable and may change without notice.
|
|
2925
2925
|
`,iX=`usage:
|
|
2926
2926
|
lmctl mail history <message_id> [--json]
|
|
@@ -2930,7 +2930,7 @@ Returns one message stream in message_event.seq order.
|
|
|
2930
2930
|
With --json, the stable external contract is:
|
|
2931
2931
|
{"schema_version":1,"schema":"event-log-v1",
|
|
2932
2932
|
"message_id":"msg_...","events":[...]}
|
|
2933
|
-
${
|
|
2933
|
+
${Wn}
|
|
2934
2934
|
Default text output is human-readable and may change without notice.
|
|
2935
2935
|
`,oX=`usage:
|
|
2936
2936
|
lmctl mail seen <message_id> [--json]
|
|
@@ -2946,7 +2946,7 @@ combination means "handled inline," not an inconsistency.
|
|
|
2946
2946
|
With --json, the stable external contract is:
|
|
2947
2947
|
{"schema_version":1,"schema":"event-log-v1","message_id":"msg_...",
|
|
2948
2948
|
"receiver":{...}|null,"db":{...},"transcript":{...},"answered":...}
|
|
2949
|
-
${
|
|
2949
|
+
${Wn}
|
|
2950
2950
|
Default text output is human-readable and may change without notice.
|
|
2951
2951
|
`,aX=`usage:
|
|
2952
2952
|
lmctl mail tree [--root <teamfile:alias>] [--since <duration|ISO>]
|
|
@@ -2961,10 +2961,10 @@ With --json, the stable external contract is:
|
|
|
2961
2961
|
"since":"24h","since_timestamp":"<ISO>","sent":[...],
|
|
2962
2962
|
"next_cursor":"<opaque token>"|null,"orphan_policy":"...",
|
|
2963
2963
|
"incomplete_capture_note":"..."}
|
|
2964
|
-
${
|
|
2964
|
+
${Wn}
|
|
2965
2965
|
Default text output is human-readable and may change without notice.
|
|
2966
|
-
`,Ze=class extends Error{errorKind;constructor(e,n){super(n),this.errorKind=e}}});import{existsSync as Kk,mkdirSync as $X,readdirSync as MX,readFileSync as Vk,writeFileSync as DX}from"node:fs";import{join as cs}from"node:path";import{fileURLToPath as jX}from"node:url";function FX(t){try{return PX.some(e=>Kk(cs(t,e)))}catch{return!1}}function UX(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.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:r}}function Yk(t,e){t.durable_memory_mode!=="db"?WX(t):qX(t,e)}function zk(t){let e=FX(t),n;try{n=MX(Al).filter(r=>r.endsWith(".template")).sort()}catch(r){return M({event:"bootstrap_templates_unreadable",path:Al,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?e:!0)}function WX(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 n=cs(e,"durable-memory");try{$X(n,{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:n,error_message:i instanceof Error?i.message:String(i)});return}let r=zk(e),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=cs(n,o);if(!Kk(a))try{let l=Vk(cs(Al,i),"utf8");DX(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 ${n}: ${s.join(", ")}`)}function qX(t,e){let n=t.local_path??"",r=zk(n),s=[];for(let i of r){let o=cs(Al,i),a;try{a=Vk(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),M({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=UX(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(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c),M({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:c instanceof Error?c.message:String(c)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Al,PX,Zk=w(()=>{"use strict";ce();Al=cs(jX(import.meta.url),"../../config/durable_memory_templates"),PX=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as BX}from"node:crypto";import{existsSync as HX,mkdirSync as XX,writeFileSync as JX}from"node:fs";import{dirname as GX,join as ds}from"node:path";function Nm(t){return typeof t=="string"&&t.startsWith(Qk)}function QX(t){if(!Nm(t))throw new
|
|
2967
|
-
`)};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(uJ.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=oJ(
|
|
2966
|
+
`,Ze=class extends Error{errorKind;constructor(e,n){super(n),this.errorKind=e}}});import{existsSync as Kk,mkdirSync as $X,readdirSync as MX,readFileSync as Vk,writeFileSync as DX}from"node:fs";import{join as cs}from"node:path";import{fileURLToPath as jX}from"node:url";function FX(t){try{return PX.some(e=>Kk(cs(t,e)))}catch{return!1}}function UX(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.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:r}}function Yk(t,e){t.durable_memory_mode!=="db"?WX(t):qX(t,e)}function zk(t){let e=FX(t),n;try{n=MX(Al).filter(r=>r.endsWith(".template")).sort()}catch(r){return M({event:"bootstrap_templates_unreadable",path:Al,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?e:!0)}function WX(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 n=cs(e,"durable-memory");try{$X(n,{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:n,error_message:i instanceof Error?i.message:String(i)});return}let r=zk(e),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=cs(n,o);if(!Kk(a))try{let l=Vk(cs(Al,i),"utf8");DX(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 ${n}: ${s.join(", ")}`)}function qX(t,e){let n=t.local_path??"",r=zk(n),s=[];for(let i of r){let o=cs(Al,i),a;try{a=Vk(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),M({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=UX(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(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c),M({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:c instanceof Error?c.message:String(c)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Al,PX,Zk=w(()=>{"use strict";ce();Al=cs(jX(import.meta.url),"../../config/durable_memory_templates"),PX=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as BX}from"node:crypto";import{existsSync as HX,mkdirSync as XX,writeFileSync as JX}from"node:fs";import{dirname as GX,join as ds}from"node:path";function Nm(t){return typeof t=="string"&&t.startsWith(Qk)}function QX(t){if(!Nm(t))throw new Rt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Qk.length),n=e.indexOf("/");if(n<=0)throw new Rt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let r=e.slice(0,n);if(!zX.has(r))throw new Rt(`unknown lmctl:// kind '${r}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(n+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 Rt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new Rt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:r,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function eJ(t,e,n){if(t==="workflow")return pa(e,n);let r=t==="mcp"?ds("templates","mcp",`${e}.json`):ds("templates","skills",e,"SKILL.md");for(let s of Tu(n)){let i=ds(s,r);if(HX(i))return i}return null}function tJ(t,e,n){let r=ds(wu(n),VX,t);return t==="skill"?ds(r,e,"SKILL.md"):ds(r,`${e}${t==="workflow"?".compound.json":".json"}`)}function nJ(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let n=e.trim();if(t==="mcp")try{let r=JSON.parse(n);return r!==null&&typeof r=="object"}catch{return!1}if(n.startsWith("{")||n.startsWith("["))try{return JSON.parse(n),!0}catch{return!1}return!0}async function eI(t,e){let{kind:n,name:r,ref:s}=QX(t),i=eJ(n,r,e);if(i!==null)return i;let o=`${KX}${n}/${r}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(YX)})}catch(d){throw new Rt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new Rt(`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 d=ZX.exec(s);if(d!==null){let u=BX("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new Rt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!nJ(n,l))throw new Rt(`lmctl:// '${t}' remote artifact failed shape validation for ${n} \u2014 discarded, NOT cached.`,"validation-failure");let c=tJ(n,r,e);return XX(GX(c),{recursive:!0}),JX(c,l,"utf8"),c}var Qk,KX,VX,YX,zX,Rt,ZX,tI=w(()=>{"use strict";vu();Qk="lmctl://",KX="https://lmctl.com/templates/",VX=".cache",YX=8e3,zX=new Set(["workflow","mcp","skill"]),Rt=class extends Error{reason;constructor(e,n="malformed"){super(e),this.reason=n,this.name="LmctlUriError"}},ZX=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as rJ}from"node:child_process";import{cpSync as nI,existsSync as sJ,mkdirSync as iJ,mkdtempSync as oJ,readFileSync as use,statSync as aJ,writeFileSync as rI}from"node:fs";import{homedir as lJ,tmpdir as cJ}from"node:os";import{basename as sI,join as Lt}from"node:path";function xm(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Am(t,e,n){if(Array.isArray(t)){for(let r of t)Am(r,e,n);return}if(xm(t)){t.alias===e&&(Array.isArray(t.mcp)&&n.mcp.push(...t.mcp),Array.isArray(t.skills)&&n.skills.push(...t.skills));for(let r of Object.values(t))Am(r,e,n)}}function mJ(t,e){let n={mcp:[],skills:[]},r=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||r.has(o.id))continue;r.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!xm(a)||!Array.isArray(a.steps)))for(let l of a.steps)xm(l)&&l.members!==void 0&&Am(l.members,e.alias,n)}let s=i=>{let o=new Map;for(let a of i)o.set(fJ(a),a);return[...o.values()]};return{mcp:s(n.mcp),skills:s(n.skills)}}function pJ(t,e){return t.listProjects().find(n=>n.team_id===e.team_id)?.local_path}async function _J(t,e){let n;try{n=await fetch(t,{signal:AbortSignal.timeout(dJ)})}catch(s){throw new Bn(e,`fetch ${t} failed: ${s.message}`)}if(!n.ok)throw new Bn(e,`fetch ${t} \u2192 HTTP ${n.status}`);let r=await n.text();if(r.length>iI)throw new Bn(e,`fetched ${t} exceeds ${iI} bytes`);return r}function hJ(t,e,n,r){let s=rJ(t,e,{cwd:n,env:Tn(void 0,n),encoding:"utf8",timeout:6e4});if(s.error)throw new Bn(r,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Bn(r,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function gJ(t){if(typeof t!="string")return t.name;let e=sI(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?sI(t.replace(/\/skill\.md$/i,"")):e}async function oI(t,e,n){let r=gJ(t),s=Lt(e,r);if(iJ(s,{recursive:!0}),typeof t!="string")return rI(Lt(s,"SKILL.md"),t.content,"utf8"),{name:r,dir:s};if(Nm(t)&&(t=await eI(t)),lI.test(t))return rI(Lt(s,"SKILL.md"),await _J(t,n),"utf8"),{name:r,dir:s};if(!sJ(t))throw new Bn(n,`skill path not found: ${t}`);return aJ(t).isDirectory()?(nI(t,s,{recursive:!0}),{name:r,dir:s}):(nI(t,Lt(s,"SKILL.md")),{name:r,dir:s})}async function cI(t){let{dal:e,member:n,stderr:r}=t,s=mJ(e,n);if(s.mcp.length===0&&s.skills.length===0)return;let i=Qe(n),o=n.sessiondir||t.baseDir||pJ(e,n)||process.cwd(),a=l=>{r.write(`[seed:${n.alias}] ${l}
|
|
2967
|
+
`)};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(uJ.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=oJ(Lt(cJ(),`lmctl-skill-${n.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!lI.test(c)?c:(await oI(c,l,n.alias)).dir;hJ(i,["skills","install",d,"--scope","user","--consent"],o,n.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(aI[i]!==void 0){let l=aI[i]();for(let c of s.skills)await oI(c,l,n.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 Bn,lI,dJ,iI,uJ,fJ,ki,aI,dI=w(()=>{"use strict";ct();tI();Et();pi();Bn=class extends Error{alias;constructor(e,n){super(`capability install failed for ${e}: ${n}`),this.alias=e,this.name="CapabilityInstallError"}},lI=/^https?:\/\//i,dJ=8e3,iI=1e6,uJ=new Set(["opencode"]),fJ=t=>JSON.stringify(t),ki=()=>process.env.HOME??lJ();aI={claude:()=>Lt(ki(),".claude","skills"),qwen:()=>Lt(ki(),".qwen","skills"),codex:()=>Lt(ki(),".codex","skills"),copilot:()=>Lt(ki(),".copilot","skills"),kimi:()=>Lt(process.env.KIMI_CODE_HOME??Lt(ki(),".kimi-code"),"skills")}});var Rm,uI=w(()=>{"use strict";Rm=`---
|
|
2968
2968
|
|
|
2969
2969
|
# Durable memory \u2014 how to use it
|
|
2970
2970
|
|
|
@@ -2990,7 +2990,7 @@ ${Rm}`:Rm;n.setMemberPromptSnapshot(m.id,g),u.push(_);let y=_l(Qe(_),p.sessionid
|
|
|
2990
2990
|
`);try{await cI({dal:n,member:_,stderr:e.stderr})}catch(E){f=!0,e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
2991
2991
|
`)}}}return B(s,"--json")?Y(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2992
2992
|
`),f?1:0}function NJ(t,e,n){return t.filter(r=>e!==void 0&&r.alias!==e?!1:n||r.sessionid===null)}function xJ(t,e,n){let r=Z(t,["--interpreter","--of"]);if(r.error!==void 0)return I(e,r.error);let[s]=r.positionals;if(s===void 0)return I(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return I(e,`team not found: ${s}`);let o=$(r,"--interpreter"),a=$(r,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return I(e,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return I(e,`member not found: ${o}`);for(let c of a){let d=n.findTeamMemberByAlias(i.id,c);if(d===null)return I(e,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2993
|
-
`),0}var wJ,pI=w(()=>{"use strict";qe();$d();Zk();ct();
|
|
2993
|
+
`),0}var wJ,pI=w(()=>{"use strict";qe();$d();Zk();ct();At();dI();ba();Ce();uI();wJ=`usage: lmctl team create <name>
|
|
2994
2994
|
lmctl team list [--json]
|
|
2995
2995
|
lmctl team show <name> [--json]
|
|
2996
2996
|
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
@@ -3003,7 +3003,7 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
|
3003
3003
|
refresh to create/update native provider sessions for team members.
|
|
3004
3004
|
team refresh rejects Lead members (alias matching is case-insensitive).
|
|
3005
3005
|
`});var vI={};me(vI,{applyMaxBytes:()=>Rl,parseTailSince:()=>wI,renderMessage:()=>EI,runTail:()=>CJ});async function CJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${OJ}
|
|
3006
|
-
`),0;let n=Z(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help"]);if(n.error!==void 0)return I(e,n.error);let r=$(n,"--since"),s=wI(r);if("error"in s)return I(e,s.error);let i=s.date,o=$(n,"--lines"),a=$(n,"--max-bytes");if(o!==void 0&&a!==void 0)return I(e,"--lines and --max-bytes are mutually exclusive (choose one)");let l;if(o!==void 0){let h=Number.parseInt(o,10);if(!Number.isFinite(h)||h<1||String(h)!==o)return I(e,`invalid --lines "${o}" (expected a positive integer)`);l={kind:"lines",lines:h}}else{let h=a===void 0?RJ:Number.parseInt(a,10);if(!Number.isFinite(h)||h<0||a!==void 0&&String(h)!==a)return I(e,`invalid --max-bytes "${a}" (expected a non-negative integer)`);l={kind:"bytes",maxBytes:h}}let c=B(n,"--watch"),d=$(n,"--watch-interval"),u=d===void 0?LJ:Number.parseInt(d.replace(/s$/,""),10);if(!Number.isFinite(u)||u<1)return I(e,`invalid --watch-interval "${d}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let f=$(n,"--run");if(f!==void 0){if(n.positionals.length>0)return I(e,"--run is mutually exclusive with positional [target] [alias]");if($(n,"--session")!==void 0)return I(e,"--run is mutually exclusive with --session");if($(n,"--provider")!==void 0)return I(e,"--run is mutually exclusive with --provider");let h=Number.parseInt(f,10);if(!Number.isFinite(h)||h<=0||String(h)!==f)return I(e,`invalid --run "${f}" (expected a positive integer run id)`);try{return await O(e,async g=>$J(e,g,h,l,c,u,i))}catch(g){return Ue(e,g)}}let m=Kt(AJ,{target:n.positionals[0],alias:n.positionals[1],flags:{session:$(n,"--session"),provider:$(n,"--provider")}});if(m.mode==="error")return I(e,m.message);if(m.mode==="managed")return I(e,"tail managed mode requires --run <id>");let p;if(m.mode==="ai-team")if(m.alias===void 0){let h;try{h=await O(e,E=>we(m.teamfile,E))}catch(E){return I(e,`tail: ${E instanceof Error?E.message:String(E)}`)}let g;try{g=Fe(h)}catch(E){return I(e,`tail: ${E instanceof Error?E.message:String(E)}`)}let y=pt(g);if(y===void 0)return I(e,`tail: ${m.teamfile} has no Lead member; pass <tf>:<alias>`);try{let E=await O(e,S=>Xe(m.teamfile,y.alias,S));p={provider:E.provider,sessionId:E.sessionid,cwd:E.sessiondir}}catch(E){return E instanceof be?I(e,E.message):Ue(e,E)}}else try{let h=await O(e,g=>Xe(m.teamfile,m.alias,g));p={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof be?I(e,h.message):Ue(e,h)}else{let h=m.sessionid,g=m.provider;if(g===void 0){let y=await
|
|
3006
|
+
`),0;let n=Z(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help"]);if(n.error!==void 0)return I(e,n.error);let r=$(n,"--since"),s=wI(r);if("error"in s)return I(e,s.error);let i=s.date,o=$(n,"--lines"),a=$(n,"--max-bytes");if(o!==void 0&&a!==void 0)return I(e,"--lines and --max-bytes are mutually exclusive (choose one)");let l;if(o!==void 0){let h=Number.parseInt(o,10);if(!Number.isFinite(h)||h<1||String(h)!==o)return I(e,`invalid --lines "${o}" (expected a positive integer)`);l={kind:"lines",lines:h}}else{let h=a===void 0?RJ:Number.parseInt(a,10);if(!Number.isFinite(h)||h<0||a!==void 0&&String(h)!==a)return I(e,`invalid --max-bytes "${a}" (expected a non-negative integer)`);l={kind:"bytes",maxBytes:h}}let c=B(n,"--watch"),d=$(n,"--watch-interval"),u=d===void 0?LJ:Number.parseInt(d.replace(/s$/,""),10);if(!Number.isFinite(u)||u<1)return I(e,`invalid --watch-interval "${d}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let f=$(n,"--run");if(f!==void 0){if(n.positionals.length>0)return I(e,"--run is mutually exclusive with positional [target] [alias]");if($(n,"--session")!==void 0)return I(e,"--run is mutually exclusive with --session");if($(n,"--provider")!==void 0)return I(e,"--run is mutually exclusive with --provider");let h=Number.parseInt(f,10);if(!Number.isFinite(h)||h<=0||String(h)!==f)return I(e,`invalid --run "${f}" (expected a positive integer run id)`);try{return await O(e,async g=>$J(e,g,h,l,c,u,i))}catch(g){return Ue(e,g)}}let m=Kt(AJ,{target:n.positionals[0],alias:n.positionals[1],flags:{session:$(n,"--session"),provider:$(n,"--provider")}});if(m.mode==="error")return I(e,m.message);if(m.mode==="managed")return I(e,"tail managed mode requires --run <id>");let p;if(m.mode==="ai-team")if(m.alias===void 0){let h;try{h=await O(e,E=>we(m.teamfile,E))}catch(E){return I(e,`tail: ${E instanceof Error?E.message:String(E)}`)}let g;try{g=Fe(h)}catch(E){return I(e,`tail: ${E instanceof Error?E.message:String(E)}`)}let y=pt(g);if(y===void 0)return I(e,`tail: ${m.teamfile} has no Lead member; pass <tf>:<alias>`);try{let E=await O(e,S=>Xe(m.teamfile,y.alias,S));p={provider:E.provider,sessionId:E.sessionid,cwd:E.sessiondir}}catch(E){return E instanceof be?I(e,E.message):Ue(e,E)}}else try{let h=await O(e,g=>Xe(m.teamfile,m.alias,g));p={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof be?I(e,h.message):Ue(e,h)}else{let h=m.sessionid,g=m.provider;if(g===void 0){let y=await Pn(h);if(y.length===0)return I(e,`tail: session "${h}" not found in any provider store`);if(y.length>1)return I(e,`tail: session "${h}" matches multiple providers (${y.join(", ")}); pass --provider`);g=y[0]}p={provider:g,sessionId:h}}let _=await _I(e,p.provider,p.sessionId,l,-1,i);return _<0?1:c?await new Promise(h=>{let g=async()=>{try{let S=await _I(e,p.provider,p.sessionId,l,_,i);S>=0&&(_=S)}catch(S){e.stderr.write(`tail: ${S instanceof Error?S.message:String(S)}
|
|
3007
3007
|
`)}},y=setInterval(()=>{g()},u*1e3),E=()=>{clearInterval(y),h(0)};process.once("SIGINT",E),process.once("SIGTERM",E)}):0}async function _I(t,e,n,r,s,i){let o;try{o=await $e(n,e)}catch(d){return t.stderr.write(`tail: failed to load session: ${d instanceof Error?d.message:String(d)}
|
|
3008
3008
|
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
|
|
3009
3009
|
`),-1;let a=o.messages??[],l=s<0&&r.kind==="lines"?Math.max(0,a.length-r.lines):s+1;if(s<0&&i!==void 0){let d=i.getTime(),u=a.length;for(let f=0;f<a.length;f+=1){let m=a[f].timestamp,p=m===void 0?NaN:(m instanceof Date?m:new Date(m)).getTime();if(!Number.isNaN(p)&&p>=d){u=f;break}}l=Math.max(l,u)}if(l>=a.length)return a.length-1;let c="";for(let d=l;d<a.length;d+=1)c+=`${EI(a[d])}
|
|
@@ -3015,7 +3015,7 @@ ${o.map(a=>` ${a}`).join(`
|
|
|
3015
3015
|
`)}`}async function $J(t,e,n,r,s,i,o){if(e.getRun(n)===null)return I(t,`tail: run ${n}: not found`);let l=o===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=o.getTime()),d=(r.kind==="lines"?l.slice(Math.max(0,l.length-r.lines)):l).map(f=>`${yI(f)}
|
|
3016
3016
|
`).join("");t.stdout.write(r.kind==="bytes"?Rl(d,r.maxBytes):d);let u=l.length>0?l[l.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let h=e.listSessionEvents(n,u),g="";for(let y of h)g+=`${yI(y)}
|
|
3017
3017
|
`,u=y.id;g.length>0&&t.stdout.write(r.kind==="bytes"?Rl(g,r.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
3018
|
-
`)}},i*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Rl(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(hI,"utf8");if(r>=e)return gI(t,e);let s=e-r,i=gI(t,s);return`${hI}${i}`}function gI(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function yI(t){let e=TI(new Date(t.timestamp_ms))??"",n="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(n=`alias=${i.alias}`),typeof i.provider=="string"&&(n+=`${n?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(n+=`${n?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(n+=`${n?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function wI(t){return yi(t,"--since")}function TI(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let n=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`}var AJ,RJ,LJ,OJ,hI,SI=w(()=>{"use strict";
|
|
3018
|
+
`)}},i*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Rl(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(hI,"utf8");if(r>=e)return gI(t,e);let s=e-r,i=gI(t,s);return`${hI}${i}`}function gI(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function yI(t){let e=TI(new Date(t.timestamp_ms))??"",n="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(n=`alias=${i.alias}`),typeof i.provider=="string"&&(n+=`${n?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(n+=`${n?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(n+=`${n?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function wI(t){return yi(t,"--since")}function TI(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let n=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`}var AJ,RJ,LJ,OJ,hI,SI=w(()=>{"use strict";At();Ce();xt();Xt();Gt();cm();AJ={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},RJ=4096,LJ=2,OJ=`usage: lmctl tail [target] [alias]
|
|
3019
3019
|
lmctl tail --session <id> [--provider <name>]
|
|
3020
3020
|
lmctl tail --run <id>
|
|
3021
3021
|
[--lines N | --max-bytes N] [--since <duration|ISO8601>]
|
|
@@ -3054,7 +3054,7 @@ so --since only affects what the FIRST render includes.`;hI=`\u2026 [truncated o
|
|
|
3054
3054
|
ended_at = excluded.ended_at,
|
|
3055
3055
|
exit_code = excluded.exit_code,
|
|
3056
3056
|
error = excluded.error
|
|
3057
|
-
`).run(e.id,e.kind,e.origin,e.target_teamfile,e.target_alias,e.from_identity,e.provider,e.session_id,e.command,e.status,e.started_at,e.ended_at,e.exit_code,e.error)}function DI(t){return t.prepare("SELECT DISTINCT provider, session_id FROM indexed_invocation WHERE provider IS NOT NULL AND session_id IS NOT NULL").all()}var jJ,PJ,jI=w(()=>{"use strict";Ql();qe()
|
|
3057
|
+
`).run(e.id,e.kind,e.origin,e.target_teamfile,e.target_alias,e.from_identity,e.provider,e.session_id,e.command,e.status,e.started_at,e.ended_at,e.exit_code,e.error)}function DI(t){return t.prepare("SELECT DISTINCT provider, session_id FROM indexed_invocation WHERE provider IS NOT NULL AND session_id IS NOT NULL").all()}var jJ,PJ,jI=w(()=>{"use strict";Ql();qe();Mt();jJ="session-index.db";PJ=`
|
|
3058
3058
|
CREATE TABLE IF NOT EXISTS indexed_session (
|
|
3059
3059
|
provider TEXT NOT NULL,
|
|
3060
3060
|
session_id TEXT NOT NULL,
|
|
@@ -3138,14 +3138,14 @@ CREATE TABLE IF NOT EXISTS build_lock (
|
|
|
3138
3138
|
pid INTEGER NOT NULL
|
|
3139
3139
|
);
|
|
3140
3140
|
`});var qI={};me(qI,{discoverTargets:()=>UI,indexOneSession:()=>WI,pullInvocations:()=>FI,runSessionIndex:()=>WJ});import{existsSync as FJ}from"node:fs";async function WJ(t,e,n=Lm){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${UJ}
|
|
3141
|
-
`),0;let[r]=t;if(r!=="build")return I(e,`session-index: unknown subcommand "${r??""}" (expected: build)`);let s=z(),i=kI(),o={invocations_pulled:0,sessions_scanned:0,sessions_updated:0,sessions_skipped_unchanged:0,errors:[]};if(!FJ(s))return Y(e,{schema_version:1,index_db:i,state_db_found:!1,...o}),0;let a=II(i),l=NI(s);try{RI(a);try{o.invocations_pulled=FI(l,a);let c=UI(l,a,n),d=new Map;for(let u of new Set(c.map(f=>f.provider)))d.set(u,await n.listSessions({provider:u}));for(let u of c){o.sessions_scanned+=1;try{let f=d.get(u.provider)?.find(p=>p.sessionId===u.sessionId);await WI(a,u,f,n)?o.sessions_updated+=1:o.sessions_skipped_unchanged+=1}catch(f){o.errors.push(`${u.provider}:${u.sessionId} \u2014 ${f instanceof Error?f.message:String(f)}`)}}}finally{LI(a)}}finally{l.close(),a.close()}return Y(e,{schema_version:1,index_db:i,state_db_found:!0,...o}),0}function FI(t,e){let n=xI(e,PI),r=t.prepare("SELECT id, kind, origin, target_teamfile, target_alias, from_identity, meta, command, status, started_at, ended_at, exit_code, error FROM tracked_invocation WHERE id > ? ORDER BY id ASC").all(n),s=n;for(let
|
|
3142
|
-
`),PI="tracked_invocation_max_id",Lm={listSessions:
|
|
3143
|
-
`),0;let n=Z(t,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return I(e,n.error);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=B(n,"--json"),s=$(n,"--run");if(s!==void 0){if(n.positionals.length>0)return I(e,"--run is mutually exclusive with positional [target] [alias]");if($(n,"--provider")!==void 0)return I(e,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return I(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>nG(e,u,d,r))}catch(u){return Ue(e,u)}}let i=Kt(zJ,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:$(n,"--provider")}});if(i.mode==="error")return I(e,i.message);if(i.mode==="managed")return I(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await O(e,u=>we(i.teamfile,u))}catch(u){return I(e,`health: ${u instanceof Error?u.message:String(u)}`)}return rG(e,d,r)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await O(e,u=>Xe(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof be?I(e,d.message):Ue(e,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await
|
|
3141
|
+
`),0;let[r]=t;if(r!=="build")return I(e,`session-index: unknown subcommand "${r??""}" (expected: build)`);let s=z(),i=kI(),o={invocations_pulled:0,sessions_scanned:0,sessions_updated:0,sessions_skipped_unchanged:0,errors:[]};if(!FJ(s))return Y(e,{schema_version:1,index_db:i,state_db_found:!1,...o}),0;let a=II(i),l=NI(s);try{RI(a);try{o.invocations_pulled=FI(l,a);let c=UI(l,a,n),d=new Map;for(let u of new Set(c.map(f=>f.provider)))d.set(u,await n.listSessions({provider:u}));for(let u of c){o.sessions_scanned+=1;try{let f=d.get(u.provider)?.find(p=>p.sessionId===u.sessionId);await WI(a,u,f,n)?o.sessions_updated+=1:o.sessions_skipped_unchanged+=1}catch(f){o.errors.push(`${u.provider}:${u.sessionId} \u2014 ${f instanceof Error?f.message:String(f)}`)}}}finally{LI(a)}}finally{l.close(),a.close()}return Y(e,{schema_version:1,index_db:i,state_db_found:!0,...o}),0}function FI(t,e){let n=xI(e,PI),r=t.prepare("SELECT id, kind, origin, target_teamfile, target_alias, from_identity, meta, command, status, started_at, ended_at, exit_code, error FROM tracked_invocation WHERE id > ? ORDER BY id ASC").all(n),s=En(),i=n,o=0;for(let a of r){let l=null,c=null;if(a.meta!==null)try{let d=JSON.parse(a.meta);typeof d.provider=="string"&&(l=d.provider),typeof d.sessionid=="string"&&(c=d.sessionid)}catch{}if(MI(e,{id:a.id,kind:a.kind,origin:a.origin,target_teamfile:a.target_teamfile,target_alias:a.target_alias,from_identity:a.from_identity,provider:l,session_id:c,command:a.command,status:a.status,started_at:a.started_at,ended_at:a.ended_at,exit_code:a.exit_code,error:a.error}),o+=1,a.status==="running"&&Date.now()-new Date(a.started_at).getTime()<=s)break;i=a.id}return i>n&&AI(e,PI,i),o}function UI(t,e,n=Lm){let r=new Map,s=t.prepare("SELECT teamfile_path FROM root_team ORDER BY teamfile_path ASC").all().map(i=>i.teamfile_path);for(let i of s){let o;try{o=n.readTeamConfig(i)}catch{continue}for(let a of o.members){if(a.session===void 0||a.session.length===0)continue;let l=`${a.provider}\0${a.session}`;r.set(l,{provider:a.provider,sessionId:a.session,teamfile:i,alias:a.alias})}}for(let{provider:i,session_id:o}of DI(e)){let a=`${i}\0${o}`;r.has(a)||r.set(a,{provider:i,sessionId:o,teamfile:null,alias:null})}return[...r.values()]}async function WI(t,e,n,r=Lm){if(n===void 0)return!1;let s={modifiedAt:n.modifiedAt.toISOString(),messageCount:n.messageCount},i=CI(t,e.provider,e.sessionId);if(i!==null&&i.modified_at===s.modifiedAt&&i.message_count===s.messageCount)return!1;let o=await r.loadSessionDetail(e.sessionId,e.provider);if(o===null)return!1;let a=yl(o);return $I(t,e.provider,e.sessionId,o.messages.filter(l=>l.role==="user"||l.role==="assistant").map((l,c)=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,seq:c,role:l.role,content:l.content,model:l.model??null,timestamp_ms:l.timestamp.getTime()})),a.map(l=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,kind:l.kind,name:l.name,command:l.command??null,path:l.path??null,started_at:l.startedAt,ended_at:l.endedAt,result:l.result}))),OI(t,{provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,modified_at:s.modifiedAt,message_count:s.messageCount,indexed_at:new Date().toISOString()}),!0}var UJ,PI,Lm,BI=w(()=>{"use strict";gt();Xt();ut();At();qe();El();jI();Ce();UJ=["usage: lmctl session-index build [--db PATH]","","One-shot background aggregation into ~/.lmctl/session-index.db (a","separate file from state.db). Indexes provider session messages,","classified tool calls, and lmctl's own tracked_invocation dispatch","history for every teamfile member lmctl knows about, plus any","superseded sessions already on record. Idempotent and safe to run on","a cron/loop; not wired into `lmctl serve` in this pass."].join(`
|
|
3142
|
+
`),PI="tracked_invocation_max_id",Lm={listSessions:zn,loadSessionDetail:$e,readTeamConfig:Fe}});function Om(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=qJ.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),i=r[2]===void 0?0:Number.parseInt(r[2],10),o=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:BJ(n.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function BJ(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let i=HJ(e,r);try{let o=XJ(t,s),a=HI(o.year,o.month,o.day,i,n,s);if(a.getTime()<=t.getTime()){let l=VJ(o,1);a=HI(l.year,l.month,l.day,i,n,s)}return a.toISOString()}catch{return null}}function HJ(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function XJ(t,e){let n=XI(e,!1).formatToParts(t);return{year:hn(n,"year"),month:hn(n,"month"),day:hn(n,"day")}}function HI(t,e,n,r,s,i){let o=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=JJ(new Date(o),i);o=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(o)}function JJ(t,e){let n=XI(e,!0).formatToParts(t);return Date.UTC(hn(n,"year"),hn(n,"month")-1,hn(n,"day"),hn(n,"hour"),hn(n,"minute"),hn(n,"second"),0)-t.getTime()}function XI(t,e){let n=e?KJ:GJ,r=n.get(t);if(r!==void 0)return r;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 n.set(t,s),s}function hn(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function VJ(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var qJ,GJ,KJ,JI=w(()=>{"use strict";qJ=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;GJ=new Map,KJ=new Map});var eN={};me(eN,{runInfo:()=>eG});import{execFileSync as Cm}from"node:child_process";import{dirname as GI,resolve as YJ}from"node:path";function QJ(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function eG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ZJ}
|
|
3143
|
+
`),0;let n=Z(t,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return I(e,n.error);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=B(n,"--json"),s=$(n,"--run");if(s!==void 0){if(n.positionals.length>0)return I(e,"--run is mutually exclusive with positional [target] [alias]");if($(n,"--provider")!==void 0)return I(e,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return I(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>nG(e,u,d,r))}catch(u){return Ue(e,u)}}let i=Kt(zJ,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:$(n,"--provider")}});if(i.mode==="error")return I(e,i.message);if(i.mode==="managed")return I(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await O(e,u=>we(i.teamfile,u))}catch(u){return I(e,`health: ${u instanceof Error?u.message:String(u)}`)}return rG(e,d,r)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await O(e,u=>Xe(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof be?I(e,d.message):Ue(e,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await Pn(a);if(d.length===0)return I(e,`health: session "${a}" not found in any provider store`);if(d.length>1)return I(e,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return tG(e,o,a,l,r,c)}async function tG(t,e,n,r,s,i){let o;try{o=await $e(n,e)}catch(d){return I(t,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return I(t,`health: session not found: ${n} (provider=${e})`);let a=Om(o.messages),l=i===void 0?null:await sG(t,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...r!==void 0?{alias:r}:{},...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?(Y(t,c),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
3144
3144
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
3145
3145
|
`),r!==void 0&&t.stdout.write(` Alias: ${r}
|
|
3146
3146
|
`),l!==null&&t.stdout.write(` Liveness: ${$m(l.liveness)}
|
|
3147
3147
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
3148
|
-
`),t.stdout.write(` Messages: ${
|
|
3148
|
+
`),t.stdout.write(` Messages: ${Ot(o.messageCount)}
|
|
3149
3149
|
`),t.stdout.write(` Model: ${o.model??"(unknown)"}
|
|
3150
3150
|
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: n/a"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),c.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${c.totalCachedInputTokens})`),t.stdout.write(`
|
|
3151
3151
|
`),(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&t.stdout.write(` n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
@@ -3154,7 +3154,7 @@ CREATE TABLE IF NOT EXISTS build_lock (
|
|
|
3154
3154
|
`),a!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${YI(a)}
|
|
3155
3155
|
`),t.stdout.write(` Created: ${c.createdAt}
|
|
3156
3156
|
`),t.stdout.write(` Modified: ${c.modifiedAt}
|
|
3157
|
-
`),0)}async function nG(t,e,n,r){let s=
|
|
3157
|
+
`),0)}async function nG(t,e,n,r){let s=Qn(e,n);if(s===null)return I(t,`health: run ${n}: not found`);let i=jr(e,n),o=e.agentCallTokenTotals(n),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return r?(Y(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}
|
|
3158
3158
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
3159
3159
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
3160
3160
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -3168,12 +3168,12 @@ CREATE TABLE IF NOT EXISTS build_lock (
|
|
|
3168
3168
|
`)}let b=S?.messageCount,k=o===null?void 0:S===null?null:ZI(S,o.since),P=o===null?void 0:S===null?null:QI(S)??"n/a",U=o===null?void 0:{messageCount:k??null,tokens:null};l.push({alias:E.alias,reportPath:E.reportPath,teamfile:E.teamfile,provider:E.provider,sessionid:E.sessionid,messageCount:b??null,model:S?.model??"(unknown)",lastContext:S?.lastInputTokens,detailLoaded:S!==null,liveness:a.get(Mm(E.teamfile,E.alias))??Dm(),sessionLimit:S===null?null:Om(S.messages),...o!==null?{activitySinceLastCommit:U,cumulativeTokens:P}:{}}),b===void 0?c=void 0:c!==void 0&&(c+=b),o!==null&&(k==null?d=void 0:d!==void 0&&(d+=k),P==null||P==="n/a"?u=void 0:u!==void 0&&(u+=P))}if(n)return Y(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:S,...b})=>({...b,lastContext:b.lastContext??null,...S!==void 0?{cumulativeTokens:S==="n/a"?null:S}:{}})),total:{messageCount:c??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,_=Math.max(5,...l.map(E=>E.model.length))+1,h=Math.max(4,...l.map(E=>$m(E.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
|
|
3169
3169
|
`),i.kind==="repo"){t.stdout.write(`Git progress:
|
|
3170
3170
|
`);for(let E of i.commits)t.stdout.write(` ${E.ref}: ${E.timestamp.toISOString()}
|
|
3171
|
-
`);t.stdout.write(` Uncommitted: ${
|
|
3171
|
+
`);t.stdout.write(` Uncommitted: ${Ot(i.working.uncommittedTracked)} changed (tracked), ${Ot(i.working.untracked)} untracked
|
|
3172
3172
|
`)}else i.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
|
|
3173
3173
|
`):t.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
|
|
3174
3174
|
`);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(h)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
|
|
3175
|
-
`);let g=!1,y=l.filter(E=>E.sessionLimit!==null);for(let E of l){let S=aG(E.lastContext,E.detailLoaded,QJ);(S==="n/a"||E.cumulativeTokens==="n/a")&&(g=!0),t.stdout.write(` ${E.sessionid.padEnd(f)} ${E.reportPath.padEnd(m)}${E.provider.padEnd(p)}${E.model.padEnd(_)}${$m(E.liveness).padEnd(h)}${
|
|
3176
|
-
`)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(h)}${
|
|
3175
|
+
`);let g=!1,y=l.filter(E=>E.sessionLimit!==null);for(let E of l){let S=aG(E.lastContext,E.detailLoaded,QJ);(S==="n/a"||E.cumulativeTokens==="n/a")&&(g=!0),t.stdout.write(` ${E.sessionid.padEnd(f)} ${E.reportPath.padEnd(m)}${E.provider.padEnd(p)}${E.model.padEnd(_)}${$m(E.liveness).padEnd(h)}${Ot(E.messageCount).padStart(6)} ${S.padStart(12)}`+(o!==null?` ${Ot(E.activitySinceLastCommit?.messageCount).padStart(17)} ${Ot(E.activitySinceLastCommit?.tokens).padStart(19)} ${oG(E.cumulativeTokens).padStart(19)}`:"")+`
|
|
3176
|
+
`)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(h)}${Ot(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${Ot(d).padStart(17)} ${Ot(null).padStart(19)} ${Ot(u).padStart(19)}`:"")+`
|
|
3177
3177
|
`),g&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
3178
3178
|
`),t.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
|
|
3179
3179
|
Right after a compaction the last completed turn IS the summarisation request, which carried the
|
|
@@ -3181,14 +3181,14 @@ CREATE TABLE IF NOT EXISTS build_lock (
|
|
|
3181
3181
|
small. Re-read after the next turn before concluding a compaction failed or gating on the value.
|
|
3182
3182
|
`),y.length>0){t.stdout.write(`Session limits:
|
|
3183
3183
|
`);for(let E of y)t.stdout.write(` ${E.reportPath}: LIMITED resets_at=${YI(E.sessionLimit)}
|
|
3184
|
-
`)}return 0}function KI(t,e,n,r){let s=we(t,e);if(n.has(s))return[];n.add(s);let i=nt(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...KI(YJ(GI(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function sG(t,e,n){let r=await VI(t,[{teamfile:e.teamfile,alias:e.alias}]),s=zI(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(Mm(e.teamfile,e.alias))??Dm(),...i!==null?{activitySinceLastCommit:{messageCount:ZI(n,i.since),tokens:null},cumulativeTokens:QI(n)??"n/a"}:{}}}async function VI(t,e){try{let n=await O(t,r=>e.map(s=>{let i=
|
|
3184
|
+
`)}return 0}function KI(t,e,n,r){let s=we(t,e);if(n.has(s))return[];n.add(s);let i=nt(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...KI(YJ(GI(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function sG(t,e,n){let r=await VI(t,[{teamfile:e.teamfile,alias:e.alias}]),s=zI(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(Mm(e.teamfile,e.alias))??Dm(),...i!==null?{activitySinceLastCommit:{messageCount:ZI(n,i.since),tokens:null},cumulativeTokens:QI(n)??"n/a"}:{}}}async function VI(t,e){try{let n=await O(t,r=>e.map(s=>{let i=Tr(r,s.teamfile,s.alias);return[Mm(s.teamfile,s.alias),iG(i)]}));return new Map(n)}catch{return new Map}}function Mm(t,e){return`${t}\0${e.toLowerCase()}`}function iG(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Dm(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Dm(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function $m(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function YI(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Ot(t){return t==null?"unknown":String(t)}function oG(t){return t==="n/a"?t:Ot(t)}function aG(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function zI(t){let e=GI(t),n;try{Cm("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Cm("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:lG(e)}}function lG(t){let e;try{e=Cm("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function ZI(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function QI(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var zJ,ZJ,tN=w(()=>{"use strict";At();Ce();xt();Gt();gt();on();JI();zJ={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},ZJ=`usage: lmctl health [target] [alias]
|
|
3185
3185
|
lmctl health <teamfile> # team rollup
|
|
3186
3186
|
lmctl health <sessionid> [--provider <name>]
|
|
3187
3187
|
lmctl health --run <id> # run state, step rollup, and token totals
|
|
3188
3188
|
[--json]
|
|
3189
3189
|
|
|
3190
3190
|
Show provider session details, team rollups, or managed run state/token totals.`});var rN={};me(rN,{runLs:()=>fG});import{resolve as jm}from"node:path";function uG(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function fG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${cG}
|
|
3191
|
-
`),0;let n=Z(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return I(e,n.error);if(n.positionals.length>0)return I(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=$(n,"--format"),s=B(n,"--json");if(B(n,"--runs")){for(let g of["--provider","--sessiondir"])if($(n,g)!==void 0)return I(e,`--runs is mutually exclusive with ${g}`);for(let g of["--recursive","--all"])if(B(n,g))return I(e,`--runs is mutually exclusive with ${g}`);if(r==="teamfile")return I(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=$(n,"--limit"),_=dG;if(p!==void 0){let g=Number.parseInt(p,10);if(!Number.isFinite(g)||g<1||String(g)!==p)return I(e,`invalid --limit "${p}" (expected a positive integer)`);if(g>nN)return I(e,`--limit ${g} exceeds maximum (${nN})`);_=g}let h=r==="json"||s===!0?"json":"table";try{return await O(e,async g=>mG(e,g,_,h))}catch(g){return Ue(e,g)}}let o=pG(r,s);if("error"in o)return I(e,o.error);let a=o.format,l=$(n,"--provider"),c=$(n,"--sessiondir"),d=B(n,"--recursive"),u=B(n,"--all"),f;try{f=await
|
|
3191
|
+
`),0;let n=Z(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return I(e,n.error);if(n.positionals.length>0)return I(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=$(n,"--format"),s=B(n,"--json");if(B(n,"--runs")){for(let g of["--provider","--sessiondir"])if($(n,g)!==void 0)return I(e,`--runs is mutually exclusive with ${g}`);for(let g of["--recursive","--all"])if(B(n,g))return I(e,`--runs is mutually exclusive with ${g}`);if(r==="teamfile")return I(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=$(n,"--limit"),_=dG;if(p!==void 0){let g=Number.parseInt(p,10);if(!Number.isFinite(g)||g<1||String(g)!==p)return I(e,`invalid --limit "${p}" (expected a positive integer)`);if(g>nN)return I(e,`--limit ${g} exceeds maximum (${nN})`);_=g}let h=r==="json"||s===!0?"json":"table";try{return await O(e,async g=>mG(e,g,_,h))}catch(g){return Ue(e,g)}}let o=pG(r,s);if("error"in o)return I(e,o.error);let a=o.format,l=$(n,"--provider"),c=$(n,"--sessiondir"),d=B(n,"--recursive"),u=B(n,"--all"),f;try{f=await zn(l?{provider:l}:{})}catch(p){return I(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?jm(c):jm(process.cwd());f=f.filter(_=>{let h=jm(_.cwd);return d?h===p||h.startsWith(`${p}/`):h===p})}if(f=uG(f),a==="json")return Y(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";e.stdout.write(`No native sessions found ${_} ${p}.
|
|
3192
3192
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
3193
3193
|
`);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
|
|
3194
3194
|
`);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
@@ -3199,12 +3199,12 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
3199
3199
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
3200
3200
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
3201
3201
|
|
|
3202
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,dG=50,nN=500});import{existsSync as us,readFileSync as Um}from"node:fs";import{homedir as oN}from"node:os";import{dirname as aN,resolve as Bn}from"node:path";import{fileURLToPath as _G}from"node:url";function Wm(t,e={}){let n=[],r=yG(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&n.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&n.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;n.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){n.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&&n.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){n.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=IG(e.opencodeConfigPath);if(!a.available){n.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(c=>c.endsWith(`/${s.model}`));n.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}n.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=bG(e.kimiConfigPath);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${iN(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ol??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${iN(o)}`)}return n}function yG(t){if(!t&&Ii)return Ii;let e=new Map,n,r=t??EG();if(!us(r))return n=`${r} not found`,t||Pm(e),t||(Ii=e),t||(Ol=n),e;let s;try{s=Um(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Pm(e),t||(Ii=e),t||(Ol=n),e}for(let[i,o]of Object.entries(hG)){let a=vG(s,o),l=SG(a);l.length>0&&e.set(i,l)}return e.size===0&&(n=`${r} has no tested model rows`),!t&&e.size===0&&Pm(e),t||(Ii=e),t||(Ol=n),e}function EG(){return wG(aN(_G(import.meta.url)))}function wG(t){let e=TG(t);if(e){let r=Bn(e,"durable-memory","model_selection.md");if(us(r))return r}let n=[Bn(t,"..","..","durable-memory","model_selection.md"),Bn(t,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(us(r))return r;return n[n.length-1]}function TG(t){let e=Bn(t);for(;;){if(us(Bn(e,"package.json")))return e;let n=aN(e);if(n===e)return null;e=n}}function Pm(t){for(let[e,n]of Object.entries(gG))t.set(e,n)}function vG(t,e){let r=new RegExp(`^## ${xG(e)}\\s*$`,"m").exec(t);if(!r)return"";let s=r.index+r[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function SG(t){let e=new Set;for(let n of t.split(/\r?\n/)){let r=n.trim();if(!r.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(r);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function bG(t){let e=process.env.KIMI_CODE_HOME||Bn(oN(),".kimi-code"),n=t??Bn(e,"config.toml");if(!us(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=Um(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=kG(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function kG(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function IG(t){let e=t??Bn(oN(),".config","opencode","opencode.json");if(!us(e))return{available:!0,models:[]};let n;try{n=JSON.parse(Um(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:NG(n)}}function NG(t){if(!Fm(t))return[];let e=Ll(t.provider)??Ll(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Fm(s))continue;let i=Ll(s.models)??Ll(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Ll(t){return Fm(t)?t:null}function Fm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function iN(t){return t.length>0?t.join(", "):"(none)"}function xG(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var hG,gG,Ii,Ol,lN=w(()=>{"use strict";hG={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},gG={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)"]},Ii=null});import{homedir as AG}from"node:os";import{basename as RG}from"node:path";function Cl(t,e){let n=new Set;return{text:t.replace(OG,(s,i)=>{let o=i.trim(),a=LG[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function $l(t){return{workdir:t.workdir,teamfile:t.teamfile,date:CG(t.date)}}function CG(t){return t.toISOString().slice(0,10)}var LG,OG,qm=w(()=>{"use strict";LG={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=RG(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>AG(),date:t=>t.date},OG=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ai={};me(Ai,{GEMINI_PROVIDER_NOTICE:()=>fN,_setLintOpenCodeConfigProbeForTests:()=>qG,_setLintSessiondirFsOpsForTests:()=>WG,_setTeamfileSeedForTests:()=>UG,buildRootTeamRegistrationRow:()=>yN,registerRootTeam:()=>EN,runHire:()=>zG,runLint:()=>YG,runRefresh:()=>ZG,runSeed:()=>hN,sha256Text:()=>gN});import{createHash as $G}from"node:crypto";import{accessSync as MG,constants as cN,existsSync as DG,readFileSync as jl,realpathSync as Xm,statSync as jG,writeFileSync as Dl}from"node:fs";import{dirname as Hn,resolve as uN}from"node:path";function UG(t){mN=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(ut(),xd)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function WG(t){fr=t===null?Jm:{...Jm,...t}}function qG(t){pN=t??$c}async function BG(t,e,n){let r=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await pN({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function HG(t,e){let n=Hn(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=uN(o);if(r.has(a))continue;let l=XG(a);l!==void 0&&(r.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 XG(t){try{if(fr.existsSync(t)){if(!fr.statSync(t).isDirectory())return"ENOTDIR";fr.accessSync(t,cN.W_OK);return}let e=KG(t);if(e===void 0)return;if(!fr.statSync(e).isDirectory())return"ENOTDIR";fr.accessSync(e,cN.W_OK);return}catch(e){return VG(e)??"permission check failed"}}function JG(t,e){let n=[];for(let r of t)r.teamfile!==void 0||r.sessiondir===void 0||_N(r.sessiondir,e)&&n.push(`${r.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return n}function GG(t,e,n,r){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!_N(i.sessiondir,r))continue;let o=n.get(i.alias.toLowerCase());if(o===void 0)continue;let a=wN(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function _N(t,e){return dN(t)===dN(e)}function dN(t){let e=uN(t);try{return Xm(e)}catch{return e}}function KG(t){let e=t;for(;;){try{if(fr.existsSync(e))return e}catch{return}let n=Hn(e);if(n===e)return;e=n}}function VG(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 YG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(PG),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3203
|
-
`),2;let n=t[0],r;try{r=await O(e,c=>we(n,c))}catch(c){return We(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(r)}catch(c){return We(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let i=Cf(s,
|
|
3202
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,dG=50,nN=500});import{existsSync as us,readFileSync as Um}from"node:fs";import{homedir as oN}from"node:os";import{dirname as aN,resolve as Hn}from"node:path";import{fileURLToPath as _G}from"node:url";function Wm(t,e={}){let n=[],r=yG(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&n.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&n.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;n.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){n.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&&n.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){n.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=IG(e.opencodeConfigPath);if(!a.available){n.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(c=>c.endsWith(`/${s.model}`));n.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}n.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=bG(e.kimiConfigPath);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${iN(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ol??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${iN(o)}`)}return n}function yG(t){if(!t&&Ii)return Ii;let e=new Map,n,r=t??EG();if(!us(r))return n=`${r} not found`,t||Pm(e),t||(Ii=e),t||(Ol=n),e;let s;try{s=Um(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Pm(e),t||(Ii=e),t||(Ol=n),e}for(let[i,o]of Object.entries(hG)){let a=vG(s,o),l=SG(a);l.length>0&&e.set(i,l)}return e.size===0&&(n=`${r} has no tested model rows`),!t&&e.size===0&&Pm(e),t||(Ii=e),t||(Ol=n),e}function EG(){return wG(aN(_G(import.meta.url)))}function wG(t){let e=TG(t);if(e){let r=Hn(e,"durable-memory","model_selection.md");if(us(r))return r}let n=[Hn(t,"..","..","durable-memory","model_selection.md"),Hn(t,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(us(r))return r;return n[n.length-1]}function TG(t){let e=Hn(t);for(;;){if(us(Hn(e,"package.json")))return e;let n=aN(e);if(n===e)return null;e=n}}function Pm(t){for(let[e,n]of Object.entries(gG))t.set(e,n)}function vG(t,e){let r=new RegExp(`^## ${xG(e)}\\s*$`,"m").exec(t);if(!r)return"";let s=r.index+r[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function SG(t){let e=new Set;for(let n of t.split(/\r?\n/)){let r=n.trim();if(!r.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(r);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function bG(t){let e=process.env.KIMI_CODE_HOME||Hn(oN(),".kimi-code"),n=t??Hn(e,"config.toml");if(!us(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=Um(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=kG(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function kG(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function IG(t){let e=t??Hn(oN(),".config","opencode","opencode.json");if(!us(e))return{available:!0,models:[]};let n;try{n=JSON.parse(Um(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:NG(n)}}function NG(t){if(!Fm(t))return[];let e=Ll(t.provider)??Ll(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Fm(s))continue;let i=Ll(s.models)??Ll(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Ll(t){return Fm(t)?t:null}function Fm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function iN(t){return t.length>0?t.join(", "):"(none)"}function xG(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var hG,gG,Ii,Ol,lN=w(()=>{"use strict";hG={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},gG={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)"]},Ii=null});import{homedir as AG}from"node:os";import{basename as RG}from"node:path";function Cl(t,e){let n=new Set;return{text:t.replace(OG,(s,i)=>{let o=i.trim(),a=LG[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function $l(t){return{workdir:t.workdir,teamfile:t.teamfile,date:CG(t.date)}}function CG(t){return t.toISOString().slice(0,10)}var LG,OG,qm=w(()=>{"use strict";LG={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=RG(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>AG(),date:t=>t.date},OG=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ai={};me(Ai,{GEMINI_PROVIDER_NOTICE:()=>fN,_setLintOpenCodeConfigProbeForTests:()=>qG,_setLintSessiondirFsOpsForTests:()=>WG,_setTeamfileSeedForTests:()=>UG,buildRootTeamRegistrationRow:()=>yN,registerRootTeam:()=>EN,runHire:()=>zG,runLint:()=>YG,runRefresh:()=>ZG,runSeed:()=>hN,sha256Text:()=>gN});import{createHash as $G}from"node:crypto";import{accessSync as MG,constants as cN,existsSync as DG,readFileSync as jl,realpathSync as Xm,statSync as jG,writeFileSync as Dl}from"node:fs";import{dirname as Xn,resolve as uN}from"node:path";function UG(t){mN=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(ut(),xd)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function WG(t){mr=t===null?Jm:{...Jm,...t}}function qG(t){pN=t??$c}async function BG(t,e,n){let r=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await pN({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function HG(t,e){let n=Xn(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=uN(o);if(r.has(a))continue;let l=XG(a);l!==void 0&&(r.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 XG(t){try{if(mr.existsSync(t)){if(!mr.statSync(t).isDirectory())return"ENOTDIR";mr.accessSync(t,cN.W_OK);return}let e=KG(t);if(e===void 0)return;if(!mr.statSync(e).isDirectory())return"ENOTDIR";mr.accessSync(e,cN.W_OK);return}catch(e){return VG(e)??"permission check failed"}}function JG(t,e){let n=[];for(let r of t)r.teamfile!==void 0||r.sessiondir===void 0||_N(r.sessiondir,e)&&n.push(`${r.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return n}function GG(t,e,n,r){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!_N(i.sessiondir,r))continue;let o=n.get(i.alias.toLowerCase());if(o===void 0)continue;let a=wN(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function _N(t,e){return dN(t)===dN(e)}function dN(t){let e=uN(t);try{return Xm(e)}catch{return e}}function KG(t){let e=t;for(;;){try{if(mr.existsSync(e))return e}catch{return}let n=Xn(e);if(n===e)return;e=n}}function VG(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 YG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(PG),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3203
|
+
`),2;let n=t[0],r;try{r=await O(e,c=>we(n,c))}catch(c){return We(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(r)}catch(c){return We(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let i=Cf(s,Xn(r)),o=Wm(s.members),a=jl(r,"utf8"),l=Cl(a,$l({workdir:Xn(r),teamfile:r,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Rc(s.members,Xn(r))),o.push(...HG(s.members,r)),o.push(...JG(s.members,Xn(r))),o.push(...await BG(s.members,Xn(r),e.env));for(let c of i)e.stderr.write(`error: ${c.field}: ${c.message}
|
|
3204
3204
|
`);for(let c of s.members)Km([c],e),c.session!==void 0&&c.session.length<Ni&&o.push(`${c.alias}: sessionid is shorter than ${Ni} chars; run lmctl seed to refresh it`);for(let c of o)e.stderr.write(`warning: ${c}
|
|
3205
3205
|
`);return i.length>0?1:(e.stdout.write(`ok
|
|
3206
3206
|
`),0)}async function hN(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(FG),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
3207
|
-
`),2;let n=t[0],r;try{r=await O(e,g=>we(n,g))}catch(g){return We(e,`${n}: ${g instanceof Error?g.message:String(g)}`)}let s;try{s=Xm(r)}catch(g){return We(e,`${n}: ${g instanceof Error?g.message:String(g)}`)}let i=
|
|
3207
|
+
`),2;let n=t[0],r;try{r=await O(e,g=>we(n,g))}catch(g){return We(e,`${n}: ${g instanceof Error?g.message:String(g)}`)}let s;try{s=Xm(r)}catch(g){return We(e,`${n}: ${g instanceof Error?g.message:String(g)}`)}let i=Xn(r),o;try{o=Fe(r)}catch(g){return We(e,`${n}: ${g instanceof Error?g.message:String(g)}`)}let l=jl(r,"utf8").split(`
|
|
3208
3208
|
`),c=t4(l),d=GG(o.members,l,c,i),u=Cf(o,i);if(u.length>0){Km(o.members,e);for(let g of u)e.stderr.write(`error: ${g.field}: ${g.message}
|
|
3209
3209
|
`);return 1}try{rs(e,o,r)}catch{}Km(o.members,e);for(let g of Wm(o.members))e.stderr.write(`warning: ${g}
|
|
3210
3210
|
`);for(let g of Rc(o.members,i))e.stderr.write(`warning: ${g}
|
|
@@ -3220,7 +3220,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
3220
3220
|
`),_=a4(p,Xm(r));(_!==p||d)&&Dl(r,_,"utf8"),f===0&&e.stdout.write(`no members needed seeding
|
|
3221
3221
|
`);let h=new Date().toISOString();try{await O(e,g=>{EN(g,{teamfilePath:s,name:o.name,rawText:_,now:h})})}catch(g){return We(e,g instanceof Error?g.message:String(g))}return 0}async function zG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ml),0;let n=Z(t,["--provider","--sessiondir"],[]);if(n.error!==void 0)return Hm(e,n.error,Ml);if(n.positionals.length!==2)return Hm(e,"expected <teamfile.lmctl> and <alias>",Ml);let[r,s]=n.positionals;if(!s4(s))return We(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return We(e,"hire only applies to non-Lead members");let i=$(n,"--provider");if(i===void 0)return Hm(e,"missing value for --provider",Ml);if(!TN(i))return We(e,`invalid provider "${i}"`);let o;try{o=await O(e,u=>we(r,u))}catch(u){return We(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=jl(o,"utf8")}catch(u){return We(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}if(r4(a,s))return We(e,`${s}: alias already exists in ${o}`);let l=$(n,"--sessiondir"),c=[`_MEMBER_ alias=${Gm(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Gm(l)}`]].join(" "),d=o4(a,c);return Dl(o,d,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
|
|
3222
3222
|
`),e.stdout.write(`Run: lmctl seed ${o}
|
|
3223
|
-
`),0}async function ZG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Bm),0;let n,r;if(t.length===1){let u=
|
|
3223
|
+
`),0}async function ZG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Bm),0;let n,r;if(t.length===1){let u=lr(t[0]);if(u===null)return e.stderr.write(Bm),2;n=u.teamfile,r=u.alias}else if(t.length===2)[n,r]=t;else return e.stderr.write(Bm),2;let s;try{s=await O(e,u=>we(n,u))}catch(u){return We(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=jl(s,"utf8")}catch(u){return We(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
|
|
3224
3224
|
`),a=n4(o,r);if(a===void 0)return We(e,`${r}: no active _MEMBER_ entry found`);let l=o[a];if(xi(l,"teamfile")!==void 0)return We(e,`${r}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[As],d=xi(l,"sessionid");return c!==void 0&&c.length>0&&d===c?We(e,`${r}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=wN(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Dl(s,o.join(`
|
|
3225
3225
|
`),"utf8"),hN([s],e))}function gN(t){return $G("sha256").update(t).digest("hex")}function yN(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:gN(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function EN(t,e){let n=cl(e.rawText,e.teamfilePath);Kf(t,e.teamfilePath,n);let r=yN(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function QG(t,e,n){let r=n.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=r.length>0?r.join(`
|
|
3226
3226
|
`):"- (no non-Lead members)",i=n.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=e4(i,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <path>`,"- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
|
|
@@ -3242,7 +3242,7 @@ ${t}`:`${n}
|
|
|
3242
3242
|
`),1}function Hm(t,e,n){return t.stderr.write(`error: ${e}
|
|
3243
3243
|
${n}`),2}function Km(t,e){for(let n of t)n.teamfile!==void 0&&e.stderr.write(`warning: member "${n.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
3244
3244
|
`),n.provider==="gemini"&&e.stderr.write(`${fN.replace("%s",n.alias)}
|
|
3245
|
-
`)}var Ni,PG,FG,Ml,Bm,fN,Jm,mN,
|
|
3245
|
+
`)}var Ni,PG,FG,Ml,Bm,fN,Jm,mN,mr,pN,Ri=w(()=>{"use strict";Xt();lN();co();Et();Mc();Ce();xt();Gt();qm();pi();Ni=5,PG=`usage: lmctl lint <teamfile.lmctl>
|
|
3246
3246
|
|
|
3247
3247
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
3248
3248
|
For opencode members with model=, lint also asks the local ACP provider to
|
|
@@ -3264,7 +3264,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
3264
3264
|
re-seed.
|
|
3265
3265
|
A member cannot refresh its own running session; run the refresh from a
|
|
3266
3266
|
different member session or a plain operator shell.
|
|
3267
|
-
`,fN='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Jm={existsSync:DG,statSync:jG,accessSync:MG},mN=async t=>{let{seed:e}=await Promise.resolve().then(()=>(ut(),xd)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},
|
|
3267
|
+
`,fN='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Jm={existsSync:DG,statSync:jG,accessSync:MG},mN=async t=>{let{seed:e}=await Promise.resolve().then(()=>(ut(),xd)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},mr=Jm,pN=$c});var NN={};me(NN,{runClone:()=>_4});import{existsSync as Vm,mkdirSync as l4,readFileSync as c4,readdirSync as d4,statSync as kN,writeFileSync as u4}from"node:fs";import{basename as vN,dirname as f4,extname as m4,join as IN,resolve as SN}from"node:path";async function _4(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(p4),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
3268
3268
|
`),2;let[n,r]=t,s,i=n;try{if(/^http:\/\//i.test(n))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(n))s=await g4(n);else{let c=SN(n);if(!Vm(c))throw new Error(`source not found: ${n}`);let u=kN(c).isDirectory()?y4(c):c;s=c4(u,"utf8"),i=u}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
3269
3269
|
`),1}let o=SN(r),a=E4(o,i,r);if(Vm(a))return e.stderr.write(`error: ${a} already exists.
|
|
3270
3270
|
`),1;let l=T4(w4(s));return l4(f4(a),{recursive:!0}),u4(a,l,"utf8"),e.stdout.write(`Cloned ${n} -> ${a}
|
|
@@ -3351,7 +3351,7 @@ Examples:
|
|
|
3351
3351
|
|
|
3352
3352
|
# Same shape, codex for the Lead and Reviewer2
|
|
3353
3353
|
lmctl plan ./backend --provider codex
|
|
3354
|
-
`});import{execFileSync as nK}from"node:child_process";import{resolve as BN}from"node:path";function rK(t){return t.filter(e=>e.state!=="retired")}function HN(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?I(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=nK("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return I(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=BN(s),o=e.listProjects().find(a=>BN(a.local_path)===i);return o===void 0?I(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function XN(t,e,n,r){if(r!==void 0){let i=e.findTeamByName(r);return i===null?I(t,`team not found: ${r}`):i}let s=e.getTeam(n.team_id);return s===null?I(t,`project ${n.name} has no assigned team; use --team <name>`):s}function JN(t,e,n,r){if(r!==void 0){let i=e.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?I(t,`member not found: ${r}`):i}let s=rK(e.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?I(t,`team ${n.name} has no active agent member`):s}var GN=w(()=>{"use strict";Ce()});var YN={};me(YN,{SIZE_WARN_EST_TOKENS:()=>Ci,estimateTokens:()=>VN,runTerminal:()=>aK});import{spawn as sK}from"node:child_process";import{statSync as iK}from"node:fs";async function aK(t,e){if(t.includes("--help")||t.includes("-h"))return pK(e);let n=Z(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return I(e,n.error);let r=$(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return I(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return I(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"?B(n,o):$(n,o)!==void 0)return I(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=$(n,"--alias"),l=CT(o,s,a);return"err"in l?I(e,l.err):Zm(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 Ue(e,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?B(n,l):$(n,l)!==void 0)return I(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=Kt(oK,{target:i,alias:o,flags:{}});return a.mode==="error"?I(e,a.message):a.mode!=="ai-team"?I(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?I(e,"terminal: alias required for the teamfile target"):await O(e,l=>lK(e,a.teamfile,a.alias,l,B(n,"--json")))}try{return await O(e,async s=>{let i=uK(e,s,n);if(typeof i=="number")return i;let o=$(n,"--alias");return B(n,"--size")?mK(e,s,i,o,B(n,"--json")):fK(e,s,i,o)})}catch(s){return Ue(e,s)}}async function lK(t,e,n,r,s){let i;try{i=Xe(e,n,r)}catch(u){return u instanceof be?I(t,u.message):Ue(t,u)}let o=
|
|
3354
|
+
`});import{execFileSync as nK}from"node:child_process";import{resolve as BN}from"node:path";function rK(t){return t.filter(e=>e.state!=="retired")}function HN(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?I(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=nK("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return I(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=BN(s),o=e.listProjects().find(a=>BN(a.local_path)===i);return o===void 0?I(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function XN(t,e,n,r){if(r!==void 0){let i=e.findTeamByName(r);return i===null?I(t,`team not found: ${r}`):i}let s=e.getTeam(n.team_id);return s===null?I(t,`project ${n.name} has no assigned team; use --team <name>`):s}function JN(t,e,n,r){if(r!==void 0){let i=e.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?I(t,`member not found: ${r}`):i}let s=rK(e.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?I(t,`team ${n.name} has no active agent member`):s}var GN=w(()=>{"use strict";Ce()});var YN={};me(YN,{SIZE_WARN_EST_TOKENS:()=>Ci,estimateTokens:()=>VN,runTerminal:()=>aK});import{spawn as sK}from"node:child_process";import{statSync as iK}from"node:fs";async function aK(t,e){if(t.includes("--help")||t.includes("-h"))return pK(e);let n=Z(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return I(e,n.error);let r=$(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return I(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return I(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"?B(n,o):$(n,o)!==void 0)return I(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=$(n,"--alias"),l=CT(o,s,a);return"err"in l?I(e,l.err):Zm(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 Ue(e,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?B(n,l):$(n,l)!==void 0)return I(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=Kt(oK,{target:i,alias:o,flags:{}});return a.mode==="error"?I(e,a.message):a.mode!=="ai-team"?I(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?I(e,"terminal: alias required for the teamfile target"):await O(e,l=>lK(e,a.teamfile,a.alias,l,B(n,"--json")))}try{return await O(e,async s=>{let i=uK(e,s,n);if(typeof i=="number")return i;let o=$(n,"--alias");return B(n,"--size")?mK(e,s,i,o,B(n,"--json")):fK(e,s,i,o)})}catch(s){return Ue(e,s)}}async function lK(t,e,n,r,s){let i;try{i=Xe(e,n,r)}catch(u){return u instanceof be?I(t,u.message):Ue(t,u)}let o=wr(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:is()});if(!o.acquired){let u=o.current.holder_pid,f=u===null?null:ke(u)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(u===null?"(holder_pid=unavailable)":`(holder_pid=${u}, ${f})`);return s?(Y(t,{status:"error",errorKind:"busy",message:m,holder_pid:u,holder_liveness:f}),1):I(t,m)}let a=vb({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,d=null;try{r.setTerminalLock(a),c=cK(r,i),l=setInterval(()=>{try{let u=new Date().toISOString(),f=r.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,u);f&&r.heartbeatAgentInflight(o.lease,o.leaseId,u),!f&&l!==null&&(clearInterval(l),l=null)}catch{}},Sb()),l.unref?.();try{rs(t,Fe(i.teamfile),i.teamfile)}catch{}return d=await Zm(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),d}finally{l!==null&&clearInterval(l),r.clearTerminalLock(a.teamfile,a.alias,a.lock_id),r.releaseAgentInflight(o.lease,o.leaseId),dK(r,c,d)}}function cK(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 dK(t,e,n){if(e!==null)try{t.finishTrackedInvocation(e,{status:n===0?"done":"error",exit_code:n,result_summary:n===0?"terminal session ended":null,error:n===0?null:`terminal exited with code ${n??"unknown"}`})}catch{}}async function Zm(t,e){let{provider:n,sessionid:r,sessiondir:s,model:i}=e;if(!pl(n))return I(t,`no resume incantation for provider "${n}"`);if(!hb.test(r))return I(t,"refusing to resume: malformed sessionid");let o=tm(n,r,{isLead:e.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${d}
|
|
3355
3355
|
`),je({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return I(t,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let d=sK(a,l,{stdio:"inherit",cwd:s,env:Ve(process.env,s,r,"terminal")});d.on("error",u=>{c(I(t,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function uK(t,e,n){let r=$(n,"--team");if(r!==void 0){let o=e.findTeamByName(r);return o===null?I(t,`team not found: ${r}`):o}let s=HN(t,e,$(n,"--project"));return typeof s=="number"?s:XN(t,e,s,void 0)}async function fK(t,e,n,r){let s=JN(t,e,n,r);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?I(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${n.name}\` first`):Zm(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function VN(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=iK(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function mK(t,e,n,r,s){let i;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return I(t,`member not found: ${r}`);i=[a]}else i=e.listTeamMembers(n.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 c=Qe(a),d=a.model??null,u=null;pl(c)&&(u=await $e(l,c));let f=VN(u),m=f.est>Ci;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?_l(c,l,d!==null?{model:d}:{}):null})}if(s)return Y(t,{estimate:!0,legend:KN,guide_tokens:Ci,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
3356
3356
|
`),t.stdout.write(`${KN}
|
|
3357
3357
|
`);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
|
|
@@ -3393,7 +3393,7 @@ Examples:
|
|
|
3393
3393
|
tokens it surfaces the resume incantation so YOU can
|
|
3394
3394
|
open & self-compact. Nothing is ever changed
|
|
3395
3395
|
automatically; ${Ci} is a guide, not a gate.
|
|
3396
|
-
`),0}var oK,Ci,KN,zN=w(()=>{"use strict";ct();
|
|
3396
|
+
`),0}var oK,Ci,KN,zN=w(()=>{"use strict";ct();At();Ce();GN();xt();Xt();Et();pi();gt();Zf();om();qa();ce();Mt();oK={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Ci=2e5,KN="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as _K,randomBytes as hK}from"node:crypto";import{readFile as gK}from"node:fs/promises";function ZN(t=new Date,e=hK(4)){let n=t.getUTCFullYear().toString().padStart(4,"0"),r=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${n}${r}${s}-${i}${o}${a}-${l}`}function yK(t){return _K("sha256").update(t).digest("hex")}async function QN(t){return(await Promise.all(t.map(async({bundlePath:n,absPath:r})=>{let s=await gK(r);return{path:n,sha256:yK(s),size:s.byteLength}}))).sort((n,r)=>n.path<r.path?-1:n.path>r.path?1:0)}function ex(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Qm=w(()=>{"use strict"});import{spawnSync as tx}from"node:child_process";import{mkdir as ep,writeFile as nx,readFile as EK,rm as rx}from"node:fs/promises";import{tmpdir as wK}from"node:os";import{dirname as sx,join as tp}from"node:path";async function ix(t){let e=t.stagingDir??tp(wK(),`lmctl-diag-${t.ticketId}`),n=tp(e,`diagnostic-${t.ticketId}`);await ep(n,{recursive:!0});let r=[],s=async(u,f)=>{let m=tp(n,u);if(await ep(sx(m),{recursive:!0}),typeof f=="string")await nx(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await nx(m,new Uint8Array(p))}r.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
|
|
3397
3397
|
`;if(t.data.serve!==void 0){let u=t.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
|
|
3398
3398
|
`:`${u.pid}
|
|
3399
3399
|
# source=${u.pid_source} alive=${String(u.pid_alive)}
|
|
@@ -3411,12 +3411,12 @@ Examples:
|
|
|
3411
3411
|
`:`# source=${f}
|
|
3412
3412
|
# tail_lines=${u.tail_lines}
|
|
3413
3413
|
`;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
|
|
3414
|
-
`:""}`)}if(await s("README.md",TK(t)),t.sanitized)for(let u of r){let f=await EK(u.absPath);try{Tp(u.bundlePath,f.toString("utf8"))}catch(m){throw await rx(e,{recursive:!0,force:!0}),m instanceof
|
|
3414
|
+
`:""}`)}if(await s("README.md",TK(t)),t.sanitized)for(let u of r){let f=await EK(u.absPath);try{Tp(u.bundlePath,f.toString("utf8"))}catch(m){throw await rx(e,{recursive:!0,force:!0}),m instanceof Jn,m}}let o=await QN(r),a=ex({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:o});await s("manifest.json",i(a)),await ep(sx(t.outputPath),{recursive:!0});let l=tx("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=tx("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await rx(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:d}}function TK(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
|
|
3415
3415
|
`)}var ox=w(()=>{"use strict";Qm();Mi()});import{spawnSync as vK}from"node:child_process";import{stat as SK}from"node:fs/promises";async function ax(t){try{if(!(await SK(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return bK(t);case"hq":return kK(t)}}function bK(t){let n=vK("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return n?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function kK(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var lx=w(()=>{"use strict"});var dx={};me(dx,{parseDiagnoseArgs:()=>cx,runDiagnose:()=>xK});import{tmpdir as IK}from"node:os";import{join as NK}from"node:path";async function xK(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${LK()}
|
|
3416
3416
|
`),0;let n=cx(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
3417
3417
|
`),2;if(n.noSanitize&&(n.upload||n.internalS3||n.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
|
|
3418
3418
|
`),2;if(n.upload&&n.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
3419
|
-
`),2;let r=ZN(),s=n.outputPath??RK(r),i=n.internalS3?"internal-s3":n.upload?"hq":"local";try{return await O(e,async o=>{let a=await Sp({dal:o,include:n.include,dbPath:z(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await ix({ticketId:r,data:a,outputPath:s,lmctlNextVersion:
|
|
3419
|
+
`),2;let r=ZN(),s=n.outputPath??RK(r),i=n.internalS3?"internal-s3":n.upload?"hq":"local";try{return await O(e,async o=>{let a=await Sp({dal:o,include:n.include,dbPath:z(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await ix({ticketId:r,data:a,outputPath:s,lmctlNextVersion:Ct(),sanitized:!n.noSanitize})}catch(u){if(u instanceof Jn)return e.stderr.write(`sanitization failed: ${u.message}
|
|
3420
3420
|
`),2;throw u}let c=await ax({mode:i,bundlePath:l.outputPath,ticketId:r,hqUrl:n.hqUrl}),d={ticket_id:r,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!n.noSanitize,upload:c,manifest_files:l.manifest.files.length};return n.json?e.stdout.write(`${JSON.stringify(d,null,2)}
|
|
3421
3421
|
`):(e.stdout.write(`ticket: ${r}
|
|
3422
3422
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
@@ -3433,7 +3433,7 @@ Examples:
|
|
|
3433
3433
|
`),2;let r=n[0];try{return await O(e,s=>(e.stdout.write(mx(s,r)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
3434
3434
|
`),1}}function np(){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(`
|
|
3435
3435
|
`)}var fx,rp,sp,yx=w(()=>{"use strict";cf();Ce();fx=["Coder","Reviewer1","Polisher"],rp=3e4,sp=new Set(["attention_needed","paused","escalation"])});var $x={};me($x,{appendIntent:()=>xx,resolveIntentLogPath:()=>Nx,runStatus:()=>XK});import{appendFileSync as MK,existsSync as DK,mkdirSync as jK}from"node:fs";import{homedir as PK}from"node:os";import{basename as FK,dirname as Ix,isAbsolute as UK,join as WK,resolve as qK}from"node:path";function Nx(){return process.env.LMCTL_INTENT_LOG??WK(PK(),".lmctl","recent-intents.log")}function xx(t){try{let e=Nx();jK(Ix(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});MK(e,`${n}
|
|
3436
|
-
`)}catch{}}async function XK(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(BK),0;let n=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return I(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Z(t,["--since"],["--json"]);if(r.error!==void 0)return I(e,r.error);if(r.positionals.length>0)return I(e,`unknown argument: ${r.positionals[0]}`);let s=B(r,"--json"),i=_V($(r,"--since"));if("error"in i)return I(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>vx(l,o));Y(e,a)}else{let a=await O(e,async l=>rV(await vx(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return xx({verb:"status",args:t}),0}catch(o){return I(e,o instanceof Error?o.message:String(o))}}async function vx(t,e){let n=
|
|
3436
|
+
`)}catch{}}async function XK(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(BK),0;let n=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return I(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Z(t,["--since"],["--json"]);if(r.error!==void 0)return I(e,r.error);if(r.positionals.length>0)return I(e,`unknown argument: ${r.positionals[0]}`);let s=B(r,"--json"),i=_V($(r,"--since"));if("error"in i)return I(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>vx(l,o));Y(e,a)}else{let a=await O(e,async l=>rV(await vx(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return xx({verb:"status",args:t}),0}catch(o){return I(e,o instanceof Error?o.message:String(o))}}async function vx(t,e){let n=dr(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(fn("status"));return await GK(t)}return await JK(t,n.identity)}async function JK(t,e){let n=De(e),r=t.getRootTeam(n.teamfile);if(r===null)throw new Error(fn("status"));let s=nt(r.teamfile_path,t),i=op(Fl(t,{from:n.value})),o=op(Fl(t,{target_teamfile:n.teamfile,target_alias:n.alias})),a=zK([...ip(t,{from:n.value}),...ip(t,{target_teamfile:n.teamfile,target_alias:n.alias})]);return{scope:"self",identity:n.value,...Ax(),team:{name:s.name,teamfile:r.teamfile_path},members:s.members.map(l=>VK(t,r.teamfile_path,l)),activity:{from_me:i.map(l=>ap(l,t)),to_me:o.map(l=>ap(l,t))},transcript_harvest:await Rx(a)}}function Ax(){let t=null;try{t=q_(W_())}catch{}return{db_path:z(),site_name:t}}async function GK(t){let e=t.listRootTeams();return{scope:"db",identity:null,...Ax(),teams:e.map(n=>KK(t,n)),activity:op(Fl(t)).map(n=>ap(n,t)),transcript_harvest:await Rx(ip(t))}}function KK(t,e){if(!DK(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 n=0;try{n=nt(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function VK(t,e,n){let r=n.teamfile===void 0?null:we(UK(n.teamfile)?n.teamfile:qK(Ix(e),n.teamfile),t),s=Tr(t,e,n.alias),i=s.busy&&s.reason==="in-flight"?YK(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.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 YK(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,o=t.db.prepare(`
|
|
3437
3437
|
SELECT * FROM tracked_invocation
|
|
3438
3438
|
WHERE kind = 'chat'
|
|
3439
3439
|
AND status = 'running'
|
|
@@ -3447,11 +3447,11 @@ Examples:
|
|
|
3447
3447
|
SELECT * FROM tracked_invocation
|
|
3448
3448
|
${s}
|
|
3449
3449
|
ORDER BY started_at DESC, id DESC
|
|
3450
|
-
`).all(...r)}function ip(t,e={}){return Fl(t,e).filter(r=>r.kind==="chat"&&r.status==="running"&&yn(r)==="dead")}function zK(t){let e=new Set,n=[];for(let r of t)e.has(r.id)||(e.add(r.id),n.push(r));return n.sort((r,s)=>{let i=Date.parse(s.started_at)-Date.parse(r.started_at);return Number.isFinite(i)&&i!==0?i:s.id-r.id})}function op(t){return t.filter(e=>yn(e)!=="dead")}async function Rx(t){let e=[];for(let n of t)e.push(await ZK(n));return e}async function ZK(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,n={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
|
|
3450
|
+
`).all(...r)}function ip(t,e={}){return Fl(t,e).filter(r=>r.kind==="chat"&&r.status==="running"&&yn(r)==="dead")}function zK(t){let e=new Set,n=[];for(let r of t)e.has(r.id)||(e.add(r.id),n.push(r));return n.sort((r,s)=>{let i=Date.parse(s.started_at)-Date.parse(r.started_at);return Number.isFinite(i)&&i!==0?i:s.id-r.id})}function op(t){return t.filter(e=>yn(e)!=="dead")}async function Rx(t){let e=[];for(let n of t)e.push(await ZK(n));return e}async function ZK(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,n={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 pr(n,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return pr(n,"missing-request-payload",null,null);let r=QK(t.meta);if(r.provider===null||r.sessionid===null)return pr(n,"missing-session-metadata",r.provider,r.sessionid);if(!eV(r.provider))return pr(n,"unsupported-provider",r.provider,r.sessionid);let s;try{s=await $e(r.sessionid,r.provider)}catch{return pr(n,"read-error",r.provider,r.sessionid)}if(s===null)return pr(n,"session-not-found",r.provider,r.sessionid);let i=tV(t.request_payload,s.messages);return i.state!=="completed"?pr(n,i.reason,r.provider,r.sessionid):{...n,state:"completed",reason:null,provider:r.provider,session_id:r.sessionid,result_payload:i.result,result_preview:Cx(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function pr(t,e,n,r){return{...t,state:"unreconciled",reason:e,provider:n,session_id:r,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function QK(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 eV(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","ClaudeMock"].includes(t)}function tV(t,e){let n=e.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===t);if(n.length===0)return{state:"unreconciled",reason:"request-not-found"};if(n.length>1)return{state:"unreconciled",reason:"duplicate-request"};let r=n[0].index,s=[];for(let i of e.slice(r+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:r,result:s.map(i=>i.content).join(`
|
|
3451
3451
|
|
|
3452
3452
|
`),assistantTimestamp:nV(s[s.length-1]?.timestamp)}}function nV(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function ap(t,e){let n={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:yn(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:kx(t.result_summary),error:kx(t.error)};return n.mailbox_delivery=cV(n,e),n}function rV(t,e){return t.scope==="self"?iV(t,e):oV(t,e)}function sV(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",n=t.reason==="dead-pid"?"appears dead":"stale";return`idle (reclaimable lock: ${e} ${n})`}function iV(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,i=r.sessionid===null?"":` session=${r.sessionid}`,o=r.state==="idle"?sV(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${o} provider=${r.provider}${s}${i}${a}`)}return n.push(""),n.push("transcript harvest:"),Ox(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),lp(n,cp(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),lp(n,cp(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push(Lx(t)),n.join(`
|
|
3453
3453
|
`)}function oV(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),Ox(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),lp(n,cp(t.activity,e.sinceIso),"db"),n.push(""),n.push(Lx(t)),n.join(`
|
|
3454
|
-
`)}function Lx(t){return ps(t.db_path)}function lp(t,e,n){if(e.length===0){t.push(" none");return}let r=e.filter(bx).sort(aV),s=r.length===0?e:e.filter(i=>!bx(i));for(let i of r.slice(0,Ex))Sx(t,i,n);dp(t,r.length,Ex,"more open delegations");for(let i of s.slice(0,Pl))Sx(t,i,n);dp(t,s.length,Pl,"older")}function Ox(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Pl)){let s=n==="db"?` from ${
|
|
3454
|
+
`)}function Lx(t){return ps(t.db_path)}function lp(t,e,n){if(e.length===0){t.push(" none");return}let r=e.filter(bx).sort(aV),s=r.length===0?e:e.filter(i=>!bx(i));for(let i of r.slice(0,Ex))Sx(t,i,n);dp(t,r.length,Ex,"more open delegations");for(let i of s.slice(0,Pl))Sx(t,i,n);dp(t,s.length,Pl,"older")}function Ox(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Pl)){let s=n==="db"?` from ${_r(r.from_identity)} -> ${_r(r.target)}`:` -> ${_r(r.target)}`;if(r.state==="completed"){let i=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${i}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}dp(t,e.length,Pl,"more transcript harvest rows")}function cp(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function Sx(t,e,n){let r=mV(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${Cx(i)}"`;t.push(` #${e.id} ${lV(e)} ${e.kind}${r} ${s}${o}`)}function bx(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function aV(t,e){let n=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(n)&&n!==0?n:t.id-e.id}function lV(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function cV(t,e){let n=dV(t,e);return n===null?null:{mailbox_id:n.id,state:n.delivered_at!==null?"delivered":n.delivering_at!==null?"delivering":"queued",delivered_at:n.delivered_at,delivering_at:n.delivering_at}}function dV(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let n,r;try{n=De(t.from_identity),r=De(t.target)}catch{return null}for(let s of uV(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==n.teamfile||i.sender_alias!==n.alias)&&!(i.receiver_teamfile!==r.teamfile||i.receiver_alias!==r.alias)&&fV(i,t))return i}return null}function uV(t){let e=new Set,n=[];for(let r of t.matchAll(/\d+/g)){let s=Number(r[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),n.push(s))}return n}function fV(t,e){let n=Date.parse(e.started_at),r=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(s)?!1:s>=n&&s<=r}function mV(t,e){if(e==="from-me")return t.target===null?"":` -> ${_r(t.target)}`;if(e==="to-me")return` from ${_r(t.from_identity)}`;let n=t.target===null?"":` -> ${_r(t.target)}`;return` from ${_r(t.from_identity)}${n}`}function dp(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function kx(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function Cx(t){let e=t.replace(/\s+/g," ").trim();return e.length<=wx?e:`${e.slice(0,wx-3)}...`}function pV(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=Tx?e:`${e.slice(0,Tx-3)}...`}function _r(t){if(t==="operator")return t;try{let e=De(t);return`${FK(e.teamfile)}:${e.alias}`}catch{return t}}function _V(t){if(t===void 0)return{iso:new Date(Date.now()-HK).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],i=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var BK,Pl,Ex,HK,wx,Tx,Mx=w(()=>{"use strict";gt();Ce();hl();qe();_i();Gt();pc();At();BK=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
3455
3455
|
|
|
3456
3456
|
Show this member's team, busy/idle roster, and recent tracked activity. From a
|
|
3457
3457
|
plain operator shell, show a DB-wide team/activity summary.
|
|
@@ -3459,7 +3459,7 @@ plain operator shell, show a DB-wide team/activity summary.
|
|
|
3459
3459
|
Text output shows recent activity from the last 24h by default. Use --since 7d
|
|
3460
3460
|
or an ISO timestamp to widen the investigation window. --json returns complete,
|
|
3461
3461
|
uncapped data.
|
|
3462
|
-
`,Pl=5,Ex=5,HK=24*60*60*1e3,wx=72,Tx=80});var jx={};me(jx,{backfillEventLog:()=>vV,rebuildProjections:()=>Dx});import{createHash as hV}from"node:crypto";function
|
|
3462
|
+
`,Pl=5,Ex=5,HK=24*60*60*1e3,wx=72,Tx=80});var jx={};me(jx,{backfillEventLog:()=>vV,rebuildProjections:()=>Dx});import{createHash as hV}from"node:crypto";function hr(t,e){return t==null?null:{teamfile:t,alias:e??""}}function gV(t,e,n){return`lease_${hV("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function Ul(t,e,n,r){n.forEach((s,i)=>{Ie(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function yV(t){let e=`msg_tcl_${t.id}`,n=hr(t.sender_teamfile,t.sender_alias),r=hr(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:n,receiver:r,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 EV(t){let e=`msg_mbx_${t.id}`,n=hr(t.sender_teamfile,t.sender_alias),r=hr(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:n,receiver:r,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 wV(t){let e=`inv_${t.id}`,n=hr(t.target_teamfile,t.target_alias),r={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:n,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:r}}];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:r}}),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:r}}),{streamId:e,events:s}}function TV(t){let e=gV(t.receiver_teamfile,t.receiver_alias,t.started_at),n=hr(t.receiver_teamfile,t.receiver_alias),r=hr(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:oe.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:n,sender:r,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 vV(t){let e={appended:0,skipped:0},n={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}=yV(i);Ul(t,a,l,e),n.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}=EV(i);Ul(t,a,l,e),n.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}=wV(i);Ul(t,a,l,e),n.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}=TV(i);Ul(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}Dx(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function Dx(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 n of e){let r=JSON.parse(n.payload);SV(t,n.seq,n.stream_id,n.event_type,r)}}function Re(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function SV(t,e,n,r,s){switch(r){case oe.ENQUEUE:case oe.RESPONSE_ENQUEUE:{let i=r===oe.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
|
|
3463
3463
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
3464
3464
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
3465
3465
|
VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
|
|
@@ -3484,7 +3484,7 @@ uncapped data.
|
|
|
3484
3484
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
|
|
3485
3485
|
ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",Re(s,"target","teamfile"),Re(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",e);break;case oe.INVOCATION_FINISH:t.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
|
|
3486
3486
|
WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case oe.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var oe,Px=w(()=>{"use strict";Wi();oe={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});qe();gs();ce();import{pathToFileURL as bV}from"node:url";import{mkdirSync as IA,readFileSync as NA,renameSync as xA,writeFileSync as AA}from"node:fs";import{homedir as RA}from"node:os";import{dirname as LA,join as OA}from"node:path";function Op(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function bA(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function kA(t,e){return!bA(t)||Op(t)?null:`${e} must use https://: ${t}`}async function Cp(t,e){let n=kA(t,e.description);if(n!==null||!Op(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Lp(t,e.description,r,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw Lp(t,e.description,r,a)}}finally{clearTimeout(i)}}function Lp(t,e,n,r){let i=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${i}`)}gs();var CA="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",$A=60*60*1e3,MA=1500;function DA(){let t=process.env.HOME??RA();return OA(t,".lmctl",".update-check.json")}function jA(t){return t.isTTY===!0}function PA(t,e){let n=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let i=0;i<3;i+=1){if(r[i]>s[i])return 1;if(r[i]<s[i])return-1}return 0}function Gl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!jA(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function FA(t,e){try{let n=JSON.parse(NA(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<$A)return n.latest}catch{}return null}function UA(t,e){IA(LA(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;AA(n,`${JSON.stringify(e)}
|
|
3487
|
-
`,"utf8"),xA(n,t)}async function WA(){let t=await Cp(CA,{description:"lmctl npm metadata",timeoutMs:MA}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function $p(t,e=[],n={}){try{if(Gl(e,t))return;let r=n.now?.()??Date.now(),s=n.cachePath??DA();if(FA(s,r)!==null)return;let o=await(n.fetchLatest??WA)();try{UA(s,{checkedAt:r,latest:o})}catch{return}let a=n.currentVersion?.()??
|
|
3487
|
+
`,"utf8"),xA(n,t)}async function WA(){let t=await Cp(CA,{description:"lmctl npm metadata",timeoutMs:MA}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function $p(t,e=[],n={}){try{if(Gl(e,t))return;let r=n.now?.()??Date.now(),s=n.cachePath??DA();if(FA(s,r)!==null)return;let o=await(n.fetchLatest??WA)();try{UA(s,{checkedAt:r,latest:o})}catch{return}let a=n.currentVersion?.()??Ct();PA(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
|
|
3488
3488
|
`)}catch{}}var fs=`usage: lmctl [--db PATH] [--debug] <command> [args]
|
|
3489
3489
|
`,up=`${fs}
|
|
3490
3490
|
Setup & status:
|
|
@@ -3537,8 +3537,8 @@ ${fs}Run 'lmctl help' for usage.
|
|
|
3537
3537
|
${fs}Run 'lmctl help' for usage.
|
|
3538
3538
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
3539
3539
|
${fs}Run 'lmctl help' for usage.
|
|
3540
|
-
`),1)}async function IV(t,e={stdout:process.stdout,stderr:process.stderr}){let n=xp();try{return await NV(t,e)}finally{Ap(n)}}async function NV(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let c=t[++a];if(c===void 0||c.startsWith("--"))return kV(e,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--debug"){Np();continue}n.push(l)}let r=n[0];if(r==="--version"||r==="-v"||r==="-V")return e.stdout.write(`lmctl ${
|
|
3541
|
-
`),0;if(r==="--help"||r==="-h"||r===void 0)return e.stdout.write(up),0;if(r==="help"){let[a,...l]=n.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(up),0):Fx.has(a)?Ux(a,[...l,"--help"],e):Wx(e,a)}ql(z(),e.stderr);let[s,...i]=n;if(s===void 0)return e.stdout.write(up),0;let o=Date.now();fp(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await Ux(s,i,e);return fp(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),Fx.has(s)&&!Gl(n,e)&&await $p(e,n),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return fp(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:AV(l)}),xV(a,s,i,e)}}function fp(t,e,n){je({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:z(),lmctl_version:
|
|
3540
|
+
`),1)}async function IV(t,e={stdout:process.stdout,stderr:process.stderr}){let n=xp();try{return await NV(t,e)}finally{Ap(n)}}async function NV(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let c=t[++a];if(c===void 0||c.startsWith("--"))return kV(e,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--debug"){Np();continue}n.push(l)}let r=n[0];if(r==="--version"||r==="-v"||r==="-V")return e.stdout.write(`lmctl ${Ct()}
|
|
3541
|
+
`),0;if(r==="--help"||r==="-h"||r===void 0)return e.stdout.write(up),0;if(r==="help"){let[a,...l]=n.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(up),0):Fx.has(a)?Ux(a,[...l,"--help"],e):Wx(e,a)}ql(z(),e.stderr);let[s,...i]=n;if(s===void 0)return e.stdout.write(up),0;let o=Date.now();fp(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await Ux(s,i,e);return fp(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),Fx.has(s)&&!Gl(n,e)&&await $p(e,n),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return fp(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:AV(l)}),xV(a,s,i,e)}}function fp(t,e,n){je({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:z(),lmctl_version:Ct(),node_version:process.version,...n})}function xV(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return r.stderr.write(`error: ${s.message}
|
|
3542
3542
|
`),Rp()?(r.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
3543
3543
|
`),1):(r.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
3544
3544
|
`),1)}function AV(t){let e=[],n=t.cause,r=0;for(;n!=null&&r<8;){let s=n instanceof Error?n:new Error(String(n));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),n=s.cause,r+=1}return e}async function Ux(t,e,n){switch(t){case"api":{let{runApi:r}=await Promise.resolve().then(()=>(Xd(),fy));return r(e,n)}case"serve":{let{runServe:r}=await Promise.resolve().then(()=>(FS(),PS));return r(e,n)}case"chat":{let{runChat:r}=await Promise.resolve().then(()=>(Bb(),qb));return r(e,n)}case"restore":{let{runRestore:r}=await Promise.resolve().then(()=>(vk(),Tk));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(Ak(),xk));return r(e,n)}case"device":{let{runDevice:r}=await Promise.resolve().then(()=>(Lk(),Rk));return r(e,n)}case"mail":{let{runMail:r}=await Promise.resolve().then(()=>(Gk(),Jk));return r(e,n)}case"team":{let{runTeam:r}=await Promise.resolve().then(()=>(pI(),mI));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(SI(),vI));return r(e,n)}case"session":{let{runSession:r}=await Promise.resolve().then(()=>(El(),Yb));return r(e,n)}case"session-index":{let{runSessionIndex:r}=await Promise.resolve().then(()=>(BI(),qI));return r(e,n)}case"health":{let{runInfo:r}=await Promise.resolve().then(()=>(tN(),eN));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(sN(),rN));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>(Ri(),Ai));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>(Ri(),Ai));return r(e,n)}case"hire":{let{runHire:r}=await Promise.resolve().then(()=>(Ri(),Ai));return r(e,n)}case"refresh":{let{runRefresh:r}=await Promise.resolve().then(()=>(Ri(),Ai));return r(e,n)}case"clone":{let{runClone:r}=await Promise.resolve().then(()=>(xN(),NN));return r(e,n)}case"restore-teamfile":{let{runRestoreTeamfile:r}=await Promise.resolve().then(()=>(PN(),jN));return r(e,n)}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(qN(),WN));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(zN(),YN));return r(e,n)}case"diagnose":{let{runDiagnose:r}=await Promise.resolve().then(()=>(ux(),dx));return r(e,n)}case"diagnose-prompt":{let{runDiagnosePrompt:r}=await Promise.resolve().then(()=>(yx(),gx));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(Mx(),$x));return r(e,n)}case"db":return RV(e,n);default:return Wx(n,t)}}async function RV(t,e){let[n,...r]=t;return n==="--help"||n==="-h"||n==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
|