@lmctl-ai/lmctl 0.1.189 → 0.1.190
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 +149 -149
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{for(var r in e)VI(t,r,{get:e[r],enumerable:!0})};var qf={};pe(qf,{WORKSPACE_NAMES:()=>
|
|
2
|
-
`)}function Si(){return
|
|
3
|
-
`)}var ZI,Pf,QI,eN,Ff,tN,rN,
|
|
1
|
+
var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{for(var r in e)VI(t,r,{get:e[r],enumerable:!0})};var qf={};pe(qf,{WORKSPACE_NAMES:()=>pr,activeWorkspaceFilePath:()=>ds,describeStateLocation:()=>ms,isSlowWslMount:()=>Uf,isValidWorkspaceName:()=>Ve,legacyActiveProfileFilePath:()=>xl,legacyDefaultDbPath:()=>pn,legacyProfilesPresent:()=>Wf,legacyProfilesRoot:()=>Si,listExistingWorkspaceDbCandidates:()=>nN,lmctlNextHome:()=>mr,readActiveWorkspace:()=>us,resolveDbPath:()=>ee,resolveWorkspaceName:()=>Nt,warnIfLegacyProfiles:()=>Rl,warnIfSlowDbPath:()=>Al,workspaceDbPath:()=>Ht,workspaceDefaultDocroot:()=>bi,workspaceDir:()=>It,workspacesRoot:()=>fr});import{existsSync as fn,readdirSync as KI,readFileSync as YI}from"node:fs";import{homedir as zI,platform as jf}from"node:os";import{join as Xt}from"node:path";function mr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Xt(zI(),ZI)}function pn(){return Xt(mr(),Pf)}function fr(){return Xt(mr(),QI)}function It(t){return Xt(fr(),t)}function Ht(t){return Xt(It(t),Pf)}function nN(){let t=[],e=new Set,r=i=>{fn(i.db_path)&&(e.has(i.db_path)||(e.add(i.db_path),t.push(i)))};r({workspace_name:null,db_path:pn(),kind:"legacy"});let n=fr();if(!fn(n))return t;let s;try{s=KI(n)}catch{return t}for(let i of s.sort())Ve(i)&&r({workspace_name:i,db_path:Ht(i),kind:"workspace"});return t}function bi(t){return Xt(It(t),"projects")}function ds(){return Xt(mr(),eN)}function Ve(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function us(){let t=ds();if(!fn(t))return null;try{let e=YI(t,"utf8").trim();return e.length===0||!Ve(e)?null:e}catch{return null}}function Nt(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ve(t)?t:us()}function ee(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Nt();if(e!==null)return Ht(e);let r=pn();return fn(r)||!fn(fr())?r:Ht(Ff)}function ms(t,e){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":t??"default"} db: ${e}`}function Uf(t,e=jf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Al(t,e=process.stderr,r=jf()){Uf(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
|
+
`)}function Si(){return Xt(mr(),tN)}function xl(){return Xt(mr(),rN)}function Wf(){try{return fn(Si())}catch{return!1}}function Rl(t=process.stderr){Wf()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
|
|
3
|
+
`)}var ZI,Pf,QI,eN,Ff,tN,rN,pr,Fe=E(()=>{"use strict";ZI=".lmctl",Pf="state.db",QI="workspaces",eN="active-workspace",Ff="default",tN="profiles",rN="active-profile";pr={default:Ff}});function aN(t){for(let e of oN)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 lN(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function uN(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function fs(t){let e=t;for(let{re:r,replacement:n}of iN)e=e.replace(r,n);return e=e.replace(cN,r=>!uN(r)||aN(r)?r:Bf),e=e.replace(dN,r=>lN(r)?r:Bf),e}function ps(t){return t.split(`
|
|
4
4
|
`).map(e=>fs(e)).join(`
|
|
5
|
-
`)}function Xf(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:ut}:{key:t,value:fs(e)}}function
|
|
5
|
+
`)}function Xf(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:ut}:{key:t,value:fs(e)}}function _r(t){if(typeof t=="string")return fs(t);if(Array.isArray(t))return t.map(e=>_r(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?ut:_r(n):e[r]=_r(n)}return e}return t}function Jf(t,e){for(let{name:r,re:n}of mN){let s=e.match(n);if(s!==null&&!s[0].includes(ut))throw new Ur(t,r)}}var ut,sN,Bf,Hf,iN,oN,cN,dN,mN,Ur,ki=E(()=>{"use strict";ut="[REDACTED]",sN="[REDACTED_EMAIL]",Bf="[REDACTED_IP]",Hf="[USER]",iN=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${ut}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${ut}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${ut}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:ut},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:ut},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:ut},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:ut},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${ut}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Hf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Hf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:sN}],oN=["127.","10.","192.168.","0.0.0.0"];cN=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,dN=/\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;mN=[{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"'`]+/}],Ur=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Ll}from"node:child_process";import{readFileSync as fN}from"node:fs";import{readFile as $l,stat as Gf}from"node:fs/promises";import{homedir as pN}from"node:os";import{join as _N}from"node:path";import{fileURLToPath as hN}from"node:url";function At(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(fN(hN(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Vf(t){let e=new Set(t.include??Ii),r={};return e.has("serve")&&(r.serve=await yN(t)),e.has("db")&&(r.db=EN(t)),e.has("runs")&&(r.runs=wN(t)),e.has("jobs")&&(r.jobs=TN(t)),e.has("attentions")&&(r.attentions=vN(t)),e.has("env")&&(r.env=await bN(t)),e.has("intents")&&(r.intents=await kN(t)),r}async function yN(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let d=(await $l(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(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await $l(r,"utf8")).split(`
|
|
6
6
|
`),m=u.slice(Math.max(0,u.length-n));c=m.length,a=ps(m.join(`
|
|
7
7
|
`))}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 EN(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
|
|
8
8
|
`)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function wN(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=e.query(`SELECT ${Ol} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${Ol} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Ol} FROM run
|
|
9
9
|
WHERE terminal_state IS NULL
|
|
10
10
|
AND started_at < ?
|
|
11
|
-
ORDER BY started_at ASC LIMIT 50`,s);return{last_50:
|
|
12
|
-
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:
|
|
11
|
+
ORDER BY started_at ASC LIMIT 50`,s);return{last_50:_r(i),stale:_r(a),paused:_r(o)}}function TN(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:o,c:a}of r)o==="queued"?n.pending+=a:o==="running"?n.running+=a:o==="done"||o==="succeeded"?n.done+=a:o==="failed"?n.failed+=a:o==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),i=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(o=>o.id),running_ids:i.map(o=>o.id)}}function vN(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
|
|
12
|
+
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:_r(r)}}async function bN(t){let e=At(),r=process.version,n=Ll("uname",["-a"],{encoding:"utf8"}),s=ps((n.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Gf(o);let d=Ll("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 Gf(a);let d=Ll("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":ps(i.join(`
|
|
13
13
|
`)),c=[];for(let d of gN){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Xf(d,u))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function SN(){return process.env.LMCTL_INTENT_LOG??_N(pN(),".lmctl","recent-intents.log")}async function kN(t){let e=t.intentLog??SN(),r=t.intentLogTailLines??500;try{let s=(await $l(e,"utf8")).split(`
|
|
14
14
|
`).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:i.length,tail:ps(i.join(`
|
|
15
15
|
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Ii,gN,Ol,_s=E(()=>{"use strict";ki();Ii=["serve","db","runs","jobs","attentions","env","intents"];gN=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Ol=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as zf,appendFileSync as IN,mkdirSync as NN,existsSync as MJ,readdirSync as DJ,unlinkSync as jJ}from"node:fs";import{join as Ai,dirname as AN}from"node:path";import{homedir as xN}from"node:os";function Cl(){return Ai(xN(),".lmctl")}function Zf(){_n=!0,process.env.LMCTL_DEBUG="1"}function Qf(){return{cliDebug:_n,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function ep(t){_n=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(_n||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Yf>=RN&&(Kf=$N(),Yf=t),Kf}function tp(){return _n||process.env.LMCTL_DEBUG==="1"}function LN(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Ce(t,e){if(e?.verbose){if(!_n)return}else if(!e?.always&&!ue())return;try{ON();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};IN(Ni,JSON.stringify(r)+`
|
|
@@ -572,18 +572,18 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
572
572
|
`),t.exec(`
|
|
573
573
|
CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
|
|
574
574
|
ON team_chat_log(root_teamfile, created_at);
|
|
575
|
-
`),t.pragma("user_version = 46"),r=46),r>=46&&hs(t,"team_chat_log")&&!ie(t,"team_chat_log").has("origin")&&lp(t),r<47&&r!==0){
|
|
575
|
+
`),t.pragma("user_version = 46"),r=46),r>=46&&hs(t,"team_chat_log")&&!ie(t,"team_chat_log").has("origin")&&lp(t),r<47&&r!==0){Wr(t,"agent_mailbox"),Wr(t,"tracked_invocation");let n=ie(t,"agent_mailbox");n.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=ie(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"),r=47}if(r<48&&r!==0){Wr(t,"agent_mailbox");let n=ie(t,"agent_mailbox");n.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
|
|
576
576
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
|
|
577
577
|
ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
|
|
578
578
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
|
|
579
579
|
ON agent_mailbox(sender_teamfile, sender_alias, receiver_teamfile, receiver_alias, delivered_at, delivering_at, id);
|
|
580
|
-
`),t.pragma("user_version = 48"),r=48}if(r<49&&r!==0&&(
|
|
580
|
+
`),t.pragma("user_version = 48"),r=48}if(r<49&&r!==0&&(Wr(t,"tracked_invocation"),t.exec(`
|
|
581
581
|
UPDATE tracked_invocation
|
|
582
582
|
SET notified_by = 'migration-baseline',
|
|
583
583
|
notified_at = COALESCE(ended_at, started_at)
|
|
584
584
|
WHERE status IN ('done', 'error', 'busy', 'cancelled')
|
|
585
585
|
AND notified_by IS NULL;
|
|
586
|
-
`),t.pragma("user_version = 49"),r=49),r<50&&r!==0&&(
|
|
586
|
+
`),t.pragma("user_version = 49"),r=49),r<50&&r!==0&&(Wr(t,"tracked_invocation"),ie(t,"tracked_invocation").has("launch_source")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN launch_source TEXT;"),t.pragma("user_version = 50"),r=50),r<51&&r!==0){Wr(t,"agent_mailbox");let n=ie(t,"agent_mailbox");n.has("message_type")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN message_type TEXT NOT NULL DEFAULT 'request' CHECK(message_type IN ('request','response'));"),n.has("reply_mode")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN reply_mode TEXT NOT NULL DEFAULT 'pull' CHECK(reply_mode IN ('push','pull'));"),n.has("request_mailbox_id")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN request_mailbox_id INTEGER;"),t.exec(`
|
|
587
587
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_mailbox_response_request_unique
|
|
588
588
|
ON agent_mailbox(request_mailbox_id)
|
|
589
589
|
WHERE message_type = 'response' AND request_mailbox_id IS NOT NULL;
|
|
@@ -599,7 +599,7 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
599
599
|
BEGIN
|
|
600
600
|
SELECT RAISE(ABORT, 'agent_mailbox response requires request_mailbox_id');
|
|
601
601
|
END;
|
|
602
|
-
`),t.pragma("user_version = 51"),r=51}r<52&&r!==0&&(
|
|
602
|
+
`),t.pragma("user_version = 51"),r=51}r<52&&r!==0&&(Wr(t,"tracked_invocation"),ie(t,"tracked_invocation").has("request_payload")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN request_payload TEXT;"),t.pragma("user_version = 52"),r=52),r<53&&r!==0&&(t.exec(`
|
|
603
603
|
CREATE TABLE IF NOT EXISTS message_event (
|
|
604
604
|
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
605
605
|
event_id TEXT NOT NULL UNIQUE,
|
|
@@ -681,7 +681,7 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
681
681
|
ON invocation_state(target_teamfile, target_alias, status, launch_source);
|
|
682
682
|
CREATE INDEX IF NOT EXISTS idx_invocation_state_from_time
|
|
683
683
|
ON invocation_state(from_identity, started_at DESC);
|
|
684
|
-
`),t.pragma("user_version = 53"),r=53),sA(dA)}function ie(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function hs(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function
|
|
684
|
+
`),t.pragma("user_version = 53"),r=53),sA(dA)}function ie(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function hs(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Wr(t,e){if(!hs(t,e)&&(t.exec(cp(fp,"utf8")),!hs(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function lp(t){let e=ie(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
|
|
685
685
|
DROP TABLE IF EXISTS team_chat_log_v46;
|
|
686
686
|
CREATE TABLE team_chat_log_v46 (
|
|
687
687
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -904,7 +904,7 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
904
904
|
SET request_payload = ?
|
|
905
905
|
WHERE id = ?
|
|
906
906
|
AND status = 'running'
|
|
907
|
-
`)}}function
|
|
907
|
+
`)}}function Jt(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(Ep,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${Ep}`}var Ep,Tp=E(()=>{"use strict";Ep=`
|
|
908
908
|
...[truncated]`});function bp(t){return{insertMailboxMessage:t.prepare(`
|
|
909
909
|
INSERT INTO agent_mailbox (
|
|
910
910
|
receiver_teamfile, receiver_alias, sender_teamfile, sender_alias,
|
|
@@ -1038,14 +1038,14 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1038
1038
|
`),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function gs(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(vp,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${vp}`}var vp,ql=E(()=>{"use strict";vp=`
|
|
1039
1039
|
...[truncated]`});function ws(t,e){return JSON.stringify([t,e])}function Sp(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var ys,Es,kp=E(()=>{"use strict";ys="terminal_lock",Es="member"});import{readFileSync as Ip}from"node:fs";function mt(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 Bl(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=fA();if(e===null)return null;try{let r=Ip(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(")");if(n<0)return null;let i=r.slice(n+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function fA(){try{let t=Ip("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function pA(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function Np(t,e){if(!mt(t))return"gone";if(!pA(e))return"unverified";let r=Bl(t);return r===null?"unverified":r===e?"same":"different"}var Ts=E(()=>{"use strict"});import{createHash as _A}from"node:crypto";function hA(t,e,r){return _A("sha256").update(`${t}\0${e}\0${r}`).digest("hex")}function Se(t,e,r){let n=hA(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)
|
|
1040
1040
|
VALUES (?, ?, ?, ?, ?)
|
|
1041
|
-
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(n,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(n).seq,event_id:n};let l=Number(a.lastInsertRowid);return r(l),{appended:!0,seq:l,event_id:n}})()}var Ri=E(()=>{"use strict"});import{randomUUID as xp}from"node:crypto";import{hostname as gA}from"node:os";function
|
|
1041
|
+
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(n,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(n).seq,event_id:n};let l=Number(a.lastInsertRowid);return r(l),{appended:!0,seq:l,event_id:n}})()}var Ri=E(()=>{"use strict"});import{randomUUID as xp}from"node:crypto";import{hostname as gA}from"node:os";function Gt(t,e){return{teamfile:t,alias:e}}function Hl(t,e,r={}){return{teamfile:t,alias:e,...r.provider===void 0||r.provider===null?{}:{provider:r.provider},...r.sessionId===void 0||r.sessionId===null?{}:{session_id:r.sessionId}}}function Rp(t,e){return t===null?null:Gt(t,e??"")}function Rt(t){return`msg_mbx_${t}`}function yn(t){return`inv_${t}`}function gn(t,e,r){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, terminal_lock_id,
|
|
1042
1042
|
terminal_invocation_id, last_seq
|
|
1043
1043
|
FROM agent_state
|
|
1044
1044
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,r)??null}function hn(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
|
|
1045
|
-
FROM message_pending WHERE message_id = ?`).get(e)??null}function
|
|
1045
|
+
FROM message_pending WHERE message_id = ?`).get(e)??null}function Vt(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Xl(t,e={},r={}){return{message_id:Rt(t.id),message_type:t.message_type,sender:t.sender_teamfile===null?null:Hl(t.sender_teamfile,t.sender_alias??"",r),receiver:Hl(t.receiver_teamfile,t.receiver_alias,e),root_teamfile:t.root_teamfile,legacy:{table:"agent_mailbox",id:t.id}}}function Jl(t,e,r={},n={},s=[]){let i=Rt(e.id),o=e.message_type==="response",a=o&&e.request_mailbox_id!==null?yA(t,e.request_mailbox_id):{},l={provider:a.provider??r.provider,sessionId:a.sessionId??r.sessionId},c=e.request_mailbox_id===null?null:Rt(e.request_mailbox_id),d=Xl(e,l,n);Se(t,{stream_id:i,event_type:o?"RESPONSE_CREATE":"CREATE",observedLastSeq:0,ts:e.created_at,payload:{...d,content:e.payload,...o?{in_reply_to_message_id:c,...s.length>0?{batched_request_message_ids:s}:{}}:{}}},()=>{}),Se(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
|
|
1046
1046
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
1047
1047
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
1048
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)`).run(
|
|
1048
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)`).run(i,e.message_type,o?c:null,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,u,u)})}function yA(t,e){let r=t.prepare(`
|
|
1049
1049
|
SELECT
|
|
1050
1050
|
json_extract(payload, '$.sender.provider') AS provider,
|
|
1051
1051
|
json_extract(payload, '$.sender.session_id') AS session_id
|
|
@@ -1053,23 +1053,23 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1053
1053
|
WHERE stream_id = ? AND event_type = 'CREATE'
|
|
1054
1054
|
ORDER BY seq ASC
|
|
1055
1055
|
LIMIT 1
|
|
1056
|
-
`).get(
|
|
1056
|
+
`).get(Rt(e));return{provider:typeof r?.provider=="string"?r.provider:null,sessionId:typeof r?.session_id=="string"?r.session_id:null}}function Lp(t,e,r){let n=`msg_tcl_${e}`,s=Rp(r.sender_teamfile,r.sender_alias),i=Hl(r.receiver_teamfile,r.receiver_alias,{provider:r.receiver_provider,sessionId:r.receiver_session_id}),o={message_id:n,message_type:"request",sender:s,receiver:i,root_teamfile:r.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Se(t,{stream_id:n,event_type:"CREATE",observedLastSeq:0,ts:r.created_at,payload:{...o,content:r.message,provider_prompt:r.provider_prompt??r.message,origin:r.origin}},()=>{}),Se(t,{stream_id:n,event_type:"HANDLED",observedLastSeq:1,ts:r.created_at,payload:{...o,outcome:r.status,receipt:r.response,error:r.error_detail,truncated:r.truncated===1}},()=>{}),n}function Op(t,e,r,n,s){let i=Rt(e.id),o=hn(t,i);if(o===null||o.lifecycle_state!=="queued")throw new Error(`message_pending ${i} is not queued during delivery claim`);let a=`delivery_${xp()}`;Se(t,{stream_id:i,event_type:"DELIVER_CLAIM",observedLastSeq:o.last_seq,ts:r,payload:{...Xl(e),lease_id:a,pid:n,host:s}},l=>{let c=t.prepare(`UPDATE message_pending
|
|
1057
1057
|
SET lifecycle_state = 'claimed',
|
|
1058
1058
|
delivery_lease_id = ?,
|
|
1059
1059
|
delivery_holder_pid = ?,
|
|
1060
1060
|
last_seq = ?
|
|
1061
|
-
WHERE message_id = ? AND lifecycle_state = 'queued' AND last_seq = ?`).run(a,n,l,i,o.last_seq);
|
|
1061
|
+
WHERE message_id = ? AND lifecycle_state = 'queued' AND last_seq = ?`).run(a,n,l,i,o.last_seq);Vt(c.changes,"DELIVER_CLAIM")})}function Gl(t,e,r,n=new Date().toISOString()){let s=Rt(e.id),i=hn(t,s);if(i===null||i.lifecycle_state!=="claimed")throw new Error(`message_pending ${s} is not claimed during delivery release`);let o={message_id:s,message_type:e.message_type,sender:Rp(e.sender_teamfile,e.sender_alias),receiver:Gt(e.receiver_teamfile,e.receiver_alias),root_teamfile:e.root_teamfile,legacy:{table:"agent_mailbox",id:e.id}};Se(t,{stream_id:s,event_type:"DELIVER_CLAIM_RELEASE",observedLastSeq:i.last_seq,ts:n,payload:{...o,reason:r,delivery_lease_id:i.delivery_lease_id,previous_holder:{pid:e.delivery_holder_pid,host:e.delivery_holder_host}}},a=>{let l=t.prepare(`UPDATE message_pending
|
|
1062
1062
|
SET lifecycle_state = 'queued',
|
|
1063
1063
|
delivery_lease_id = NULL,
|
|
1064
1064
|
delivery_holder_pid = NULL,
|
|
1065
1065
|
last_seq = ?
|
|
1066
1066
|
WHERE message_id = ? AND lifecycle_state = 'claimed'
|
|
1067
|
-
AND delivery_lease_id IS ? AND last_seq = ?`).run(a,s,i.delivery_lease_id,i.last_seq);
|
|
1067
|
+
AND delivery_lease_id IS ? AND last_seq = ?`).run(a,s,i.delivery_lease_id,i.last_seq);Vt(l.changes,"DELIVER_CLAIM_RELEASE")})}function vs(t,e,r,n,s=null){let i=Rt(e.id),o=hn(t,i);if(o===null)throw new Error(`message_pending ${i} is missing during delivery`);Se(t,{stream_id:i,event_type:e.message_type==="response"?"RESPONSE_DELIVERED":"DELIVERED",observedLastSeq:o.last_seq,ts:n,payload:{...Xl(e),receipt:r,...s===null?{}:{batch_response_message_id:s}}},()=>{let a=t.prepare("DELETE FROM message_pending WHERE message_id = ? AND last_seq = ?").run(i,o.last_seq);Vt(a.changes,"DELIVERED")})}function $p(t){return{sender:Gt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function Cp(t,e,r,n){let s=t.prepare(`UPDATE agent_state
|
|
1068
1068
|
SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
|
|
1069
1069
|
holder_pid = NULL, holder_host = NULL, started_at = NULL,
|
|
1070
1070
|
last_heartbeat_at = NULL, last_seq = ?
|
|
1071
1071
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1072
|
-
AND lease_id IS ? AND last_seq = ?`).run(r,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);
|
|
1072
|
+
AND lease_id IS ? AND last_seq = ?`).run(r,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);Vt(s.changes,n)}function Mp(t,e,r,n){let s=gA(),i=gn(t,e.receiver_teamfile,e.receiver_alias);if(r!==null){if(n===null)throw new Error("agent inflight takeover is missing a reclaim reason");if(i===null||i.lease_id===null)throw new Error("agent_state lease is missing during inflight reclaim");let l=i.lease_id;Se(t,{stream_id:l,event_type:"INFLIGHT_RECLAIM",observedLastSeq:i.last_seq,ts:e.started_at,payload:{receiver:Gt(e.receiver_teamfile,e.receiver_alias),reason:n,previous_holder:$p(r)}},c=>Cp(t,i,c,"INFLIGHT_RECLAIM")),i=gn(t,e.receiver_teamfile,e.receiver_alias)}let o=i?.last_seq??0,a=`lease_${xp()}`;Se(t,{stream_id:a,event_type:"INFLIGHT_TAKE",observedLastSeq:o,ts:e.started_at,payload:{lease_id:a,receiver:Gt(e.receiver_teamfile,e.receiver_alias),sender:Gt(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:s,started_at:e.started_at}},l=>{if(i===null){t.prepare(`INSERT INTO agent_state
|
|
1073
1073
|
(receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
|
|
1074
1074
|
sender_alias, holder_pid, holder_host, started_at, last_seq)
|
|
1075
1075
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.receiver_teamfile,e.receiver_alias,a,e.sender_teamfile,e.sender_alias,e.holder_pid,s,e.started_at,l);return}let c=t.prepare(`UPDATE agent_state
|
|
@@ -1077,13 +1077,13 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1077
1077
|
holder_pid = ?, holder_host = ?, started_at = ?,
|
|
1078
1078
|
last_heartbeat_at = NULL, last_seq = ?
|
|
1079
1079
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1080
|
-
AND lease_id IS NULL AND last_seq = ?`).run(a,e.sender_teamfile,e.sender_alias,e.holder_pid,s,e.started_at,l,e.receiver_teamfile,e.receiver_alias,i.last_seq);
|
|
1080
|
+
AND lease_id IS NULL AND last_seq = ?`).run(a,e.sender_teamfile,e.sender_alias,e.holder_pid,s,e.started_at,l,e.receiver_teamfile,e.receiver_alias,i.last_seq);Vt(c.changes,"INFLIGHT_TAKE")})}function bs(t,e,r,n){let s=gn(t,e.receiver_teamfile,e.receiver_alias);if(s===null||s.lease_id===null)throw new Error("agent_state lease is missing during inflight release");Se(t,{stream_id:s.lease_id,event_type:r,observedLastSeq:s.last_seq,payload:{receiver:Gt(e.receiver_teamfile,e.receiver_alias),...r==="INFLIGHT_RECLAIM"?{reason:n??"stale",previous_holder:$p(e)}:{lease_id:s.lease_id}}},i=>Cp(t,s,i,r))}function Dp(t,e){let r=gn(t,e.teamfile,e.alias),n=r?.last_seq??0;Se(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:n,ts:e.started_at,payload:{receiver:Gt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(r===null){t.prepare(`INSERT INTO agent_state
|
|
1081
1081
|
(receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
|
|
1082
1082
|
VALUES (?, ?, ?, ?)`).run(e.teamfile,e.alias,e.lock_id,s);return}let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = ?, last_seq = ?
|
|
1083
1083
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1084
|
-
AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,r.last_seq);
|
|
1084
|
+
AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,r.last_seq);Vt(i.changes,"TERMINAL_LOCK_TAKE")})}function Vl(t,e,r=!1){let n=gn(t,e.teamfile,e.alias);if(n===null||n.terminal_lock_id!==e.lock_id)throw new Error("agent_state terminal lock is missing during release");Se(t,{stream_id:e.lock_id,event_type:r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:n.last_seq,payload:{receiver:Gt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
|
|
1085
1085
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1086
|
-
AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,n.last_seq);
|
|
1086
|
+
AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,n.last_seq);Vt(i.changes,r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function jp(t,e,r){let n=gn(t,r.targetTeamfile,r.targetAlias);if(n===null){t.prepare(`INSERT INTO agent_state
|
|
1087
1087
|
(receiver_teamfile, receiver_alias, terminal_invocation_id,
|
|
1088
1088
|
terminal_invocation_pid, terminal_invocation_host,
|
|
1089
1089
|
terminal_invocation_heartbeat_at, last_seq)
|
|
@@ -1092,7 +1092,7 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1092
1092
|
terminal_invocation_host = ?,
|
|
1093
1093
|
terminal_invocation_heartbeat_at = ?, last_seq = ?
|
|
1094
1094
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1095
|
-
AND terminal_invocation_id IS NULL AND last_seq = ?`).run(r.invocationId,r.holderPid,r.holderHost,r.heartbeatAt,e,r.targetTeamfile,r.targetAlias,n.last_seq);
|
|
1095
|
+
AND terminal_invocation_id IS NULL AND last_seq = ?`).run(r.invocationId,r.holderPid,r.holderHost,r.heartbeatAt,e,r.targetTeamfile,r.targetAlias,n.last_seq);Vt(s.changes,"terminal INVOCATION_START")}function Pp(t,e,r){return t.prepare(`UPDATE agent_state
|
|
1096
1096
|
SET terminal_invocation_heartbeat_at = ?
|
|
1097
1097
|
WHERE terminal_invocation_id = ?`).run(r,e).changes===1}function Fp(t,e,r){let n=t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, terminal_lock_id,
|
|
1098
1098
|
terminal_invocation_id, last_seq
|
|
@@ -1101,7 +1101,7 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1101
1101
|
terminal_invocation_host = NULL,
|
|
1102
1102
|
terminal_invocation_heartbeat_at = NULL, last_seq = ?
|
|
1103
1103
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1104
|
-
AND terminal_invocation_id = ? AND last_seq = ?`).run(e,n.receiver_teamfile,n.receiver_alias,r,n.last_seq);
|
|
1104
|
+
AND terminal_invocation_id = ? AND last_seq = ?`).run(e,n.receiver_teamfile,n.receiver_alias,r,n.last_seq);Vt(s.changes,"terminal INVOCATION_FINISH")}function Up(t,e){let r=t.prepare(`SELECT seq FROM message_event
|
|
1105
1105
|
WHERE stream_id = ? AND event_type = 'MESSAGE_ACKNOWLEDGED'
|
|
1106
1106
|
AND json_extract(payload, '$.acked_by') = ?
|
|
1107
1107
|
ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),n=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(Ap(t,e.messageId,e.ackedBy,e.ts),"removed"):hn(t,e.messageId)===null?"not-pending":"claimed";if(r!==void 0)return{appended:!1,seq:r.seq,pending_outcome:n?s():"record-only"};let i=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,o=hn(t,e.messageId),a=n?"not-pending":"record-only",l=Se(t,{stream_id:e.messageId,event_type:"MESSAGE_ACKNOWLEDGED",intentKey:`MESSAGE_ACKNOWLEDGED:${e.ackedBy}`,observedLastSeq:i,...e.ts!==void 0?{ts:e.ts}:{},payload:{acked_by:e.ackedBy,acked_at:e.ts??new Date().toISOString(),...e.note!==void 0?{note:e.note}:{},pid:e.holderPid??null,host:e.holderHost??null}},()=>{if(!n)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(a="removed",Ap(t,e.messageId,e.ackedBy,e.ts)):o!==null&&(a="claimed")});if(!l.appended){let c=hn(t,e.messageId);a=n?c===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}function Ap(t,e,r,n){let s=/^msg_mbx_(\d+)$/.exec(e);s!==null&&t.prepare(`UPDATE agent_mailbox
|
|
@@ -1113,7 +1113,7 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1113
1113
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(r,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Kl(e)&&jp(t,i,{invocationId:r,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Yl(t,e){let r=yn(e.id),n=Wp(t,r);return n===null?!1:(Se(t,{stream_id:r,event_type:wA,observedLastSeq:n.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:r,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
|
|
1114
1114
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1115
1115
|
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,r,n.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${r}`);Kl(e)&&Fp(t,s,r)}),!0)}function Bp(t,e,r,n){let s=yn(e.id),i=Wp(t,s);return i===null?!1:(Se(t,{stream_id:s,event_type:TA,observedLastSeq:i.last_seq,ts:n,payload:{invocation_id:s,notified_by:r,notified_at:n,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(r,n,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function Hp(t,e,r){let n=yn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(r,n),Kl(e)&&Pp(t,n,r)}function Xp(t,e,r){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(r,yn(e))}var EA,wA,TA,Jp=E(()=>{"use strict";Ri();Li();EA="INVOCATION_START",wA="INVOCATION_FINISH",TA="INVOCATION_NOTIFY_CLAIM"});function En(t){return typeof t=="string"&&vA.has(t)}function Kp(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: ${Oi[0]}`,` STANCE: ${Oi[1]}`,` STANCE: ${Oi[2]}`,` STANCE: ${Gp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
1116
|
-
`)}var Gp,Oi,vA,Ss,Vp,zl,$i,ks=E(()=>{"use strict";Gp="other",Oi=["not_enough_information","dont_know","other_work"],vA=new Set([Gp,...Oi]),Ss="@abort",Vp="invalid_decision",zl="escalation_aborted",$i="workflow_escalation"});import{randomUUID as Yp}from"node:crypto";import{hostname as Is}from"node:os";function Ke(t){return t.provider_resolved??t.provider}function C(){return new Date().toISOString()}function xe(t){return new Zl(xi({dbPath:t.path}))}function zp(t,e,r){let n=Zp(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Zp(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 Zp(t){let e=bA(t),r=e===null?null:SA(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Ci(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function bA(t){try{let e=JSON.parse(t);return Ci(e)?e:null}catch{return null}}function SA(t,e){let r=t[e];return Ci(r)?r:null}function Ci(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function kA(t){try{let e=JSON.parse(t);return!Ci(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 IA(t,e){return t===null?!0:t.holder_host===Is()?!mt(t.holder_pid):t.last_heartbeat<e}function NA(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===Is()&&AA(t.delivery_holder_pid)){let n=mt(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function
|
|
1116
|
+
`)}var Gp,Oi,vA,Ss,Vp,zl,$i,ks=E(()=>{"use strict";Gp="other",Oi=["not_enough_information","dont_know","other_work"],vA=new Set([Gp,...Oi]),Ss="@abort",Vp="invalid_decision",zl="escalation_aborted",$i="workflow_escalation"});import{randomUUID as Yp}from"node:crypto";import{hostname as Is}from"node:os";function Ke(t){return t.provider_resolved??t.provider}function C(){return new Date().toISOString()}function xe(t){return new Zl(xi({dbPath:t.path}))}function zp(t,e,r){let n=Zp(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Zp(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 Zp(t){let e=bA(t),r=e===null?null:SA(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Ci(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function bA(t){try{let e=JSON.parse(t);return Ci(e)?e:null}catch{return null}}function SA(t,e){let r=t[e];return Ci(r)?r:null}function Ci(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function kA(t){try{let e=JSON.parse(t);return!Ci(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 IA(t,e){return t===null?!0:t.holder_host===Is()?!mt(t.holder_pid):t.last_heartbeat<e}function NA(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===Is()&&AA(t.delivery_holder_pid)){let n=mt(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function hr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);M({event:t,event_at:n,message_id:e.id,message_type:e.message_type,lane_key:JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias]),sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message_created_at:e.created_at,delivering_at:e.delivering_at,delivered_at:e.delivered_at,delivery_holder_pid:e.delivery_holder_pid,delivery_holder_host:e.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...r})}function AA(t){return Number.isInteger(t)&&(t??0)>0}function xA(t){return{...bp(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1117
1117
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1118
1118
|
VALUES (?, ?, ?, ?, ?)
|
|
1119
1119
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1513,9 +1513,9 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1513
1513
|
error_detail = ?,
|
|
1514
1514
|
truncated = ?
|
|
1515
1515
|
WHERE id = ?
|
|
1516
|
-
`),...wp(t),...gp(t)}}function RA(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Zl,it=E(()=>{"use strict";Wl();yp();Tp();ql();kp();Ts();me();Li();Jp();ks();Zl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=xA(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let 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(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let 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:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let f=this.getJob(a.id);return f===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:f}}),this.resumeRunTxn=e.transaction((r,n,s)=>RA("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==$i)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(n!==Ss&&!a.includes(n))return{resumed:!1,reason:Vp};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]=n,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,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale");Mp(this.db,o,s,l)}return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)vs(this.db,i,"",C()),this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){zp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,C()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,C());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){zp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,C());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,C())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,C());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,C()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,C(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(C(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,C());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,C());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,C(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,C());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",C());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,C());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=C(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,C(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,C(),e)??null}closeIssue(e,r,n){let s=C(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,C(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,C(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=C();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Yp(),s=C();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let i=C(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,C())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??C(),e.dedupe_key??null,e.concurrency_key??null,C());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:C();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,C()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,C()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??C(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,C());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=C(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,C(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(C(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return Lp(this.db,n,e),n})()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??C(),n=e.holder_host??Is(),s=e.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Xt(e.command),r,e.holder_pid??null,n,s,Xt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return qp(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??C();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Xt(r.result_summary),Xt(r.error),r.team_chat_log_id??null,Xt(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Yl(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??C();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Xt(n.result_summary),Xt(n.error),n.team_chat_log_id??null,Xt(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Yl(this.db,o),o})()}heartbeatTrackedInvocation(e,r=C()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return Hp(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(Xp(this.db,e,r),this.getTrackedInvocation(e)))()}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=C()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Bp(this.db,i,r,n),i})()}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){return this.db.transaction(()=>{let n=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,gs(e.payload),e.created_at??C(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null),s=this.getMailboxMessage(Number(n.lastInsertRowid));return Jl(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=gs(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of s){let c=this.getMailboxMessage(l),d=this.stmts.markMailboxMessageDelivered.run(n,i,l);a+=d.changes,d.changes===1&&c!==null&&(vs(this.db,c,i,n),o.push(c))}this.db.exec("COMMIT");for(let l of o)_r("mailbox_delivery_delivered",l,{transition:l.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,l.id,l.delivering_at,l.delivery_holder_pid,l.delivery_holder_host).changes!==1){o.push(l);continue}vs(this.db,l,s,n),a+=1,i.push(l)}this.db.exec("COMMIT");for(let l of i)_r("mailbox_delivery_delivered",l,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let l of o)_r("mailbox_delivery_finalize_skipped",l,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}if(vs(this.db,c,s,n),a+=1,i.push(c),c.sender_teamfile===null||c.sender_alias===null)continue;let u=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l+=u.changes,u.changes===1){let m=this.getMailboxMessage(Number(u.lastInsertRowid));if(m===null)throw new Error("mailbox response disappeared during event append");Jl(this.db,m)}}this.db.exec("COMMIT");for(let c of i)_r("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let c of o)_r("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=Is()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(Op(this.db,d,r,n,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)_r("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(Gl(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)_r("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e,r="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(e.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&Gl(this.db,s,r),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=NA(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)_r(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&bs(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid});return o.changes===1&&i!==null&&bs(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let s=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return s.changes===1&&bs(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),s.changes===1}let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(bs(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(ys,ws(e,r),Es);return n===void 0?null:Sp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&Vl(this.db,n,!0),this.stmts.upsertRuntimeState.run(ys,ws(e.teamfile,e.alias),Es,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&Dp(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ys,ws(e,r),Es,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(ys,ws(e,r),Es);return i.changes===1&&Vl(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:kA(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=C()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!IA(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Yp(),holder_pid:process.pid,holder_host:Is(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,C(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,C())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,C());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,C(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??C(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,C());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,C()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,C()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,C());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(C(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=C();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??C());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,C())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,C())}}});import{realpathSync as LA}from"node:fs";import{resolve as OA}from"node:path";function Ql(t){let e=OA(t);try{return LA(e)}catch{return e}}var Qp=E(()=>{"use strict"});import{platform as e_}from"node:os";function Rt(t){let e=new Ns;for(let r of t)e.registerAdapter(r);return e}var Ns,ec=E(()=>{"use strict";Qp();Ns=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=Ql(e.workspace);i=i.filter(a=>Ql(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=e_()==="darwin"||e_()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as t_}from"node:fs";import{createInterface as r_}from"node:readline";import{stat as $A}from"node:fs/promises";import{homedir as CA}from"node:os";async function*Ye(t){let e=t_(t,{encoding:"utf-8"}),r=r_({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ue(t,e){let r=[],n=t_(t,{encoding:"utf-8"}),s=r_({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Le(t){let e=await $A(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function _e(t){return t.replace(/\\n/g,`
|
|
1517
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,hr=E(()=>{"use strict";ke=CA()});import{readdir as Mi,stat as n_,unlink as MA}from"node:fs/promises";import{join as wn,basename as s_}from"node:path";function DA(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function jA(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return _e(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 i_(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ye(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,m=d.cache_creation_input_tokens||0,f=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+m+f,n+=f,s+=m,i+=p;let h=u+m+f;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:m,cachedInputTokens:f,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var Di,o_=E(()=>{"use strict";hr();Di=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||wn(ke,".claude"),this.projectsDir=wn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Mi(this.projectsDir)}catch{return e}for(let n of r){let s=wn(this.projectsDir,n);if(!(await n_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Mi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=s_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=wn(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,r){let n=await Ue(e,50),s=await Le(e),i="",o,a,l,c,d,u;for(let f of n)if(!DA(f.type)&&(!i&&f.cwd&&(i=f.cwd),!o&&f.slug&&(o=f.slug),!a&&f.version&&(a=f.version),!u&&f.timestamp&&(u=new Date(f.timestamp)),f.type==="assistant"&&f.message?.model&&(l=f.message.model),f.type==="user"&&!f.isMeta&&f.message)){let p=f.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),d=G(p.trim(),80)}}if(!i)return null;let m=await i_(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Le(r),s=[],i="",o,a,l,c,d,u,m,f=e;for await(let h of Ye(r))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),!m&&h.timestamp&&(m=new Date(h.timestamp)),h.sessionId&&(f=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:jA(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=G(_.trim(),80)),u=G(_.trim(),80),s.push({role:"user",timestamp:g,content:_e(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?_e(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:_e(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await i_(r);return{provider:"claude",sessionId:f,slug:o,cwd:i,createdAt:m||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await MA(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Mi(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=wn(this.projectsDir,o);if(!(await n_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Mi(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=s_(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:wn(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Ue(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});function ji(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function FA(t,e,r){if(!r)return"";let n=t.tools[e]??tc[e],s=n?.profiles?.[r]?.flags??tc[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function a_(t,e){return!!t.tools[e]}function l_(t,e,r,n,s){let i=t.tools[e]??tc[e],o;if(i?.agent){let l=ji(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=PA[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ji).join(" ");o=`printf '%s\\n' ${ji(n)} | ${d}`}else o=c.map(ji).join(" ")}let a=FA(t,e,s);return a&&(o+=" "+a),o}var tc,PA,c_=E(()=>{"use strict";tc={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:""}}}},PA={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function d_(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var u_=E(()=>{"use strict"});var UA,we,Pi,Lt=E(()=>{"use strict";UA="ACK: waiting for explicit lmctl task.",we=`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: ${UA}`,Pi=`send this exact lmctl seed instruction: "${we}"`});function gr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function qA(t,e){return e===void 0||e.length===0?t:{...t??process.env,[As]:e}}function We(t,e,r,n="chat"){return{...qA(gr(t,e),r),[WA]:n}}var As,WA,ft=E(()=>{"use strict";As="LMCTL_SELF_SESSIONID",WA="LMCTL_LAUNCH_SOURCE"});import{spawn as m_}from"node:child_process";import{mkdirSync as BA}from"node:fs";var rc,Oe,Vt=E(()=>{"use strict";c_();u_();Lt();ft();rc=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===we?r:n)}seed(e,r){return BA(e,{recursive:!0}),new Promise(n=>{let s;try{s=m_(this.binary,this.seedArgsFor(r),{cwd:e,env:gr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1518
|
-
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Pi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&a_(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},m=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new rc("Turn cancelled","external"):p}),f=new Promise(p=>{l=p});return Promise.race([m,f])}runOneShotAgent(e,r,n){let s=l_(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=d_(r.env),c=m_(s,{shell:!0,cwd:r.cwd,env:We(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,m=setTimeout(()=>{u=!0,c.kill()},l),f="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();f+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(m),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(d)return;d=!0,clearTimeout(m);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:f.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(m),a(h))})})}}});function Ui(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new
|
|
1516
|
+
`),...wp(t),...gp(t)}}function RA(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Zl,it=E(()=>{"use strict";Wl();yp();Tp();ql();kp();Ts();me();Li();Jp();ks();Zl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=xA(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let 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(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let 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:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let f=this.getJob(a.id);return f===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:f}}),this.resumeRunTxn=e.transaction((r,n,s)=>RA("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==$i)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(n!==Ss&&!a.includes(n))return{resumed:!1,reason:Vp};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]=n,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,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale");Mp(this.db,o,s,l)}return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)vs(this.db,i,"",C()),this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){zp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,C()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,C());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){zp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,C());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,C())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,C());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,C()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,C(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(C(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,C());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,C());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,C(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,C());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",C());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,C());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=C(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,C(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,C(),e)??null}closeIssue(e,r,n){let s=C(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,C(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,C(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=C();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,C(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Yp(),s=C();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let i=C(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,C())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??C(),e.dedupe_key??null,e.concurrency_key??null,C());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=C(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:C();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,C()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,C()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??C(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,C());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=C(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,C(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(C(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return Lp(this.db,n,e),n})()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??C(),n=e.holder_host??Is(),s=e.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Jt(e.command),r,e.holder_pid??null,n,s,Jt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return qp(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??C();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Jt(r.result_summary),Jt(r.error),r.team_chat_log_id??null,Jt(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Yl(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??C();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Jt(n.result_summary),Jt(n.error),n.team_chat_log_id??null,Jt(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Yl(this.db,o),o})()}heartbeatTrackedInvocation(e,r=C()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return Hp(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(Xp(this.db,e,r),this.getTrackedInvocation(e)))()}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=C()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Bp(this.db,i,r,n),i})()}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){return this.db.transaction(()=>{let n=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,gs(e.payload),e.created_at??C(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null),s=this.getMailboxMessage(Number(n.lastInsertRowid));return Jl(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=gs(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of s){let c=this.getMailboxMessage(l),d=this.stmts.markMailboxMessageDelivered.run(n,i,l);a+=d.changes,d.changes===1&&c!==null&&(vs(this.db,c,i,n),o.push(c))}this.db.exec("COMMIT");for(let l of o)hr("mailbox_delivery_delivered",l,{transition:l.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,l.id,l.delivering_at,l.delivery_holder_pid,l.delivery_holder_host).changes!==1){o.push(l);continue}vs(this.db,l,s,n),a+=1,i.push(l)}this.db.exec("COMMIT");for(let l of i)hr("mailbox_delivery_delivered",l,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let l of o)hr("mailbox_delivery_finalize_skipped",l,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=gs(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let f of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,f.id,f.delivering_at,f.delivery_holder_pid,f.delivery_holder_host).changes!==1){o.push(f);continue}a+=1,i.push(f)}let c=[...i].sort((f,p)=>f.created_at.localeCompare(p.created_at)||f.id-p.id),d=c.at(-1)??null,u=null;if(d!==null&&d.sender_teamfile!==null&&d.sender_alias!==null){let f=this.stmts.insertMailboxResponseIfAbsent.run(d.sender_teamfile,d.sender_alias,d.receiver_teamfile,d.receiver_alias,d.root_teamfile,s,n,null,null,null,null,d.reply_mode,d.id);if(l=f.changes,f.changes===1&&(u=this.getMailboxMessage(Number(f.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let m=u===null?null:Rt(u.id);for(let f of i)vs(this.db,f,s,n,d!==null&&f.id!==d.id?m:null);u!==null&&Jl(this.db,u,{},{},c.map(f=>Rt(f.id))),this.db.exec("COMMIT");for(let f of i)hr("mailbox_delivery_delivered",f,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let f of o)hr("mailbox_delivery_finalize_skipped",f,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=Is()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(Op(this.db,d,r,n,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)hr("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(Gl(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)hr("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e,r="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(e.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&Gl(this.db,s,r),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=NA(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)hr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&bs(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid});return o.changes===1&&i!==null&&bs(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let s=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return s.changes===1&&bs(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),s.changes===1}let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(bs(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(ys,ws(e,r),Es);return n===void 0?null:Sp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&Vl(this.db,n,!0),this.stmts.upsertRuntimeState.run(ys,ws(e.teamfile,e.alias),Es,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&Dp(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ys,ws(e,r),Es,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(ys,ws(e,r),Es);return i.changes===1&&Vl(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:kA(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=C()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!IA(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Yp(),holder_pid:process.pid,holder_host:Is(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,C(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,C())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,C());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,C(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??C(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,C());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,C()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,C()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,C());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(C(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=C();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??C());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,C())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,C())}}});import{realpathSync as LA}from"node:fs";import{resolve as OA}from"node:path";function Ql(t){let e=OA(t);try{return LA(e)}catch{return e}}var Qp=E(()=>{"use strict"});import{platform as e_}from"node:os";function Lt(t){let e=new Ns;for(let r of t)e.registerAdapter(r);return e}var Ns,ec=E(()=>{"use strict";Qp();Ns=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=Ql(e.workspace);i=i.filter(a=>Ql(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=e_()==="darwin"||e_()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as t_}from"node:fs";import{createInterface as r_}from"node:readline";import{stat as $A}from"node:fs/promises";import{homedir as CA}from"node:os";async function*Ye(t){let e=t_(t,{encoding:"utf-8"}),r=r_({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ue(t,e){let r=[],n=t_(t,{encoding:"utf-8"}),s=r_({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Le(t){let e=await $A(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function _e(t){return t.replace(/\\n/g,`
|
|
1517
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,gr=E(()=>{"use strict";ke=CA()});import{readdir as Mi,stat as n_,unlink as MA}from"node:fs/promises";import{join as wn,basename as s_}from"node:path";function DA(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function jA(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return _e(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 i_(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ye(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,m=d.cache_creation_input_tokens||0,f=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+m+f,n+=f,s+=m,i+=p;let h=u+m+f;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:m,cachedInputTokens:f,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var Di,o_=E(()=>{"use strict";gr();Di=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||wn(ke,".claude"),this.projectsDir=wn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Mi(this.projectsDir)}catch{return e}for(let n of r){let s=wn(this.projectsDir,n);if(!(await n_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Mi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=s_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=wn(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,r){let n=await Ue(e,50),s=await Le(e),i="",o,a,l,c,d,u;for(let f of n)if(!DA(f.type)&&(!i&&f.cwd&&(i=f.cwd),!o&&f.slug&&(o=f.slug),!a&&f.version&&(a=f.version),!u&&f.timestamp&&(u=new Date(f.timestamp)),f.type==="assistant"&&f.message?.model&&(l=f.message.model),f.type==="user"&&!f.isMeta&&f.message)){let p=f.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),d=G(p.trim(),80)}}if(!i)return null;let m=await i_(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Le(r),s=[],i="",o,a,l,c,d,u,m,f=e;for await(let h of Ye(r))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),!m&&h.timestamp&&(m=new Date(h.timestamp)),h.sessionId&&(f=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:jA(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=G(_.trim(),80)),u=G(_.trim(),80),s.push({role:"user",timestamp:g,content:_e(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?_e(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:_e(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await i_(r);return{provider:"claude",sessionId:f,slug:o,cwd:i,createdAt:m||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await MA(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Mi(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=wn(this.projectsDir,o);if(!(await n_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Mi(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=s_(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:wn(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Ue(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});function ji(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function FA(t,e,r){if(!r)return"";let n=t.tools[e]??tc[e],s=n?.profiles?.[r]?.flags??tc[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function a_(t,e){return!!t.tools[e]}function l_(t,e,r,n,s){let i=t.tools[e]??tc[e],o;if(i?.agent){let l=ji(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=PA[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ji).join(" ");o=`printf '%s\\n' ${ji(n)} | ${d}`}else o=c.map(ji).join(" ")}let a=FA(t,e,s);return a&&(o+=" "+a),o}var tc,PA,c_=E(()=>{"use strict";tc={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:""}}}},PA={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function d_(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var u_=E(()=>{"use strict"});var UA,we,Pi,Ot=E(()=>{"use strict";UA="ACK: waiting for explicit lmctl task.",we=`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: ${UA}`,Pi=`send this exact lmctl seed instruction: "${we}"`});function yr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function qA(t,e){return e===void 0||e.length===0?t:{...t??process.env,[As]:e}}function We(t,e,r,n="chat"){return{...qA(yr(t,e),r),[WA]:n}}var As,WA,ft=E(()=>{"use strict";As="LMCTL_SELF_SESSIONID",WA="LMCTL_LAUNCH_SOURCE"});import{spawn as m_}from"node:child_process";import{mkdirSync as BA}from"node:fs";var rc,Oe,Kt=E(()=>{"use strict";c_();u_();Ot();ft();rc=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===we?r:n)}seed(e,r){return BA(e,{recursive:!0}),new Promise(n=>{let s;try{s=m_(this.binary,this.seedArgsFor(r),{cwd:e,env:yr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
|
|
1518
|
+
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Pi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&a_(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},m=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new rc("Turn cancelled","external"):p}),f=new Promise(p=>{l=p});return Promise.race([m,f])}runOneShotAgent(e,r,n){let s=l_(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=d_(r.env),c=m_(s,{shell:!0,cwd:r.cwd,env:We(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,m=setTimeout(()=>{u=!0,c.kill()},l),f="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();f+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(m),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(d)return;d=!0,clearTimeout(m);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:f.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(m),a(h))})})}}});function Ui(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new zt(t,r,e)}var ot,Te,Yt,Fi,zt,Tn=E(()=>{"use strict";ot=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Te=class extends ot{},Yt=class extends ot{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Fi=class extends ot{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},zt=class extends ot{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as sc from"node:child_process";function XA(t){if(typeof sc.spawnSync=="function")try{sc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function f_(t){return t.exitCode!==null||t.signalCode!==null}function nc(t,e){return f_(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function at(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??XA;if(f_(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await nc(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await nc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await nc(t,HA)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var HA,Wi=E(()=>{"use strict";HA=1e3});function p_(t){ue()&&Ce({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function Er(t,e){let r=GA[t];if(r)return r[e]??r.yolo}function KA(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function pt(t,e,r="yolo"){if(VA.has(t)){p_(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?Er(t,"plan"):JA[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw M({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new Te(s)}if(!KA(e,n)){let s=n.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw M({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new Te(i)}p_(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var JA,GA,VA,vn=E(()=>{"use strict";Tn();me();JA={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},GA={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"]}};VA=new Set(["codex","opencode"])});function __(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
|
|
1519
1519
|
|
|
1520
1520
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1521
1521
|
|
|
@@ -1523,15 +1523,15 @@ var VI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{f
|
|
|
1523
1523
|
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:
|
|
1524
1524
|
${e}
|
|
1525
1525
|
|
|
1526
|
-
${r}`:r}function g_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||ZA[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=
|
|
1526
|
+
${r}`:r}function g_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||ZA[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=Er(s,a)??ex[s]??["--dangerously-skip-permissions"];o.push(...l);try{pt(s,o,a)}catch(g){return n(g)}if(e.cwd&&!zA(e.cwd))return M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new Te(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=YA(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(e.env,e.cwd,e.sessionId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,M({event:"transport_abort",provider:s,phase:"pre_spawn"}),at(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,M({event:"transport_abort",provider:s}),at(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ic({onEvent:e.onEvent,onText:e.onText}),m="";function f(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{m+=g.toString();let _=m.split(`
|
|
1527
1527
|
`);m=_.pop()||"";for(let y of _)f(y)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new Te(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;m.trim()&&f(m);let _=u.finalize();_?(xt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(M({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(QA({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
|
|
1528
|
-
`),xt(`stream-json: prompt sent (${t.length} chars)`)})}var ZA,ex,y_=E(()=>{"use strict";Tn();Wi();vn();me();ft();oc();oc();ZA={claude:"claude",qwen:"qwen"};ex={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function qi(t={}){return[]}var ac=E(()=>{"use strict"});function lc(t){return t==="plan"?"read-only":"danger-full-access"}function E_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function cc(){return{agentItems:new Map,resultText:""}}function Bi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({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 dc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function w_(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function uc(){return{pendingCodexError:null}}function mc(t,e){let r=w_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function fc(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var pc=E(()=>{"use strict"});import{spawn as tx}from"node:child_process";import{createInterface as rx}from"node:readline";import{existsSync as nx,readFileSync as sx}from"node:fs";import{fileURLToPath as ix}from"node:url";function ax(){return E_(ox)}function
|
|
1528
|
+
`),xt(`stream-json: prompt sent (${t.length} chars)`)})}var ZA,ex,y_=E(()=>{"use strict";Tn();Wi();vn();me();ft();oc();oc();ZA={claude:"claude",qwen:"qwen"};ex={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function qi(t={}){return[]}var ac=E(()=>{"use strict"});function lc(t){return t==="plan"?"read-only":"danger-full-access"}function E_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function cc(){return{agentItems:new Map,resultText:""}}function Bi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({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 dc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function w_(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function uc(){return{pendingCodexError:null}}function mc(t,e){let r=w_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function fc(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var pc=E(()=>{"use strict"});import{spawn as tx}from"node:child_process";import{createInterface as rx}from"node:readline";import{existsSync as nx,readFileSync as sx}from"node:fs";import{fileURLToPath as ix}from"node:url";function ax(){return E_(ox)}function wr(t,e){xt(`[codex:${t}] ${JSON.stringify(e)}`)}function lx(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1529
1529
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1530
1530
|
${e}
|
|
1531
1531
|
|
|
1532
1532
|
${r}`:r}function T_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?qi():[];i.push(...a),ue()&&je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=lc(l);try{pt("codex",i,l)}catch(U){return n(U)}if(e.cwd&&!nx(e.cwd))return M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Te(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=tx(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(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"}),at(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:"codex"}),at(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let m=rx({input:d.stdout}),f=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,T=Date.now(),v=cc(),I=uc();function A(U,j={}){return new Promise((x,te)=>{let B=p++;f.set(B,{resolve:x,reject:te});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:U,params:j});d.stdin?.write(k+`
|
|
1533
1533
|
`)})}function X(U,j={}){let x=JSON.stringify({jsonrpc:"2.0",method:U,params:j});d.stdin?.write(x+`
|
|
1534
|
-
`)}m.on("line",U=>{let j;try{j=JSON.parse(U)}catch{return}if(typeof j.id=="number"&&f.has(j.id)){let B=f.get(j.id);if(f.delete(j.id),j.error){let k=j.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(j.error);B.reject(Ui(`codex app-server error: ${N}`,k))}else B.resolve(j);e.onEvent?.(j);return}let x=j.method;if(!x){e.onEvent?.(j);return}if(x==="thread/started"){let k=j.params?.thread;k?.id&&(h=k.id)}let te=ue()?B=>{
|
|
1534
|
+
`)}m.on("line",U=>{let j;try{j=JSON.parse(U)}catch{return}if(typeof j.id=="number"&&f.has(j.id)){let B=f.get(j.id);if(f.delete(j.id),j.error){let k=j.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(j.error);B.reject(Ui(`codex app-server error: ${N}`,k))}else B.resolve(j);e.onEvent?.(j);return}let x=j.method;if(!x){e.onEvent?.(j);return}if(x==="thread/started"){let k=j.params?.thread;k?.id&&(h=k.id)}let te=ue()?B=>{wr("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let B=j.params,k=B?.turn;k?.id&&(g=k.id),Bi(j,v,e.onDelta,te),ue()&&wr("turn/started",{params:B??null})}if(ue()&&(x==="item/started"||x==="item/completed")){let B=j.params;B?.item?.type==="agentMessage"&&wr(x,{params:B??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let B=j.params;ue()&&wr("agentMessage/delta",{params:B??null})}Bi(j,v,e.onDelta,te)}if(x==="turn/completed"){let B=j.params;if(ue())for(let[N,L]of v.agentItems.entries())L.buffer&&wr("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});dc(v),ue()&&wr("turn/completed",{params:B??null});let k=fc(j,I);k.shouldReject?(ue()&&wr("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,_=!0,d.stdin?.end(),n(k.turnError)):(_=!0,d.stdin?.end())}if(x==="error"){let B=mc(j,I);if(ue()){let k=j.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";wr(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}e.onEvent?.(j)});let ge="";d.stderr?.on("data",U=>{ge+=U.toString()}),d.on("error",U=>{M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new Te(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),d.on("exit",U=>{if(!u&&!y){if(_){r({result:v.resultText,threadId:h,turnId:g,durationMs:Date.now()-T,exitCode:U});return}if(I.pendingCodexError){n(I.pendingCodexError);return}M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:ge.slice(0,500)}),n(new Error(lx({exitCode:U,stderr:ge})))}}),(async()=>{try{if(await A("initialize",ax()),X("initialized",{}),e.threadId)try{let U=A("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),j=new Promise((x,te)=>setTimeout(()=>te(new Error("resume timeout")),5e3));await Promise.race([U,j]),h=e.threadId}catch(U){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1535
1535
|
`),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:U instanceof Error?U.message:String(U)});let x=(await A("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;x?.id&&(h=x.id)}else{let j=(await A("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;j?.id&&(h=j.id)}await A("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(U){at(d).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var ox,v_=E(()=>{"use strict";me();me();Tn();Wi();vn();ac();me();ft();pc();pc();ox=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(sx(ix(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as k_,mkdirSync as cx,readFileSync as I_,writeFileSync as b_}from"node:fs";import{join as xs,resolve as dx}from"node:path";function N_(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 _c(t,e,r={existsSync:k_,readFileSync:I_}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=dx(e,s.sessiondir??e);for(let o of ux(i)){let a=mx(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(N_(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function ux(t){return[xs(t,".opencode","opencode.jsonc"),xs(t,"opencode.jsonc"),xs(t,"opencode.json")]}function mx(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(fx(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function fx(t){let e="",r=!1,n="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(r){e+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
|
|
1536
1536
|
`;)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 Hi(t,e={}){let r=xs(t,".opencode"),n=xs(r,"opencode.json");if(!k_(n)){cx(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return b_(n,o+`
|
|
1537
1537
|
`,"utf-8"),!0}let s;try{s=JSON.parse(I_(n,"utf-8"))}catch{return console.log(S_.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(S_.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),N_(s.permission)||M({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&b_(n,JSON.stringify(s,null,2)+`
|
|
@@ -1542,7 +1542,7 @@ ${e}
|
|
|
1542
1542
|
${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,c)=>{let d=bx++;n.set(d,{resolve:l,reject:c});let u=JSON.stringify({jsonrpc:"2.0",id:d,method:o,params:a});Ce({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:d,params:a}),t.stdin?.write(`${u}
|
|
1543
1543
|
`)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
|
|
1544
1544
|
`)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ce({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let c=n.get(a.id);if(n.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(Ui(`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)`}});Ce({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
|
|
1545
|
-
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Te("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ec(t){let e;try{e=O_(t.binaryPath??yc.opencode.binary,yc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=$_(e,{provider:"opencode"}),n=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),r.close(),!u){s(d);return}at(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"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let d=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=bn(d);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function C_(t,e){let r=yc[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{Hi(e.cwd)}catch(y){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=
|
|
1545
|
+
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Te("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ec(t){let e;try{e=O_(t.binaryPath??yc.opencode.binary,yc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=$_(e,{provider:"opencode"}),n=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),r.close(),!u){s(d);return}at(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"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let d=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=bn(d);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function C_(t,e){let r=yc[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{Hi(e.cwd)}catch(y){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=Er("gemini","plan"),T=Er("gemini","yolo");a=a.filter(v=>!(T??[]).includes(v)),y&&a.push(...y)}else e.tool==="copilot"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
|
|
1546
1546
|
`),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{pt(e.tool,a,l)}catch(y){return s(y)}if(e.model&&e.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
|
|
1547
1547
|
`),M({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!wx(e.cwd))return M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new Te(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=O_(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(e.env,e.cwd,e.sessionId)}),d=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),at(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),at(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let m=e.sessionId||"",f=hc({tool:e.tool,onDelta:e.onDelta});f.setSessionId(m);let p=$_(c,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>f.processMessage(y)}),{sendRpc:h,sendNotification:g}=p,_="";c.stderr?.on("data",y=>{_+=y.toString()}),c.on("error",y=>{p.close(y),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new Te(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(p.close(new Te(`ACP process exited with code ${String(y)}`)),u)return;let T=f.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-d,stopReason:T.stopReason,exitCode:y}):(M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(vx({tool:e.tool,exitCode:y,stderr:_}))))}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),e.sessionId)try{let v=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});m=bn(v,e.sessionId),f.setSessionId(m)}catch(v){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${v instanceof Error?v.message:String(v)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
1548
1548
|
`),M({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:v instanceof Error?v.message:String(v)});let I=await h("session/new",{cwd:e.cwd,mcpServers:[]});m=bn(I),f.setSessionId(m)}else{let v=await h("session/new",{cwd:e.cwd,mcpServers:[]});m=bn(v),f.setSessionId(m)}if(e.model&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:m,configId:"model",value:e.model}),xt(`acp: set_config_option(model=${e.model}) ok`)}catch(v){let I=v instanceof Error?v.message:String(v);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${I}
|
|
@@ -1551,16 +1551,16 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1551
1551
|
`).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let m=u.map(f=>typeof f=="object"&&f&&"text"in f?f.text:"").filter(Boolean).join("");m&&(d=`${m.split(`
|
|
1552
1552
|
`).length} lines, ${m.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(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Ji(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?kx():void 0,s=await g_(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function Nx(){let t=new Map;return(e,r)=>{Ax(e,M_(t,r))}}function Ax(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:ye(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ye(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=ye(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:ye(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 ${ye(c,80)}`:"running\u2026";e({kind:"other",summary:d,id:a})}return}e({kind:"other",summary:i})}}async function Sn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Ce({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?Nx():void 0,s=await C_(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function xx(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ye(o,120)}`}:{kind:"other",summary:`codex error: ${ye(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:ye(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",m=typeof s.durationMs=="number"?s.durationMs:void 0,f=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof m=="number"&&p.push(`${Math.round(m/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:f,elapsedMs:m,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:ye(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:ye(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:ye(s)}:{kind:"text",summary:ye(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ye(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
|
|
1553
1553
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ye(o,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
|
|
1554
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ye(o,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function D_(t,e){let r=await T_(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>xx(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Sx,qr=E(()=>{"use strict";y_();v_();wc();me();Sx=256});function vc(t){return new Tc(t)}var Tc,bc=E(()=>{"use strict";o_();
|
|
1555
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}async function F_(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Ye(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;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=Cx(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:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var Vi,U_=E(()=>{"use strict";
|
|
1556
|
-
`);y.trim()&&Ls(s,f,{role:"thinking",timestamp:g,content:_e(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Ls(s,f,{role:"thinking",timestamp:g,content:_e(_)})}}if(!i)return null;let p=await F_(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:m,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Lx(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ue(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 kc(t){return new Sc(t)}var Sc,Ic=E(()=>{"use strict";U_();
|
|
1554
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ye(o,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function D_(t,e){let r=await T_(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>xx(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Sx,qr=E(()=>{"use strict";y_();v_();wc();me();Sx=256});function vc(t){return new Tc(t)}var Tc,bc=E(()=>{"use strict";o_();Kt();qr();Ot();Tc=class extends Oe{constructor(e){super({provider:new Di(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",we,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Ji})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as Rx,stat as j_,unlink as Lx}from"node:fs/promises";import{join as Rs,basename as Ox}from"node:path";function $x(t,e,r){return`${t}|${e.toISOString()}|${r}`}function Ls(t,e,r){let n=$x(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function P_(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function Cx(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 Gi(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return Gi(r)}).filter(r=>r.length>0).join(`
|
|
1555
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}async function F_(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Ye(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;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=Cx(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:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var Vi,U_=E(()=>{"use strict";gr();Vi=class{name="codex";codexDirs;constructor(e={}){let r=[Rs(ke,".codex"),Rs(ke,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Rs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Rs(r,"sessions");try{await j_(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await Rx(e)}catch{return r}for(let s of n){let i=Rs(e,s),o=await j_(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=Ox(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Ue(e,30),n=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,d,u,m;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(m=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),d=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),d=G(h.text.trim(),80))}}if(!i)return null;let f=await F_(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:P_(u,m),firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:f.lastTokenUsage,modelContextWindow:f.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Le(r),s=[],i="",o,a,l,c,d,u=e,m,f=new Set;for await(let h of Ye(r)){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)),m=P_(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 _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let y of _.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let T=y.text.trim();c||(c=G(T,80)),d=G(T,80),Ls(s,f,{role:"user",timestamp:g,content:_e(T)})}continue}if(_.role==="assistant"&&_.content){for(let y of _.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&Ls(s,f,{role:"assistant",timestamp:g,content:_e(y.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let y of _.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&Ls(s,f,{role:"system",timestamp:g,content:_e(y.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?_e(Gi(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:_e(Gi(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let y=_.summary.map(T=>Gi(T.text)).join(`
|
|
1556
|
+
`);y.trim()&&Ls(s,f,{role:"thinking",timestamp:g,content:_e(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Ls(s,f,{role:"thinking",timestamp:g,content:_e(_)})}}if(!i)return null;let p=await F_(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:m,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Lx(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ue(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 kc(t){return new Sc(t)}var Sc,Ic=E(()=>{"use strict";U_();Kt();qr();Ot();Sc=class extends Oe{constructor(e){super({provider:new Vi(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:`${we}
|
|
1557
1557
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:D_})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Os(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function Ki(t){let e=Os(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
|
|
1558
1558
|
`).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let 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?Mx(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 Mx(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&W_(t.tokens)&&W_(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function W_(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function q_(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
|
|
1559
1559
|
`)+`
|
|
1560
|
-
`}var Nc=E(()=>{"use strict"});import{createHash as Dx}from"node:crypto";import{readdir as $s,readFile as B_,stat as Yi,unlink as jx}from"node:fs/promises";import{join as Qe,basename as Px,dirname as Fx}from"node:path";import{cwd as Ux}from"node:process";function H_(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function X_(t){return t==="user"}function Ac(t){return t==="gemini"||t==="assistant"}function Br(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Wx(t){return`${t.sessionId}\0${t.cwd}`}function qx(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function zi(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function J_(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!Ac(a.type)||!a.tokens)continue;let l=zi(a.tokens.input),c=zi(a.tokens.cached),d=Math.max(l-c,0),u=zi(a.tokens.output),m=zi(a.tokens.thoughts);e+=l,r+=c,n+=u,s+=m,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:m,totalTokens:l+u+m}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function Bx(t){return Dx("sha256").update(t).digest("hex")}function Cs(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=Fx(r);if(n===r)break;r=n}}var Zi,G_=E(()=>{"use strict";
|
|
1561
|
-
`).trim();A&&i.push({role:"thinking",timestamp:Br(I.timestamp,_),content:_e(A)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${v}${T}`.trim()})}let f=Br(n.startTime,s.createdAt),p=Br(n.lastUpdated,s.modifiedAt),h=J_(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:f,modifiedAt:p,model:m,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Le(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let f of s)if(X_(f.type)){u++;let p=H_(f.content).trim();p&&(l||(l=G(_e(p),80)),c=G(_e(p),80))}else Ac(f.type)&&(u++,f.model&&(d=f.model));let m=J_(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Br(r.startTime,n.createdAt),modifiedAt:Br(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let r=await B_(e,"utf-8");if(Os(r)==="unknown")return M({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Ki(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Px(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await $s(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Qe(this.geminiTmpDir,n,"chats");if(!(await Yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Qe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await jx(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),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)}));n.push({filePath:s,modifiedAt:Br(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Cs(e,Ux());for(let n of this.extraWorkspacePaths)Cs(e,n);for(let n of await this.collectGeminiProjectPaths())Cs(e,n);for(let n of await this.collectCodexCwds())Cs(e,n);for(let n of await this.collectClaudeCwds())Cs(e,n);let r=new Map;for(let n of e)r.set(Bx(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await B_(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Ue(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await $s(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Qe(this.claudeProjectsDir,n);if(!(await Yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Qe(s,a),d=(await Ue(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Yi(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await $s(e)}catch{return r}for(let i of s){let o=Qe(e,i),a=await Yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as Hx,writeFileSync as Xx,mkdirSync as Jx}from"node:fs";import{join as Gx,dirname as Vx}from"node:path";import{randomUUID as Kx}from"node:crypto";function Rc(t){return new xc(t)}var xc,Lc=E(()=>{"use strict";G_();
|
|
1560
|
+
`}var Nc=E(()=>{"use strict"});import{createHash as Dx}from"node:crypto";import{readdir as $s,readFile as B_,stat as Yi,unlink as jx}from"node:fs/promises";import{join as Qe,basename as Px,dirname as Fx}from"node:path";import{cwd as Ux}from"node:process";function H_(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function X_(t){return t==="user"}function Ac(t){return t==="gemini"||t==="assistant"}function Br(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Wx(t){return`${t.sessionId}\0${t.cwd}`}function qx(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function zi(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function J_(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!Ac(a.type)||!a.tokens)continue;let l=zi(a.tokens.input),c=zi(a.tokens.cached),d=Math.max(l-c,0),u=zi(a.tokens.output),m=zi(a.tokens.thoughts);e+=l,r+=c,n+=u,s+=m,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:m,totalTokens:l+u+m}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function Bx(t){return Dx("sha256").update(t).digest("hex")}function Cs(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=Fx(r);if(n===r)break;r=n}}var Zi,G_=E(()=>{"use strict";gr();Nc();me();Zi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Qe(ke,".gemini");this.geminiProjectsFile=Qe(r,"projects.json"),this.geminiTmpDir=Qe(r,"tmp");let n=e.claudeDir||Qe(ke,".claude");this.claudeProjectsDir=Qe(n,"projects");let s=[Qe(ke,".codex"),Qe(ke,".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=>Qe(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let i=Wx(s),o=r.get(i);r.set(i,o?qx(o,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Le(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,m;for(let g of o){let _=Br(g.timestamp),y=g.type,T=_e(H_(g.content));if(X_(y)){let I=T.trim();I&&(d||(d=G(I,80)),u=G(I,80)),i.push({role:"user",timestamp:_,content:I||T});continue}if(Ac(y)){g.model&&(m=g.model);for(let I of g.thoughts||[]){let A=[I.subject,I.description].filter(Boolean).join(`
|
|
1561
|
+
`).trim();A&&i.push({role:"thinking",timestamp:Br(I.timestamp,_),content:_e(A)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${v}${T}`.trim()})}let f=Br(n.startTime,s.createdAt),p=Br(n.lastUpdated,s.modifiedAt),h=J_(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:f,modifiedAt:p,model:m,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Le(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let f of s)if(X_(f.type)){u++;let p=H_(f.content).trim();p&&(l||(l=G(_e(p),80)),c=G(_e(p),80))}else Ac(f.type)&&(u++,f.model&&(d=f.model));let m=J_(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Br(r.startTime,n.createdAt),modifiedAt:Br(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let r=await B_(e,"utf-8");if(Os(r)==="unknown")return M({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Ki(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Px(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await $s(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Qe(this.geminiTmpDir,n,"chats");if(!(await Yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Qe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await jx(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),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)}));n.push({filePath:s,modifiedAt:Br(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Cs(e,Ux());for(let n of this.extraWorkspacePaths)Cs(e,n);for(let n of await this.collectGeminiProjectPaths())Cs(e,n);for(let n of await this.collectCodexCwds())Cs(e,n);for(let n of await this.collectClaudeCwds())Cs(e,n);let r=new Map;for(let n of e)r.set(Bx(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await B_(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Ue(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await $s(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Qe(this.claudeProjectsDir,n);if(!(await Yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await $s(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Qe(s,a),d=(await Ue(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Yi(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await $s(e)}catch{return r}for(let i of s){let o=Qe(e,i),a=await Yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as Hx,writeFileSync as Xx,mkdirSync as Jx}from"node:fs";import{join as Gx,dirname as Vx}from"node:path";import{randomUUID as Kx}from"node:crypto";function Rc(t){return new xc(t)}var xc,Lc=E(()=>{"use strict";G_();Kt();qr();Ot();Nc();xc=class extends Oe{constructor(e){super({provider:new Zi(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",we,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Sn(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
|
|
1562
1562
|
`)}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Pi,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=Hx(n,"utf-8"),i=Os(s),o=Ki(s),a=Kx();o.sessionId=a,o.kind="main";let l=Vx(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,m=Gx(l,u);return Jx(l,{recursive:!0}),Xx(m,q_(o,i),"utf-8"),{success:!0,sessionId:a,filePath:m}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as V_,readFile as Yx,rm as zx,stat as kn}from"node:fs/promises";import{basename as Zx,join as _t}from"node:path";function Qx(t){let e={};for(let r of t.split(`
|
|
1563
|
-
`)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Hr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function eR(t){let e=0;for await(let r of Ye(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Qi,K_=E(()=>{"use strict";
|
|
1563
|
+
`)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Hr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function eR(t){let e=0;for await(let r of Ye(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Qi,K_=E(()=>{"use strict";gr();Qi=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||_t(ke,".copilot");this.sessionStateDir=_t(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await V_(this.sessionStateDir)}catch{return e}for(let n of r){let s=_t(this.sessionStateDir,n);if((await kn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=_t(r,"events.jsonl"),i=await kn(s).catch(()=>null),o=i?s:_t(r,"workspace.yaml"),a=await Le(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,m,f,p,h,g=n?.id||Zx(r)||e;if(i)for await(let _ of Ye(s)){let y=Hr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Hr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(m=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){d=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let T=_.data.content||"",v=T.trim();v&&(f||(f=G(v,80)),p=G(v,80)),l.push({role:"user",timestamp:y,content:_e(v||T)});continue}if(_.type==="assistant.message"&&_.data){let T=(_.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:_e(T),model:d}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let T=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:_e(T),toolDetailedContent:v?_e(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:_e(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let T=_.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:_e(T)});continue}}if(!f){let _=(n?.summary||"").trim();_&&(f=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Hr(n?.created_at)??a.createdAt,modifiedAt:Hr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:m,firstUserMessage:f,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=_t(e,"events.jsonl"),i=await kn(s).catch(()=>null),o=i?s:_t(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ue(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,m,f,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(m=_.data.copilotVersion),_.data.startTime&&(f=Hr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(d=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=G(y,80)),h=G(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=i?await eR(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:f??Hr(n?.created_at)??a.createdAt,modifiedAt:Hr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(e){let r=_t(e,"workspace.yaml");try{let n=await Yx(r,"utf-8");return Qx(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await zx(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await V_(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=_t(this.sessionStateDir,e);if((await kn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=_t(this.sessionStateDir,s);(await kn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=_t(this.sessionStateDir,s);if(!(await kn(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 $c(t){return new Oc(t)}var Oc,Cc=E(()=>{"use strict";K_();Kt();qr();me();Ot();Oc=class extends Oe{constructor(e){super({provider:new Qi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",we,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>Sn(r,{...n,acpTool:"copilot"})})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ce({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Y_,readdirSync as tR,statSync as z_}from"node:fs";import{join as Tr}from"node:path";import{createRequire as rR}from"node:module";function Z_(){return Mc===null&&(Mc=rR(import.meta.url)("node:sqlite").DatabaseSync),Mc}function nR(){let t=process.env.XDG_DATA_HOME||Tr(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||Tr(ke,".config");return[Tr(t,"opencode","opencode.db"),Tr(e,"opencode","opencode.db")]}function sR(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||Tr(ke,".local","share"),e=Tr(t,"lmplayer"),r=Tr(e,"opencode-local.db"),n=[r];try{let s=tR(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>Tr(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return z_(o).mtimeMs-z_(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function iR(t){return t==="lmplayer"?sR():nR()}var Mc,In,Dc=E(()=>{"use strict";gr();Mc=null;In=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=iR(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Y_(e))}openDb(e){return Y_(e)?new(Z_())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1564
1564
|
s.time_created, s.time_updated
|
|
1565
1565
|
FROM session s
|
|
1566
1566
|
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=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
@@ -1573,12 +1573,12 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1573
1573
|
FROM session s
|
|
1574
1574
|
WHERE s.id LIKE ?
|
|
1575
1575
|
ORDER BY s.time_updated DESC
|
|
1576
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Pc(){return new jc}var jc,Fc=E(()=>{"use strict";Dc();
|
|
1576
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Pc(){return new jc}var jc,Fc=E(()=>{"use strict";Dc();Kt();qr();Ot();jc=class extends Oe{constructor(){super({provider:new In,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",we],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Sn(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??we),r}}});import{spawn as oR}from"node:child_process";import{mkdirSync as aR}from"node:fs";function Wc(t){return new Uc(t)}async function lR(t,e){let r=Date.now(),n=Q_({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});pt("lmplayer",n,e.permissionMode??"yolo");let s=await eh(e.binary,n,{cwd:e.cwd,env:We(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Q_(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(...Er("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function eh(t,e,r){return new Promise((n,s)=>{let i;try{i=oR(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],m=!1,f=r.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{f!==void 0&&clearTimeout(f)},h=g=>{let _=g.trim();if(!_)return;let y;try{y=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!to(y))return;let T=eo(y,!1);c===void 0&&T!==void 0&&(c=T),d=eo(y,!0)??d;let v=th(y);v&&(u.push(v),r.onText?.(v))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let y=l.indexOf(`
|
|
1577
1577
|
`);for(;y>=0;){let T=l.slice(0,y);l=l.slice(y+1),h(T),y=l.indexOf(`
|
|
1578
|
-
`)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{m||(m=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{m||(m=!0,p(),s(g))})})}function th(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(to(r)){let n=th(r);if(n)return n}}}function eo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(to(r)){let n=eo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(to(s)){let i=eo(s,e);if(i!==void 0)return i}}}function to(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Uc,qc=E(()=>{"use strict";Dc();
|
|
1578
|
+
`)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{m||(m=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{m||(m=!0,p(),s(g))})})}function th(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(to(r)){let n=th(r);if(n)return n}}}function eo(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(to(r)){let n=eo(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(to(s)){let i=eo(s,e);if(i!==void 0)return i}}}function to(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Uc,qc=E(()=>{"use strict";Dc();Kt();Ot();vn();ft();Uc=class extends Oe{constructor(e){super({provider:new In({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",we],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:lR})}seedArgsFor(e){return Q_({prompt:e?.prompt??we,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){aR(e,{recursive:!0});let n=this.seedArgsFor(r);pt("lmplayer",n);try{let s=await eh(this.binary,n,{cwd:e,env:yr(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 "${we}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as ro,readFile as cR,rm as dR}from"node:fs/promises";import{basename as rh,join as vr}from"node:path";function nh(t){return t.type==="user"||t.message?.role==="user"}function sh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ih(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
|
|
1579
1579
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1580
|
-
`):"":""}function oh(t){return t.model||t.message?.model}var no,ah=E(()=>{"use strict";hr();no=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Tr(ke,".qwen")}async discoverSessions(){let e=Tr(this.baseDir,"projects"),r;try{r=await ro(e)}catch{return[]}let n=[];for(let s of r){let i=Tr(e,s,"chats"),o;try{o=await ro(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Tr(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(e,r){let n=await Ue(e,30);if(n.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),nh(u)){let m=ih(u).trim();m&&(l||(l=G(m,80)),c=G(m,80)),d++}if(sh(u)){let m=oh(u);m&&(o=m),d++}}return{provider:"qwen",sessionId:r,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 r=await this.resolveSessionPath(e);if(!r)return null;let n=rh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Le(e),s="(unknown)",i,o,a,l,c,d,u=[];for await(let m of Ye(e)){if(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 f=m.message,p=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(nh(m)){let h=ih(m);h.trim()&&(c||(c=G(h.trim(),80)),d=G(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(sh(m)){let h=oh(m);if(h&&(i=h),Array.isArray(f.content))for(let g of f.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof f.content=="string")u.push({role:"assistant",timestamp:p,content:f.content,model:h});else if(Array.isArray(f.parts))for(let g of f.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:e,messages:u}}async resolveSessionPath(e){let r=Tr(this.baseDir,"projects");try{let n=await ro(r),s=[];for(let i of n){let o=Tr(r,i,"chats",`${e}.jsonl`);try{return await cR(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=Tr(r,i,"chats"),a;try{a=await ro(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;rh(l,".jsonl").startsWith(e)&&s.push(Tr(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await dR(r),!0}catch{return!1}}}});function Hc(){return new Bc}var Bc,Xc=E(()=>{"use strict";ah();Vt();qr();Lt();Bc=class extends Oe{constructor(){super({provider:new no,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",we,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ji})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as lh,readFile as uR,rm as ch,stat as dh}from"node:fs/promises";import{basename as Jc,join as zt}from"node:path";async function mR(t){let e=await Promise.all(t.map(r=>Le(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function fR(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function uh(t){return t.type==="USER_INPUT"}function mh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function pR(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function fh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function ph(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 _R(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function hR(t){for await(let e of Ye(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=gR(s);if(i)return i}let n=yR(e.content);if(n)return n}return null}function gR(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function yR(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function _h(t){if(t.endsWith(".db"))return Jc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var so,hh=E(()=>{"use strict";hr();so=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||zt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:zt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=zt(this.baseDir,"conversations"),r;try{r=await lh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Jc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return zt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return zt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await dh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await mR([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,c,d=0;if(n){let u=await Ue(n,80);for(let m of u){let f=ph(m.content);if(f&&(a=f),uh(m)){let p=fh(m.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),d++}else mh(m)&&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:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=_h(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of Ye(i)){let u=fR(d.created_at,s.modifiedAt),m=ph(d.content);if(m&&(a=m),uh(d)){let f=fh(d.content),p=f.trim();p&&(l||(l=G(p,80)),c=G(p,80)),o.push({role:"user",timestamp:u,content:f});continue}if(Array.isArray(d.tool_calls))for(let f of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:_R(f.args),toolName:f.name||"tool"});mh(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):pR(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await dh(r),r}catch{}let n=zt(this.baseDir,"conversations");try{let s=[];for(let i of await lh(n)){if(!i.endsWith(".db"))continue;Jc(i,".db").startsWith(e)&&s.push(zt(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=_h(r);return n?(await ch(this.conversationPath(n),{force:!0}),await ch(zt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await hR(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=zt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await uR(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}}});import{spawn as ER}from"node:child_process";function Vc(t){return new Gc(t)}async function wR(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",vR(e.timeoutMs)];e.model&&n.push("--model",e.model),pt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await TR(e.binary,n,{cwd:e.cwd,env:We(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function TR(t,e,r){return new Promise((n,s)=>{let i;try{i=ER(t,e,{cwd:r.cwd,env:r.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(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,m=a.trim()||o.trim();s(new Error(`agy failed (${u})${m?`: ${m}`:""}`))})})}function vR(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Gc,Kc=E(()=>{"use strict";hh();Vt();Lt();ft();vn();Gc=class extends Oe{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",we,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:wR})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as bR}from"node:crypto";import{existsSync as SR,mkdirSync as kR,readFileSync as IR,renameSync as NR,writeFileSync as AR}from"node:fs";import{dirname as Th,join as gh,resolve as Yc}from"node:path";function xR(t){return bR("sha256").update(t).digest("hex").slice(0,8)}function RR(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function LR(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function vh(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function io(t){return Math.max(1,Math.ceil(t.length/4))}function An(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Yc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?gh(Th(Yc(r)),".lmctl-claude-mock","sessions.json"):gh(Yc(t),".lmctl-claude-mock","sessions.json")}function yh(){return{schemaVersion:1,sessions:{}}}function Ms(t){if(!SR(t))return yh();try{let e=JSON.parse(IR(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return yh()}}function bh(t,e){kR(Th(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;AR(r,`${JSON.stringify(e,null,2)}
|
|
1581
|
-
`,"utf8"),NR(r,t)}function OR(t){return{...t,timestamp:t.timestamp.toISOString()}}function $R(t){return{...t,timestamp:new Date(t.timestamp)}}function CR(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(OR)}}function Sh(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map($R)}}function oo(t,e=process.cwd()){let r=Nn.get(t);if(r!==void 0)return r;let s=Ms(An(e)).sessions[t];if(s===void 0)return;let i=Sh(s);return Nn.set(i.sessionId,i),i}function Eh(t){Nn.set(t.sessionId,t);let e=An(t.cwd),r=Ms(e);r.sessions[t.sessionId]=CR({...t,filePath:e}),bh(e,r)}function MR(){let t=Ms(An()),e=Object.values(t.sessions).map(Sh);for(let r of e)Nn.set(r.sessionId,r);return e}function DR(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[vh(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function wh(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 Qc(){return new Zc}var Nn,zc,Zc,ed=E(()=>{"use strict";Nn=new Map;zc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of MR())e.set(r.sessionId,r);for(let r of Nn.values())e.set(r.sessionId,r);return[...e.values()].map(wh)}async loadSession(e){let r=oo(e);return r===void 0?null:{...wh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return oo(e)?.filePath??null}async deleteSession(e){let r=Nn.delete(e),n=An(),s=Ms(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&bh(n,s),r||i}},Zc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new zc;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=RR(LR(e,r)),s=`mock-${n}-${xR(`${e}:${n}`)}`,i=new Date,o=An(e),a=oo(s,e),l=r?.prompt??"ClaudeMock seed",c=io(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+=io("ACK: ClaudeMock seeded"),Eh(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,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=oo(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=Ms(An(r.cwd)),a=DR(e,o)??`ClaudeMock ack: ${vh(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=io(e),s.totalOutputTokens+=io(a),Eh(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ot(t){let e=[vc({claudeDir:t?.claudeDir}),kc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Rc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),$c({copilotDir:t?.copilotDir}),Pc(),Wc({lmplayerDbPath:t?.lmplayerDbPath}),Hc(),Vc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Qc()),e}var td=E(()=>{"use strict";bc();Ic();Lc();Cc();Fc();qc();Xc();Kc();ed();bc();Ic();Lc();Cc();Fc();qc();Xc();Kc();ed()});var id={};pe(id,{ProviderRegistry:()=>Ns,TransportConnectionError:()=>Te,TransportError:()=>ot,TransportJsonError:()=>Fi,TransportProcessError:()=>Kt,TransportRpcError:()=>Yt,_resetDefaultRegistryForTests:()=>jR,chat:()=>$t,countTokens:()=>sd,createAdapterRegistry:()=>Rt,createAllAdapters:()=>Ot,listSessions:()=>nd,seed:()=>rd});function lo(){return ao===null&&(ao=Rt(Ot())),ao}function jR(){ao=null}function Ih(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function $t(t){let e=t.registry??lo(),r=Ih(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function rd(t){let e=t.registry??lo(),r=Ih(e,t.provider),n=await kh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await kh(e,t.provider,t.cwd),a=PR(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function kh(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function PR(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function nd(t={}){return(t.registry??lo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function sd(t){let r=await(t.registry??lo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var ao,Ct=E(()=>{"use strict";ec();td();ec();td();Tn();ao=null});function FR(){return od===null&&(od=Rt(Ot())),od}async function co(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,i;try{return await WR(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)xn.delete(r),e.setMemberState(r,"idle");else{let o=UR(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function UR(t,e){if(!(t instanceof Ie))return xn.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(xn.get(e)??0)+1;return r>=3?(xn.delete(e),"consecutive_timeouts"):(xn.set(e,r),null)}return xn.delete(e),null}async function WR(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=FR(),s;try{let d=await n.resolveSession(t.sessionid);if(!d)return Promise.reject(new Ie("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,ad(t.sessionid,t.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Ie("other",null,`library: session resolution failed: ${Nh(d)}`,ad(t.sessionid,t.sessiondir,"unresolved")))}let i=ad(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await $t({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(d.status==="stalled")throw new Ie("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 Ie("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):qR(d,i)}finally{a!==null&&clearTimeout(a)}}function ad(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Nh(t){return t instanceof Error?t.message:String(t)}function qR(t,e){if(t instanceof Ie)return t;if(t instanceof Te){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ie("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e)}return t instanceof Kt?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Yt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ot?new Ie("other",null,t.message,e):new Ie("other",null,Nh(t),e)}var Ie,od,xn,uo=E(()=>{"use strict";Ct();Ie=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},od=null;xn=new Map});function Ah(){return ld===null&&(ld=Rt(Ot())),ld}function HR(t,e){if(!BR.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Re("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function mo(t){let e=HR(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await XR({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function XR(t){let e=t.member.provider,r=t.member.sessiondir,n=cd("seed",r,e);try{let s=await rd({provider:e,cwd:r,registry:Ah()});if(!s.success)throw GR(s.error,n);if(!s.sessionId)throw new Re("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Re?s:dd(s,n)}}async function xh(t){return JR(t)}async function JR(t){let e=Ah(),r=cd("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Re("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Re?i:dd(i,r)}let s=cd("tokens",t.sessionid,n);try{let i=await sd({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Re?i:dd(i,s)}}function cd(t,e,r){return["<library>",t,e,"--provider",r]}function GR(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Re("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Re("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Re("nonzero_exit",Number(n[1]),r,e)}return new Re("other",null,r,e)}function dd(t,e){return t instanceof Re?t:t instanceof Te?t.cause?.code==="ENOENT"?new Re("enoent",null,t.message,e):new Re("other",null,t.message,e):t instanceof Kt?new Re("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Yt?new Re("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ot?new Re("other",null,t.message,e):new Re("other",null,t instanceof Error?t.message:String(t),e)}var Re,ld,BR,ud=E(()=>{"use strict";Ct();Re=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},ld=null;BR=/^provider[123]$/});function fo(t){return Buffer.from(t,"utf8").toString("base64url")}function js(t){return Buffer.from(t,"base64url").toString("utf8")}async function Rh(t,e=r=>xh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of VR(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function Lh(t,e,r){let n=Oh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Ds(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await co({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:$h(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function md(t,e,r){let n=Oh(t,e,r);if(n===null)throw new Error("session member not found");let s=await mo({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:$h(t,e,r)}}function VR(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Oh(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function $h(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Ds,po=E(()=>{"use strict";uo();ud();Ds=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function fd(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??YR(e),s=r-n,i=e.query(`
|
|
1580
|
+
`):"":""}function oh(t){return t.model||t.message?.model}var no,ah=E(()=>{"use strict";gr();no=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||vr(ke,".qwen")}async discoverSessions(){let e=vr(this.baseDir,"projects"),r;try{r=await ro(e)}catch{return[]}let n=[];for(let s of r){let i=vr(e,s,"chats"),o;try{o=await ro(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=vr(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(e,r){let n=await Ue(e,30);if(n.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),nh(u)){let m=ih(u).trim();m&&(l||(l=G(m,80)),c=G(m,80)),d++}if(sh(u)){let m=oh(u);m&&(o=m),d++}}return{provider:"qwen",sessionId:r,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 r=await this.resolveSessionPath(e);if(!r)return null;let n=rh(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Le(e),s="(unknown)",i,o,a,l,c,d,u=[];for await(let m of Ye(e)){if(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 f=m.message,p=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(nh(m)){let h=ih(m);h.trim()&&(c||(c=G(h.trim(),80)),d=G(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(sh(m)){let h=oh(m);if(h&&(i=h),Array.isArray(f.content))for(let g of f.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof f.content=="string")u.push({role:"assistant",timestamp:p,content:f.content,model:h});else if(Array.isArray(f.parts))for(let g of f.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:e,messages:u}}async resolveSessionPath(e){let r=vr(this.baseDir,"projects");try{let n=await ro(r),s=[];for(let i of n){let o=vr(r,i,"chats",`${e}.jsonl`);try{return await cR(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=vr(r,i,"chats"),a;try{a=await ro(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;rh(l,".jsonl").startsWith(e)&&s.push(vr(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await dR(r),!0}catch{return!1}}}});function Hc(){return new Bc}var Bc,Xc=E(()=>{"use strict";ah();Kt();qr();Ot();Bc=class extends Oe{constructor(){super({provider:new no,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",we,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ji})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as lh,readFile as uR,rm as ch,stat as dh}from"node:fs/promises";import{basename as Jc,join as Zt}from"node:path";async function mR(t){let e=await Promise.all(t.map(r=>Le(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function fR(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function uh(t){return t.type==="USER_INPUT"}function mh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function pR(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function fh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function ph(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 _R(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function hR(t){for await(let e of Ye(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=gR(s);if(i)return i}let n=yR(e.content);if(n)return n}return null}function gR(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function yR(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function _h(t){if(t.endsWith(".db"))return Jc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var so,hh=E(()=>{"use strict";gr();so=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Zt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Zt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Zt(this.baseDir,"conversations"),r;try{r=await lh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Jc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Zt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Zt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await dh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await mR([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,c,d=0;if(n){let u=await Ue(n,80);for(let m of u){let f=ph(m.content);if(f&&(a=f),uh(m)){let p=fh(m.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),d++}else mh(m)&&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:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=_h(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of Ye(i)){let u=fR(d.created_at,s.modifiedAt),m=ph(d.content);if(m&&(a=m),uh(d)){let f=fh(d.content),p=f.trim();p&&(l||(l=G(p,80)),c=G(p,80)),o.push({role:"user",timestamp:u,content:f});continue}if(Array.isArray(d.tool_calls))for(let f of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:_R(f.args),toolName:f.name||"tool"});mh(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):pR(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await dh(r),r}catch{}let n=Zt(this.baseDir,"conversations");try{let s=[];for(let i of await lh(n)){if(!i.endsWith(".db"))continue;Jc(i,".db").startsWith(e)&&s.push(Zt(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=_h(r);return n?(await ch(this.conversationPath(n),{force:!0}),await ch(Zt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await hR(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Zt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await uR(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}}});import{spawn as ER}from"node:child_process";function Vc(t){return new Gc(t)}async function wR(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",vR(e.timeoutMs)];e.model&&n.push("--model",e.model),pt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await TR(e.binary,n,{cwd:e.cwd,env:We(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function TR(t,e,r){return new Promise((n,s)=>{let i;try{i=ER(t,e,{cwd:r.cwd,env:r.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(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,m=a.trim()||o.trim();s(new Error(`agy failed (${u})${m?`: ${m}`:""}`))})})}function vR(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Gc,Kc=E(()=>{"use strict";hh();Kt();Ot();ft();vn();Gc=class extends Oe{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",we,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:wR})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as bR}from"node:crypto";import{existsSync as SR,mkdirSync as kR,readFileSync as IR,renameSync as NR,writeFileSync as AR}from"node:fs";import{dirname as Th,join as gh,resolve as Yc}from"node:path";function xR(t){return bR("sha256").update(t).digest("hex").slice(0,8)}function RR(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function LR(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function vh(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function io(t){return Math.max(1,Math.ceil(t.length/4))}function An(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Yc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?gh(Th(Yc(r)),".lmctl-claude-mock","sessions.json"):gh(Yc(t),".lmctl-claude-mock","sessions.json")}function yh(){return{schemaVersion:1,sessions:{}}}function Ms(t){if(!SR(t))return yh();try{let e=JSON.parse(IR(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return yh()}}function bh(t,e){kR(Th(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;AR(r,`${JSON.stringify(e,null,2)}
|
|
1581
|
+
`,"utf8"),NR(r,t)}function OR(t){return{...t,timestamp:t.timestamp.toISOString()}}function $R(t){return{...t,timestamp:new Date(t.timestamp)}}function CR(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(OR)}}function Sh(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map($R)}}function oo(t,e=process.cwd()){let r=Nn.get(t);if(r!==void 0)return r;let s=Ms(An(e)).sessions[t];if(s===void 0)return;let i=Sh(s);return Nn.set(i.sessionId,i),i}function Eh(t){Nn.set(t.sessionId,t);let e=An(t.cwd),r=Ms(e);r.sessions[t.sessionId]=CR({...t,filePath:e}),bh(e,r)}function MR(){let t=Ms(An()),e=Object.values(t.sessions).map(Sh);for(let r of e)Nn.set(r.sessionId,r);return e}function DR(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[vh(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function wh(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 Qc(){return new Zc}var Nn,zc,Zc,ed=E(()=>{"use strict";Nn=new Map;zc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of MR())e.set(r.sessionId,r);for(let r of Nn.values())e.set(r.sessionId,r);return[...e.values()].map(wh)}async loadSession(e){let r=oo(e);return r===void 0?null:{...wh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return oo(e)?.filePath??null}async deleteSession(e){let r=Nn.delete(e),n=An(),s=Ms(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&bh(n,s),r||i}},Zc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new zc;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=RR(LR(e,r)),s=`mock-${n}-${xR(`${e}:${n}`)}`,i=new Date,o=An(e),a=oo(s,e),l=r?.prompt??"ClaudeMock seed",c=io(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+=io("ACK: ClaudeMock seeded"),Eh(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,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=oo(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=Ms(An(r.cwd)),a=DR(e,o)??`ClaudeMock ack: ${vh(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=io(e),s.totalOutputTokens+=io(a),Eh(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function $t(t){let e=[vc({claudeDir:t?.claudeDir}),kc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Rc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),$c({copilotDir:t?.copilotDir}),Pc(),Wc({lmplayerDbPath:t?.lmplayerDbPath}),Hc(),Vc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Qc()),e}var td=E(()=>{"use strict";bc();Ic();Lc();Cc();Fc();qc();Xc();Kc();ed();bc();Ic();Lc();Cc();Fc();qc();Xc();Kc();ed()});var id={};pe(id,{ProviderRegistry:()=>Ns,TransportConnectionError:()=>Te,TransportError:()=>ot,TransportJsonError:()=>Fi,TransportProcessError:()=>Yt,TransportRpcError:()=>zt,_resetDefaultRegistryForTests:()=>jR,chat:()=>Ct,countTokens:()=>sd,createAdapterRegistry:()=>Lt,createAllAdapters:()=>$t,listSessions:()=>nd,seed:()=>rd});function lo(){return ao===null&&(ao=Lt($t())),ao}function jR(){ao=null}function Ih(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Ct(t){let e=t.registry??lo(),r=Ih(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function rd(t){let e=t.registry??lo(),r=Ih(e,t.provider),n=await kh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await kh(e,t.provider,t.cwd),a=PR(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function kh(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function PR(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function nd(t={}){return(t.registry??lo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function sd(t){let r=await(t.registry??lo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var ao,Mt=E(()=>{"use strict";ec();td();ec();td();Tn();ao=null});function FR(){return od===null&&(od=Lt($t())),od}async function co(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,i;try{return await WR(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)xn.delete(r),e.setMemberState(r,"idle");else{let o=UR(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function UR(t,e){if(!(t instanceof Ie))return xn.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(xn.get(e)??0)+1;return r>=3?(xn.delete(e),"consecutive_timeouts"):(xn.set(e,r),null)}return xn.delete(e),null}async function WR(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=FR(),s;try{let d=await n.resolveSession(t.sessionid);if(!d)return Promise.reject(new Ie("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,ad(t.sessionid,t.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Ie("other",null,`library: session resolution failed: ${Nh(d)}`,ad(t.sessionid,t.sessiondir,"unresolved")))}let i=ad(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await Ct({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(d.status==="stalled")throw new Ie("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 Ie("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):qR(d,i)}finally{a!==null&&clearTimeout(a)}}function ad(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Nh(t){return t instanceof Error?t.message:String(t)}function qR(t,e){if(t instanceof Ie)return t;if(t instanceof Te){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ie("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e)}return t instanceof Yt?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof zt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ot?new Ie("other",null,t.message,e):new Ie("other",null,Nh(t),e)}var Ie,od,xn,uo=E(()=>{"use strict";Mt();Ie=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},od=null;xn=new Map});function Ah(){return ld===null&&(ld=Lt($t())),ld}function HR(t,e){if(!BR.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Re("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function mo(t){let e=HR(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await XR({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function XR(t){let e=t.member.provider,r=t.member.sessiondir,n=cd("seed",r,e);try{let s=await rd({provider:e,cwd:r,registry:Ah()});if(!s.success)throw GR(s.error,n);if(!s.sessionId)throw new Re("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Re?s:dd(s,n)}}async function xh(t){return JR(t)}async function JR(t){let e=Ah(),r=cd("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Re("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Re?i:dd(i,r)}let s=cd("tokens",t.sessionid,n);try{let i=await sd({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Re?i:dd(i,s)}}function cd(t,e,r){return["<library>",t,e,"--provider",r]}function GR(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Re("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Re("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Re("nonzero_exit",Number(n[1]),r,e)}return new Re("other",null,r,e)}function dd(t,e){return t instanceof Re?t:t instanceof Te?t.cause?.code==="ENOENT"?new Re("enoent",null,t.message,e):new Re("other",null,t.message,e):t instanceof Yt?new Re("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof zt?new Re("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ot?new Re("other",null,t.message,e):new Re("other",null,t instanceof Error?t.message:String(t),e)}var Re,ld,BR,ud=E(()=>{"use strict";Mt();Re=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},ld=null;BR=/^provider[123]$/});function fo(t){return Buffer.from(t,"utf8").toString("base64url")}function js(t){return Buffer.from(t,"base64url").toString("utf8")}async function Rh(t,e=r=>xh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of VR(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function Lh(t,e,r){let n=Oh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Ds(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await co({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:$h(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function md(t,e,r){let n=Oh(t,e,r);if(n===null)throw new Error("session member not found");let s=await mo({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:$h(t,e,r)}}function VR(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Oh(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function $h(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Ds,po=E(()=>{"use strict";uo();ud();Ds=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function fd(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??YR(e),s=r-n,i=e.query(`
|
|
1582
1582
|
SELECT
|
|
1583
1583
|
isess.id AS interactive_session_id,
|
|
1584
1584
|
isess.run_id,
|
|
@@ -1622,9 +1622,9 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1622
1622
|
GROUP BY name
|
|
1623
1623
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1624
1624
|
ORDER BY w.name ASC
|
|
1625
|
-
`)}function Fh(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 Uh(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Wh(t,e){return t.getSubmittedPr(e)}function To(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Rn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Jr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:To(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:n0(t,r.id)}}function n0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:qh(t,r.id)}))}function yd(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:qh(t,n.id)}}function qh(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Gr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Bh(t,e,r){let n=yd(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function Hh(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 Xh(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
|
|
1625
|
+
`)}function Fh(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 Uh(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Wh(t,e){return t.getSubmittedPr(e)}function To(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Rn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Jr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:To(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:n0(t,r.id)}}function n0(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:qh(t,r.id)}))}function yd(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:qh(t,n.id)}}function qh(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Gr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function Bh(t,e,r){let n=yd(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function Hh(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 Xh(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 Sr(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 vo(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Jh}
|
|
1626
1626
|
WHERE ${n}
|
|
1627
|
-
ORDER BY a.created_at DESC`,...r).map(Gh)}function
|
|
1627
|
+
ORDER BY a.created_at DESC`,...r).map(Gh)}function Dt(t,e){let n=t.query(`${Jh}
|
|
1628
1628
|
WHERE a.id = ?`,e)[0];return n===void 0?null:Gh(n)}function Gh(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function Vh(t){return t.query(`
|
|
1629
1629
|
SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
|
|
1630
1630
|
FROM run r
|
|
@@ -1710,7 +1710,7 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1710
1710
|
AND acknowledged_at IS NULL
|
|
1711
1711
|
ORDER BY id ASC`,e).map(I=>({kind:I.kind,severity:I.severity,payload:p0(I.payload)})),v=_.map(I=>{let A=m.get(I),X=p.get(I),ge=l0(s,I,y,A,X),U=A===void 0?null:Date.parse(A.started_at),j=A?.ended_at===null||A===void 0?null:Date.parse(A.ended_at),x=A===void 0||Number.isNaN(U??NaN)?null:j!==null&&!Number.isNaN(j)?j-U:ge==="running"||ge==="paused"?n-U:null,te=A===void 0?null:h.get(A.id)??null,B=_0(X?.last_activity_at??null,te,g),k=i===null||X===void 0?void 0:u0(t,s.team_id,i.definition,X.state_name,A?.state_name??I);return{step_id:A?.id??null,state_id:I,status:ge,started_at:A?.started_at??null,ended_at:A?.ended_at??null,last_activity_at:B,elapsed_ms:x,...k!==void 0?{member:k}:{},...X!==void 0?{interactive_session:{id:X.id,status:X.status,turn_count:X.turn_count,state_name:X.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:d0(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:c0(v,s.terminal_state!==null),related_attentions:T}}function ko(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${jh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${Dh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Dh(t.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Io(a.elapsed_ms)}`;if(n.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 ${jh(a.last_activity_at,r)} ago`,m=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${m}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${h0(a.payload)}`)}return`${n.join(`
|
|
1712
1712
|
`)}
|
|
1713
|
-
`}function o0(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function a0(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function l0(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function c0(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function d0(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function u0(t,e,r,n,s){let i=m0(r,n,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ke(o)}}function m0(t,e,r){let n=f0(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>
|
|
1713
|
+
`}function o0(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function a0(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function l0(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function c0(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function d0(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function u0(t,e,r,n,s){let i=m0(r,n,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ke(o)}}function m0(t,e,r){let n=f0(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>br(a)?a.id===e||a.name===e||a.name===r:!1),i=br(s?.members)?s.members:null,o=i!==null&&br(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(br(n.states)){let s=n.states[e]??n.states[r];if(!br(s))return null;let i=br(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function f0(t){try{let e=JSON.parse(t);return br(e)?e:null}catch{return null}}function p0(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function br(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function _0(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Dh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Io(Math.max(0,n-r)).padEnd(6)}]`}function jh(t,e){return Number.isNaN(t)?"?":Io(Math.max(0,e-t))}function Io(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function h0(t){if(!br(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Io(t.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${i}`}var Jh,Qt=E(()=>{"use strict";it();Jh=`SELECT a.id AS attention_id,
|
|
1714
1714
|
a.kind AS kind,
|
|
1715
1715
|
a.severity AS severity,
|
|
1716
1716
|
a.created_at AS created_at,
|
|
@@ -1737,17 +1737,17 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1737
1737
|
`),2):bL(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&xo(r.rest.slice(2)))return e.stdout.write(`${N0}
|
|
1738
1738
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&xo(r.rest.slice(2)))return e.stdout.write(`${A0}
|
|
1739
1739
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?EL(r.rest.slice(2),e):wL(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?TL(r.rest.slice(2),e):vL(r.rest.slice(2),e);if(r.present)return sL(r.rest,e);let n=eg(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1740
|
-
`),2;let s=Vr(e),i=s.baseUrl,o=
|
|
1740
|
+
`),2;let s=Vr(e),i=s.baseUrl,o=kr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=j0(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
|
|
1741
1741
|
`),2}else n.body!==void 0&&n.contentType!==void 0?o["Content-Type"]=n.contentType:n.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,i),{method:n.method,headers:o,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1742
1742
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1743
1743
|
`),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),d=F0(c);if(d===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
|
|
1744
|
-
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${d}/run`,i),{method:"POST",headers:
|
|
1744
|
+
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${d}/run`,i),{method:"POST",headers:kr("application/json",s.token)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
|
|
1745
1745
|
`),2}if(!u.ok)return e.stderr.write(`error: HTTP ${u.status}: ${await u.text()}
|
|
1746
1746
|
`),u.status===400?2:1;let m=await u.json();n.json?e.stdout.write(`${JSON.stringify(m,null,2)}
|
|
1747
1747
|
`):e.stdout.write(`${JSON.stringify(m)}
|
|
1748
1748
|
`)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1749
1749
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1750
|
-
`));return 0}function eg(t){let e=ng(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ao(i,"/api/status",n):s==="projects"?Ao(i,"/api/projects",n):s==="teams"?Ao(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?G0(i.slice(1),e.format):Ao(i,"/api/workflows",n):s==="workflow"?J0(i,n):s==="upload"?H0(i,n):s==="submit-job"?X0(i,n):s==="issues"?B0(i,n):s==="jobs"?Ps(i,"--status","/api/jobs","status",n):s==="job"?q0(i,n):s==="project"?V0(i,n):s==="artifact"?z0(i,n):s==="runs"?Ps(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Ps(i,"--type","/api/external-objects","type",n):s==="external-signals"?zh(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?Z0(i,n):zh(i,"--unacked","/api/attentions","unacked",n):s==="stats"?Q0(i,n):s==="daemon"?eL(i,n):s==="intake"?tL(i,n):s==="session"?rL(i,n):s==="run"?nL(i,e.format):s==="prs"?Ps(i,"--status","/api/submitted-prs","status",n):s==="pr"?U0(i,n):`unknown subcommand: ${s}`}function
|
|
1750
|
+
`));return 0}function eg(t){let e=ng(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ao(i,"/api/status",n):s==="projects"?Ao(i,"/api/projects",n):s==="teams"?Ao(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?G0(i.slice(1),e.format):Ao(i,"/api/workflows",n):s==="workflow"?J0(i,n):s==="upload"?H0(i,n):s==="submit-job"?X0(i,n):s==="issues"?B0(i,n):s==="jobs"?Ps(i,"--status","/api/jobs","status",n):s==="job"?q0(i,n):s==="project"?V0(i,n):s==="artifact"?z0(i,n):s==="runs"?Ps(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Ps(i,"--type","/api/external-objects","type",n):s==="external-signals"?zh(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?Z0(i,n):zh(i,"--unacked","/api/attentions","unacked",n):s==="stats"?Q0(i,n):s==="daemon"?eL(i,n):s==="intake"?tL(i,n):s==="session"?rL(i,n):s==="run"?nL(i,e.format):s==="prs"?Ps(i,"--status","/api/submitted-prs","status",n):s==="pr"?U0(i,n):`unknown subcommand: ${s}`}function kr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Vr(t){if(t.dal!==void 0)return Fs(t.dal,process.env,t);let e=xe({path:ee()});try{return Fs(e,process.env,t)}finally{e.close()}}function Fs(t,e,r){let n=[],s=t.getConfig("api.url"),i;s!==null?i=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(i=e.LMCTL_API_URL,n.push("api.url")):i=w0;let o=t.getConfig("api.token"),a;e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,o===null?n.push("api.token"):o!==a&&r.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
|
|
1751
1751
|
`)):o!==null?a=o:a=null;for(let l of n)r.stderr.write(`note: ${b0(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1752
1752
|
`);return{baseUrl:i,token:a}}function b0(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 S0(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1753
1753
|
`),2;let s=e.dal===void 0,i=e.dal??xe({path:ee()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
@@ -1766,7 +1766,7 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1766
1766
|
`),0;let n=cg(t,"--direct"),s=r||n.present,i=n.rest,[o,...a]=i;return o===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
|
|
1767
1767
|
`),2):s?R0(o,a,e):o==="list"?O0(a,e):o==="show"?C0(a,e):o==="respond"?M0(a,e):(e.stderr.write(`error: unknown api escalations verb: ${o}
|
|
1768
1768
|
`),2)}function xo(t){return t.some(e=>e==="--help"||e==="-h")}function R0(t,e,r){let n=r.dal===void 0,s=r.dal??xe({path:ee()});try{return dg(s,[t,...e],r)}finally{n&&s.close()}}function tg(t){let e,r=!1,n=!1,s;for(let o=0;o<t.length;o+=1){let a=t[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=L0(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return oe(a)}let i={json:r,all:n};return e!==void 0&&(i.project=e),s!==void 0&&(i.since=s),i}function L0(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function O0(t,e){let r=tg(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1769
|
-
`),2;let n=Vr(e),s=
|
|
1769
|
+
`),2;let n=Vr(e),s=kr("application/json",n.token),i=new URLSearchParams;r.project!==void 0&&i.set("project",r.project),r.all&&i.set("all","true"),r.since!==void 0&&i.set("since",r.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1770
1770
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1771
1771
|
`),a.status===400?2:1;let l=await a.json();return rg(l,r.json,e)}function rg(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
|
|
1772
1772
|
`),0;if(t.length===0)return r.stdout.write(`No pending escalations.
|
|
@@ -1780,13 +1780,13 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1780
1780
|
`),r.stdout.write(`
|
|
1781
1781
|
`)}return 0}function $0(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function C0(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
|
|
1782
1782
|
`),2;let n=ae(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1783
|
-
`),2;let s=Vr(e),i=
|
|
1783
|
+
`),2;let s=Vr(e),i=kr("application/json",s.token),o;try{o=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:i})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1784
1784
|
`),1}return o.status===404?(e.stderr.write(`error: escalation not found: ${n}
|
|
1785
1785
|
`),1):o.ok?(e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1786
1786
|
`),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1787
1787
|
`),o.status===400?2:1)}async function M0(t,e){let r=!1,n=!1,s=[];for(let m=0;m<t.length;m+=1){let f=t[m];if(f==="--json"){r=!0;continue}if(f==="--done"){n=!0;continue}s.push(f)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1788
1788
|
`),2;let i=ae(s[0],"attention_id");if(typeof i=="string")return e.stderr.write(`error: ${i}
|
|
1789
|
-
`),2;let o=s[1],a=Vr(e),l=
|
|
1789
|
+
`),2;let o=s[1],a=Vr(e),l=kr("application/json",a.token);l["Content-Type"]="application/json";let c={input:o};n&&(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(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
|
|
1790
1790
|
`),1}if(d.status===404)return e.stderr.write(`error: escalation not found: ${i}
|
|
1791
1791
|
`),1;if(!d.ok){let m=await d.text();return e.stderr.write(`error: HTTP ${d.status}: ${m}
|
|
1792
1792
|
`),d.status===400?2:1}let u=await d.json();return r?e.stdout.write(`${JSON.stringify(u,null,2)}
|
|
@@ -1836,7 +1836,7 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1836
1836
|
`):e.stdout.write(bo(a)),0)}finally{i&&o.close()}}async function wL(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
|
|
1837
1837
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1838
1838
|
`),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${oe(c)}
|
|
1839
|
-
`),2}let i=Vr(e),a=
|
|
1839
|
+
`),2}let i=Vr(e),a=kr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,i.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1840
1840
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1841
1841
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1842
1842
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
@@ -1848,29 +1848,29 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1848
1848
|
`):e.stdout.write(ko(a)),0)}finally{i&&o.close()}}async function vL(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
|
|
1849
1849
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1850
1850
|
`),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${oe(c)}
|
|
1851
|
-
`),2}let i=Vr(e),a=
|
|
1851
|
+
`),2}let i=Vr(e),a=kr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,i.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
|
|
1852
1852
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1853
1853
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1854
1854
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1855
1855
|
`),l.status===404?1:l.status===400?2:1)}async function bL(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${oe(a)}
|
|
1856
|
-
`),2}let n=Vr(e),i=
|
|
1856
|
+
`),2}let n=Vr(e),i=kr(r?"application/json":"text/plain",n.token),o;try{o=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:i})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1857
1857
|
`),2}return o.ok?(r?e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1858
1858
|
`):(e.stdout.write(await o.text()),o.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1859
1859
|
`)),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1860
1860
|
`),o.status===400?2:1)}function SL(t,e,r,n){let s=!1;for(let i of e){if(i==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${oe(i)}
|
|
1861
|
-
`),2}return et(r,
|
|
1861
|
+
`),2}return et(r,Sr(t,{unacked:s}),n),0}function dg(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1862
1862
|
`),2;if(n==="list"){let i=tg(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1863
1863
|
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=vo(t,o);return rg(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
|
|
1864
1864
|
`),2;let o=ae(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1865
|
-
`),2;let a=
|
|
1865
|
+
`),2;let a=Dt(t,o);return a===null?(r.stderr.write(`error: escalation not found: ${o}
|
|
1866
1866
|
`),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1867
1867
|
`),0)}return n==="respond"?kL(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
|
|
1868
1868
|
`),2)}function kL(t,e,r){let n=!1,s=!1,i=[];for(let f of e){if(f==="--json"){n=!0;continue}if(f==="--done"){s=!0;continue}i.push(f)}if(i.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1869
1869
|
`),2;let o=ae(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1870
|
-
`),2;let a=i[1],l=
|
|
1871
|
-
`),1;let c=
|
|
1870
|
+
`),2;let a=i[1],l=Dt(t,o);if(l===null)return r.stderr.write(`error: escalation not found: ${o}
|
|
1871
|
+
`),1;let c=Sr(t).find(f=>f.id===o);if(c===void 0)return r.stderr.write(`error: escalation not found: ${o}
|
|
1872
1872
|
`),1;if(c.kind==="workflow_escalation"){let f=t.resumeEscalation(o,a);if(!f.resumed)return r.stderr.write(`error: escalation resume failed: ${f.reason} (attention=${o})
|
|
1873
|
-
`),2;let p=
|
|
1873
|
+
`),2;let p=Sr(t).find(g=>g.id===o),h={ok:!0,attention_id:o,run_id:f.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
|
|
1874
1874
|
`):r.stdout.write(`ok: attention ${o} acknowledged; run ${f.run.id} resumed with decision "${a}"
|
|
1875
1875
|
`),0}if(c.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${o} is kind=${c.kind}, not interactive_waiting_operator
|
|
1876
1876
|
`),2;if(c.acknowledged_at!==null)return r.stderr.write(`error: attention ${o} is already acknowledged (${c.acknowledged_at})
|
|
@@ -1878,7 +1878,7 @@ ${r}`:r}function $_(t,e){let r=Tx({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
|
|
|
1878
1878
|
`),2;let d=t.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
|
|
1879
1879
|
`),2;let u=t.acknowledgeAttention(o),m={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(m,null,2)}
|
|
1880
1880
|
`):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${m.session_status})
|
|
1881
|
-
`),0}function Zh(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var w0,T0,Qh,No,I0,N0,A0,x0,mL,vd=E(()=>{"use strict";it();Fe();po();_d();
|
|
1881
|
+
`),0}function Zh(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var w0,T0,Qh,No,I0,N0,A0,x0,mL,vd=E(()=>{"use strict";it();Fe();po();_d();Qt();w0="http://127.0.0.1:8787",T0=`usage: lmctl api [--direct] <subcommand> ...
|
|
1882
1882
|
|
|
1883
1883
|
Call the lmctl HTTP API using the configured daemon URL/token (see
|
|
1884
1884
|
\`api config\`). Most subcommands require a running \`lmctl serve\`.
|
|
@@ -2017,13 +2017,13 @@ and \`lmctl api escalations\` (no args) print detailed usage.
|
|
|
2017
2017
|
|
|
2018
2018
|
Verify every workflows/*.compound.json file: load/validate the workflow graph
|
|
2019
2019
|
and report the first step that would be started. Default output is the TTY
|
|
2020
|
-
table; --json emits the structured WorkflowVerifyReport payload.`;mL=["open","assigned","closed","reopened"]});import mg from"jexl";function On(t){mg.compile(fg(t))}async function Kr(t,e){return mg.eval(fg(t),e)}function fg(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Us=E(()=>{"use strict"});import{z as w}from"zod";function xd(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var IL,pg,bd,Sd,kd,Id,Nd,Ad,_g,NL,AL,xL,Ws,RL,Ro,Lo,Oo,$o,Co,hg,LL,OL,$L,CL,Mo,$n=E(()=>{"use strict";Us();IL=w.object({kind:w.enum(["success","neutral","failure"])}),pg=w.enum(["string","number","boolean","object","array"]),bd=w.object({name:w.string().min(1),type:pg,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),Sd=w.object({name:w.string().min(1),type:pg,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),kd=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Id="__failure__",Nd=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Ad=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),_g=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),NL=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),AL=w.union([w.string().min(1),NL]),xL=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),Ws=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(AL).optional(),skills:w.array(xL).optional()}),RL=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),Ro=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:Ws,pre_checks:w.array(RL).optional(),reviewers:w.array(Ws.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Lo=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(Ws.extend({topic:w.string().min(1)})).optional(),consolidator:Ws,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),Oo=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:Ws.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),$o=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),Co=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),hg=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{On(xd(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),LL=w.discriminatedUnion("type",[_g,Ro,Lo,Oo,$o,Co,hg]),OL=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:LL,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{On(xd(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),$L=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{On(xd(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),CL=w.discriminatedUnion("type",[_g,Ro,Lo,Oo,$o,Co,hg,OL,$L]),Mo=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),CL),terminals:w.record(w.string().min(1),IL),errors:Ad,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(bd).optional(),outputs:w.array(Sd).optional(),triggers:w.array(kd).optional(),read_only:w.boolean().optional(),requires:Nd}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z}from"zod";var ML,Do,DL,jL,PL,Dt,Cn=E(()=>{"use strict";$n();ML=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Do=z.string().regex(ML),DL=z.object({step_id:Do,type:z.literal("main"),index:z.number().int().min(0)}),jL=z.record(Do,z.record(z.string().min(1),z.array(z.array(DL)))),PL=z.object({id:Do,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),Dt=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:Ad,inputs:z.array(bd).optional(),outputs:z.array(Sd).optional(),steps:z.array(PL).min(1),connections:jL.default({}),entry_step_id:Do,triggers:z.array(kd).optional(),read_only:z.boolean().optional(),requires:Nd}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function jo(t){return Ld(t)}function Ld(t){if(Array.isArray(t))return t.map(Ld);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Ld(e[n]);if(typeof r.type=="string"){let n=UL[r.type];n!==void 0&&(r.type=n)}return r}var Rd,FL,UL,Od=E(()=>{"use strict";Rd="lmctl.builtin.",FL={Review:`${Rd}Review`,Research:`${Rd}Research`,Consolidate:`${Rd}Consolidate`},UL=Object.fromEntries(Object.entries(FL).map(([t,e])=>[e,t]))});import{readFileSync as WL}from"node:fs";function Eg(t){return qL(t)}function qL(t){let e=jo(XL(t));if(HL(e),wg(e)===3)return BL(e);let r=Mo.safeParse(e);if(!r.success)throw new Qt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=JL(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Qt(n);return r.data}function BL(t){let e=Dt.safeParse(t);if(!e.success)throw new Qt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function HL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=wg(t);if(!(e===null||gg.includes(e)))throw new Qt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${gg.join(", ")}`}]})}function wg(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 XL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2021
|
-
`)||e.startsWith("{")||e.startsWith("[")?yg(t,"$"):e.endsWith(".json")?yg(WL(e,"utf8"),e):t}function yg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new
|
|
2022
|
-
`),s=[];for(let k=0;k<n.length;k+=1){let L=tO(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],m,f={},p=new Map,h=new Map,g=new Map,_=(k,N,L,W,P,D)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:W,isTerminal:P,...D?{members:D}:{}}),d.push(k)},y=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(W===null)break;N.push({label:W[1],dst:W[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],W=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let P=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),D=kr(P[1],N,r);for(let Q of Object.keys(D))kg.has(Q)||r(N,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...kg].join(", ")} (no grammar inflation; bounded)`);f=D;continue}if(W==="step"){let P=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),D=P[1],Q=P[2],Ee=P[3],ce=Sg[Q];ce===void 0&&r(N,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(Sg).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:qt}=ZL(ce,kr(Ee,N,r));_(D,ce,be,N,!1,Object.keys(qt).length>0?qt:void 0);continue}if(W==="trigger"){let P=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),D=P[1],Q=P[2],Ee=P[3],ce=Ig[Q];ce===void 0&&r(N,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(Ig).join(", ")})`),p.has(D)&&r(N,`duplicate trigger id: ${D}`),p.set(D,{id:D,type:ce,parameters:kr(Ee,N,r)});continue}if(W==="mcp"||W==="skill"){let P=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${L}`),D=P[1],Q=P[2].trim(),Ee=W==="mcp"?h:g;Ee.has(D)&&r(N,`duplicate ${W} declaration: ${D}`);let ce;if(Q.startsWith("{")){let be=kr(Q,N,r);W==="mcp"?ce={...be,name:D}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${D}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ce={name:D,content:be.content})}else{let be=Ag(Q);(typeof be!="string"||be.length===0)&&r(N,`\`${W} ${D}\`: string form must be a non-empty file path or http(s) URL`),ce=be}Ee.set(D,ce);continue}if(W==="terminal"){let P=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(P[1],"lmctl/terminal",{name:P[2],kind:P[3]??"neutral"},N,!0);continue}if(W==="seq"){let D=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(D.length<3||D.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let Q=0;Q+2<D.length+1&&!(Q+2>D.length-1);Q+=2){let Ee=D[Q],ce=D[Q+1],be=D[Q+2],qt=ce==="->"?"main":ce.slice(1,-2);c.push({srcDeclId:Ee,port:qt,dstDeclId:be,line:N})}continue}if(W==="choice"){let D=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],Q=[],Ee,ce=k+1;for(;ce<s.length;ce+=1){let be=s[ce].text,qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(qt!==null){Ee!==void 0&&r(s[ce].n,`\`choice ${D}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let cs=qt[2];Q.push({when:qt[1].trim(),next:`@terminal:${cs}`}),c.push({srcDeclId:D,port:cs,dstDeclId:qt[3],line:s[ce].n});continue}let Nl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Nl!==null){Ee!==void 0&&r(s[ce].n,`\`choice ${D}\` has more than one \`default\``);let cs=Nl[1];Ee=`@terminal:${cs}`,c.push({srcDeclId:D,port:cs,dstDeclId:Nl[2],line:s[ce].n});continue}break}Q.length===0&&r(N,`\`choice ${D}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(D,"lmctl/choice",{branches:Q,...Ee!==void 0?{default_next:Ee}:{}},N,!1),k=ce-1;continue}if(W==="loop"){let P=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(P[1],"lmctl/loop",kr(P[2],N,r),N,!1);continue}if(W==="foreach"){let P=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),D=kr(P[2],N,r);"mode"in D&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(P[1],"lmctl/foreach",D,N,!1);continue}if(W==="call"){let P=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),D=P[1],Q=kr(P[2],N,r),Ee=Q.workflow;(typeof Ee!="string"||Ee.length===0)&&r(N,`\`call ${D}\` requires a \`workflow=<name>\` argument`);let{workflow:ce,...be}=Q;_(D,"lmctl/subflow",{workflow_name:Ee,...be},N,!1),u.push({declId:D,target:Ee,line:N});continue}if(W==="decide"){let P=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),D=P[1],Q=kr(P[2],N,r),{branches:Ee,nextIdx:ce}=y(k);Ee.length===0&&r(N,`\`decide ${D}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(D,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Q});for(let be of Ee)c.push({srcDeclId:D,port:be.label,dstDeclId:be.dst,line:N});k=ce;continue}if(W==="entry"){let P=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);m!==void 0&&r(N,`duplicate \`entry\` (already set to ${m})`),m=P[1];continue}r(N,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),m===void 0&&(m=d[0]),l.has(m)||r(s[0].n,`entry references undeclared step: ${m}`);let T=k=>{if(Array.isArray(k)){for(let L of k)T(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,W]of[["mcp",h],["skills",g]]){let P=N[L];Array.isArray(P)&&(N[L]=P.map(D=>typeof D=="string"&&W.has(D)?structuredClone(W.get(D)):D))}for(let L of Object.values(N))T(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&T(N.members)}let v=k=>vg(o,k),I=d.map(k=>{let N=l.get(k);return{id:v(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),A={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=v(k.srcDeclId);A[N]??={},A[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),A[N][k.port]=[[{step_id:v(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);QL.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let X=new Map;for(let k of c){let N=X.get(k.srcDeclId);N===void 0?X.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let W=X.get(k);W===void 0?X.set(k,[L]):W.push(L)}}let ge=new Set([m]),U=[m];for(;U.length>0;){let k=U.shift();for(let N of X.get(k)??[])ge.has(N)||(ge.add(N),U.push(N))}for(let k of d)ge.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${m}\``);let j=new Map;for(let k of c){let N=j.get(k.srcDeclId);N===void 0&&(N=new Set,j.set(k.srcDeclId,N)),N.add(k.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=j.get(k)??new Set;if(N.type==="lmctl/review"){let P=[...L].some(D=>!x.has(D));!L.has("approve")&&!P&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let W=eO[N.type];if(W!==void 0)for(let P of W)L.has(P)||r(N.line,`uncovered outcome: required outcome \`${P}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${P}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=YL[N.type];if(L===void 0)continue;let W={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},P=L.schema.safeParse(W);if(!P.success){let D=P.error.issues[0],Q=D.path.length===0?"$":D.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${Q}\`: ${D.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let te={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...f,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:A,entry_step_id:v(m)},B=Dt.safeParse(te);if(!B.success)throw new Mn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function tO(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function kr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of rO(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=Ag(l)}return s}function rO(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ag(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 YL,zL,Sg,Mn,QL,eO,kg,Ig,xg=E(()=>{"use strict";Cn();bg();$n();YL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ro},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Lo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Oo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:$o},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Co}},zL={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Sg={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"},Mn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2020
|
+
table; --json emits the structured WorkflowVerifyReport payload.`;mL=["open","assigned","closed","reopened"]});import mg from"jexl";function On(t){mg.compile(fg(t))}async function Kr(t,e){return mg.eval(fg(t),e)}function fg(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Us=E(()=>{"use strict"});import{z as w}from"zod";function xd(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var IL,pg,bd,Sd,kd,Id,Nd,Ad,_g,NL,AL,xL,Ws,RL,Ro,Lo,Oo,$o,Co,hg,LL,OL,$L,CL,Mo,$n=E(()=>{"use strict";Us();IL=w.object({kind:w.enum(["success","neutral","failure"])}),pg=w.enum(["string","number","boolean","object","array"]),bd=w.object({name:w.string().min(1),type:pg,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),Sd=w.object({name:w.string().min(1),type:pg,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),kd=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Id="__failure__",Nd=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Ad=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),_g=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),NL=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),AL=w.union([w.string().min(1),NL]),xL=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),Ws=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(AL).optional(),skills:w.array(xL).optional()}),RL=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),Ro=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:Ws,pre_checks:w.array(RL).optional(),reviewers:w.array(Ws.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Lo=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(Ws.extend({topic:w.string().min(1)})).optional(),consolidator:Ws,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),Oo=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:Ws.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),$o=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),Co=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),hg=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{On(xd(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),LL=w.discriminatedUnion("type",[_g,Ro,Lo,Oo,$o,Co,hg]),OL=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:LL,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{On(xd(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),$L=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{On(xd(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),CL=w.discriminatedUnion("type",[_g,Ro,Lo,Oo,$o,Co,hg,OL,$L]),Mo=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),CL),terminals:w.record(w.string().min(1),IL),errors:Ad,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(bd).optional(),outputs:w.array(Sd).optional(),triggers:w.array(kd).optional(),read_only:w.boolean().optional(),requires:Nd}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z}from"zod";var ML,Do,DL,jL,PL,jt,Cn=E(()=>{"use strict";$n();ML=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Do=z.string().regex(ML),DL=z.object({step_id:Do,type:z.literal("main"),index:z.number().int().min(0)}),jL=z.record(Do,z.record(z.string().min(1),z.array(z.array(DL)))),PL=z.object({id:Do,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),jt=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:Ad,inputs:z.array(bd).optional(),outputs:z.array(Sd).optional(),steps:z.array(PL).min(1),connections:jL.default({}),entry_step_id:Do,triggers:z.array(kd).optional(),read_only:z.boolean().optional(),requires:Nd}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function jo(t){return Ld(t)}function Ld(t){if(Array.isArray(t))return t.map(Ld);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Ld(e[n]);if(typeof r.type=="string"){let n=UL[r.type];n!==void 0&&(r.type=n)}return r}var Rd,FL,UL,Od=E(()=>{"use strict";Rd="lmctl.builtin.",FL={Review:`${Rd}Review`,Research:`${Rd}Research`,Consolidate:`${Rd}Consolidate`},UL=Object.fromEntries(Object.entries(FL).map(([t,e])=>[e,t]))});import{readFileSync as WL}from"node:fs";function Eg(t){return qL(t)}function qL(t){let e=jo(XL(t));if(HL(e),wg(e)===3)return BL(e);let r=Mo.safeParse(e);if(!r.success)throw new er({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=JL(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new er(n);return r.data}function BL(t){let e=jt.safeParse(t);if(!e.success)throw new er({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function HL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=wg(t);if(!(e===null||gg.includes(e)))throw new er({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${gg.join(", ")}`}]})}function wg(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 XL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2021
|
+
`)||e.startsWith("{")||e.startsWith("[")?yg(t,"$"):e.endsWith(".json")?yg(WL(e,"utf8"),e):t}function yg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new er({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function JL(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),GL(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function GL(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var gg,er,Tg=E(()=>{"use strict";$n();Cn();Od();gg=[1,2,3],er=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 VL}from"node:crypto";function vg(t,e){let r=KL(e),n=VL("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function KL(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var bg=E(()=>{"use strict";Cn()});function ZL(t,e){let r=zL[t]??[],n={},s={};for(let[i,o]of Object.entries(e))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function Ng(t){let e=[],r=(k,N)=>{throw new Mn([{line:k,message:N}])},n=t.split(`
|
|
2022
|
+
`),s=[];for(let k=0;k<n.length;k+=1){let L=tO(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],m,f={},p=new Map,h=new Map,g=new Map,_=(k,N,L,W,P,D)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:W,isTerminal:P,...D?{members:D}:{}}),d.push(k)},y=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(W===null)break;N.push({label:W[1],dst:W[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],W=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let P=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),D=Ir(P[1],N,r);for(let Q of Object.keys(D))kg.has(Q)||r(N,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...kg].join(", ")} (no grammar inflation; bounded)`);f=D;continue}if(W==="step"){let P=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),D=P[1],Q=P[2],Ee=P[3],ce=Sg[Q];ce===void 0&&r(N,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(Sg).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Bt}=ZL(ce,Ir(Ee,N,r));_(D,ce,be,N,!1,Object.keys(Bt).length>0?Bt:void 0);continue}if(W==="trigger"){let P=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),D=P[1],Q=P[2],Ee=P[3],ce=Ig[Q];ce===void 0&&r(N,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(Ig).join(", ")})`),p.has(D)&&r(N,`duplicate trigger id: ${D}`),p.set(D,{id:D,type:ce,parameters:Ir(Ee,N,r)});continue}if(W==="mcp"||W==="skill"){let P=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${L}`),D=P[1],Q=P[2].trim(),Ee=W==="mcp"?h:g;Ee.has(D)&&r(N,`duplicate ${W} declaration: ${D}`);let ce;if(Q.startsWith("{")){let be=Ir(Q,N,r);W==="mcp"?ce={...be,name:D}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${D}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ce={name:D,content:be.content})}else{let be=Ag(Q);(typeof be!="string"||be.length===0)&&r(N,`\`${W} ${D}\`: string form must be a non-empty file path or http(s) URL`),ce=be}Ee.set(D,ce);continue}if(W==="terminal"){let P=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(P[1],"lmctl/terminal",{name:P[2],kind:P[3]??"neutral"},N,!0);continue}if(W==="seq"){let D=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(D.length<3||D.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let Q=0;Q+2<D.length+1&&!(Q+2>D.length-1);Q+=2){let Ee=D[Q],ce=D[Q+1],be=D[Q+2],Bt=ce==="->"?"main":ce.slice(1,-2);c.push({srcDeclId:Ee,port:Bt,dstDeclId:be,line:N})}continue}if(W==="choice"){let D=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],Q=[],Ee,ce=k+1;for(;ce<s.length;ce+=1){let be=s[ce].text,Bt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Bt!==null){Ee!==void 0&&r(s[ce].n,`\`choice ${D}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let cs=Bt[2];Q.push({when:Bt[1].trim(),next:`@terminal:${cs}`}),c.push({srcDeclId:D,port:cs,dstDeclId:Bt[3],line:s[ce].n});continue}let Nl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Nl!==null){Ee!==void 0&&r(s[ce].n,`\`choice ${D}\` has more than one \`default\``);let cs=Nl[1];Ee=`@terminal:${cs}`,c.push({srcDeclId:D,port:cs,dstDeclId:Nl[2],line:s[ce].n});continue}break}Q.length===0&&r(N,`\`choice ${D}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(D,"lmctl/choice",{branches:Q,...Ee!==void 0?{default_next:Ee}:{}},N,!1),k=ce-1;continue}if(W==="loop"){let P=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(P[1],"lmctl/loop",Ir(P[2],N,r),N,!1);continue}if(W==="foreach"){let P=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),D=Ir(P[2],N,r);"mode"in D&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(P[1],"lmctl/foreach",D,N,!1);continue}if(W==="call"){let P=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),D=P[1],Q=Ir(P[2],N,r),Ee=Q.workflow;(typeof Ee!="string"||Ee.length===0)&&r(N,`\`call ${D}\` requires a \`workflow=<name>\` argument`);let{workflow:ce,...be}=Q;_(D,"lmctl/subflow",{workflow_name:Ee,...be},N,!1),u.push({declId:D,target:Ee,line:N});continue}if(W==="decide"){let P=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),D=P[1],Q=Ir(P[2],N,r),{branches:Ee,nextIdx:ce}=y(k);Ee.length===0&&r(N,`\`decide ${D}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(D,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Q});for(let be of Ee)c.push({srcDeclId:D,port:be.label,dstDeclId:be.dst,line:N});k=ce;continue}if(W==="entry"){let P=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);m!==void 0&&r(N,`duplicate \`entry\` (already set to ${m})`),m=P[1];continue}r(N,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),m===void 0&&(m=d[0]),l.has(m)||r(s[0].n,`entry references undeclared step: ${m}`);let T=k=>{if(Array.isArray(k)){for(let L of k)T(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,W]of[["mcp",h],["skills",g]]){let P=N[L];Array.isArray(P)&&(N[L]=P.map(D=>typeof D=="string"&&W.has(D)?structuredClone(W.get(D)):D))}for(let L of Object.values(N))T(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&T(N.members)}let v=k=>vg(o,k),I=d.map(k=>{let N=l.get(k);return{id:v(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),A={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=v(k.srcDeclId);A[N]??={},A[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),A[N][k.port]=[[{step_id:v(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);QL.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let X=new Map;for(let k of c){let N=X.get(k.srcDeclId);N===void 0?X.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let W=X.get(k);W===void 0?X.set(k,[L]):W.push(L)}}let ge=new Set([m]),U=[m];for(;U.length>0;){let k=U.shift();for(let N of X.get(k)??[])ge.has(N)||(ge.add(N),U.push(N))}for(let k of d)ge.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${m}\``);let j=new Map;for(let k of c){let N=j.get(k.srcDeclId);N===void 0&&(N=new Set,j.set(k.srcDeclId,N)),N.add(k.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=j.get(k)??new Set;if(N.type==="lmctl/review"){let P=[...L].some(D=>!x.has(D));!L.has("approve")&&!P&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let W=eO[N.type];if(W!==void 0)for(let P of W)L.has(P)||r(N.line,`uncovered outcome: required outcome \`${P}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${P}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=YL[N.type];if(L===void 0)continue;let W={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},P=L.schema.safeParse(W);if(!P.success){let D=P.error.issues[0],Q=D.path.length===0?"$":D.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${Q}\`: ${D.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let te={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...f,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:A,entry_step_id:v(m)},B=jt.safeParse(te);if(!B.success)throw new Mn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function tO(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function Ir(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of rO(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=Ag(l)}return s}function rO(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ag(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 YL,zL,Sg,Mn,QL,eO,kg,Ig,xg=E(()=>{"use strict";Cn();bg();$n();YL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ro},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Lo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Oo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:$o},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Co}},zL={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Sg={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"},Mn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2023
2023
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
2024
2024
|
`)}`),this.issues=e,this.name="DslCompileError"}},QL=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"]),eO={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},kg=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Ig={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as nO}from"node:fs";function sO(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function iO(t){for(let e of t.split(`
|
|
2025
|
-
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ht(t){if(typeof t=="string"&&sO()&&iO(t)){let r;try{r=Ng(t)}catch(s){throw s instanceof Mn?new
|
|
2026
|
-
`)||e.startsWith("{")||e.startsWith("[")?Rg(t):e.endsWith(".json")?Rg(nO(e,"utf8")):t}function Rg(t){return JSON.parse(t)}function lO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var $d,er,qs=E(()=>{"use strict";$n();Tg();Od();Cn();xg();$d=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},er=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Po(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:cO(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:uO(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function cO(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=dO(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function dO(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function uO(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Cd=E(()=>{"use strict"});var Lg={};pe(Lg,{enqueueFromAgentOutput:()=>fO,enqueueFromGitHubIssue:()=>Md,enqueueManual:()=>mO,enqueueScheduled:()=>pO});function Md(t,e){return Uo(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:Fo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function mO(t,e){return Uo(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:Fo(e.payload),concurrency_key:e.concurrency_key})}function fO(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Uo(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Fo(e.payload),concurrency_key:e.concurrency_key})}function pO(t,e){return Uo(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:Fo(e.payload),concurrency_key:e.concurrency_key})}function Fo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Uo(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let i=ht(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=Po({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Dd=E(()=>{"use strict";qs();Cd()});async function $g(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Og(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let i of e){if(!await _O(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...hO(i.parameters_override)},l=Og(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function Og(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Md(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function _O(t,e){if(t===null||t.trim().length===0)return!0;try{return await Kr(t,e)===!0}catch{return!1}}function hO(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 Cg=E(()=>{"use strict";Us();Dd()});import{spawnSync as gO}from"node:child_process";async function yO(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=gO(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!wO(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await $g({dal:t.dal,project:t.project,issue:TO(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function Wo(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=EO(r.intake_config);try{let s=await yO({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return e}function EO(t){if(t===null)return{};try{let e=JSON.parse(t);if(!jd(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function wO(t){return Array.isArray(t)&&t.every(e=>{if(!jd(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:jd(n)&&typeof n.name=="string"))})}function TO(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function jd(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Pd=E(()=>{"use strict";Cg()});function Dg(t){return async e=>bO(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bO(t,e,r={}){let n=SO(e.path),s={"content-type":"application/json",...e.headers??{},[qo]:Fd},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),c=await kO(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Mg(e.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Mg(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Mg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function SO(t){let e=t.startsWith("/")?t:`/${t}`;return`${vO}${e}`}async function kO(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((i,o)=>{o.toLowerCase()!==qo&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var qo,Fd,vO,Ud=E(()=>{"use strict";qo="x-mailbox-channel",Fd="1",vO="http://mailbox.local"});import{createHash as jg,createHmac as IO,timingSafeEqual as NO}from"node:crypto";function Pg(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=Fg();if(n===null||OO(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(qo)===Fd){await r();return}let s=e.req.query("token");if(s!==void 0&&Bo(s,n)){qd(e,n),await r();return}if(LO(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Fg(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Ug(t){let e=Fg();return e!==null&&Bo(t,e)}function qd(t,e,r=new Date){t.header("Set-Cookie",`${Wd}=${xO(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Wg(t){t.header("Set-Cookie",`${Wd}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function xO(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+AO*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${qg(t,n)}`,"utf8").toString("base64url")}function RO(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:Bo(s[2],qg(e,`${s[0]}|${s[1]}`))}function Bo(t,e){return NO(jg("sha256").update(t).digest(),jg("sha256").update(e).digest())}function LO(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Bo(r,e))return!0;let n=$O(t.req.header("cookie")??"")[Wd];return n!==void 0&&RO(n,e)}function OO(t){return t==="/login"||t==="/logout"}function $O(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function qg(t,e){return IO("sha256",t).update(e).digest("hex")}var Wd,AO,Bg=E(()=>{"use strict";Ud();Wd="lmctl_next_session",AO=30});import{existsSync as Dn,mkdirSync as CO,readdirSync as MO,readFileSync as Ho,unlinkSync as DO,writeFileSync as Xd}from"node:fs";import{join as Yr}from"node:path";function lt(t){if(!jO.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Xg(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return WO(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Hg,updated_at:Hg}:null}function PO(t,e,r,n){let s=r!==null?`
|
|
2025
|
+
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ht(t){if(typeof t=="string"&&sO()&&iO(t)){let r;try{r=Ng(t)}catch(s){throw s instanceof Mn?new tr(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=jt.safeParse(r);if(!n.success)throw new tr(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=jo(aO(t));if(lO(e)&&e.definition_schema_version===3){let r=jt.safeParse(e);if(!r.success)throw new tr(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return oO(e)}function oO(t){let e=Mo.safeParse(t);if(!e.success)throw new tr(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new tr([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return Eg(r)}catch(s){throw s instanceof er?new $d(s):s}}function aO(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2026
|
+
`)||e.startsWith("{")||e.startsWith("[")?Rg(t):e.endsWith(".json")?Rg(nO(e,"utf8")):t}function Rg(t){return JSON.parse(t)}function lO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var $d,tr,qs=E(()=>{"use strict";$n();Tg();Od();Cn();xg();$d=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},tr=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Po(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:cO(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:uO(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function cO(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=dO(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function dO(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function uO(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Cd=E(()=>{"use strict"});var Lg={};pe(Lg,{enqueueFromAgentOutput:()=>fO,enqueueFromGitHubIssue:()=>Md,enqueueManual:()=>mO,enqueueScheduled:()=>pO});function Md(t,e){return Uo(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:Fo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function mO(t,e){return Uo(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:Fo(e.payload),concurrency_key:e.concurrency_key})}function fO(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Uo(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Fo(e.payload),concurrency_key:e.concurrency_key})}function pO(t,e){return Uo(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:Fo(e.payload),concurrency_key:e.concurrency_key})}function Fo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Uo(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let i=ht(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=Po({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Dd=E(()=>{"use strict";qs();Cd()});async function $g(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Og(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let i of e){if(!await _O(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...hO(i.parameters_override)},l=Og(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function Og(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Md(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function _O(t,e){if(t===null||t.trim().length===0)return!0;try{return await Kr(t,e)===!0}catch{return!1}}function hO(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 Cg=E(()=>{"use strict";Us();Dd()});import{spawnSync as gO}from"node:child_process";async function yO(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=gO(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!wO(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await $g({dal:t.dal,project:t.project,issue:TO(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function Wo(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=EO(r.intake_config);try{let s=await yO({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return e}function EO(t){if(t===null)return{};try{let e=JSON.parse(t);if(!jd(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function wO(t){return Array.isArray(t)&&t.every(e=>{if(!jd(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:jd(n)&&typeof n.name=="string"))})}function TO(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function jd(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Pd=E(()=>{"use strict";Cg()});function Dg(t){return async e=>bO(t.app,e,t.log!==void 0?{log:t.log}:{})}async function bO(t,e,r={}){let n=SO(e.path),s={"content-type":"application/json",...e.headers??{},[qo]:Fd},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),c=await kO(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Mg(e.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Mg(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Mg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function SO(t){let e=t.startsWith("/")?t:`/${t}`;return`${vO}${e}`}async function kO(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((i,o)=>{o.toLowerCase()!==qo&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var qo,Fd,vO,Ud=E(()=>{"use strict";qo="x-mailbox-channel",Fd="1",vO="http://mailbox.local"});import{createHash as jg,createHmac as IO,timingSafeEqual as NO}from"node:crypto";function Pg(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=Fg();if(n===null||OO(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(qo)===Fd){await r();return}let s=e.req.query("token");if(s!==void 0&&Bo(s,n)){qd(e,n),await r();return}if(LO(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Fg(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Ug(t){let e=Fg();return e!==null&&Bo(t,e)}function qd(t,e,r=new Date){t.header("Set-Cookie",`${Wd}=${xO(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Wg(t){t.header("Set-Cookie",`${Wd}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function xO(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+AO*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${qg(t,n)}`,"utf8").toString("base64url")}function RO(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:Bo(s[2],qg(e,`${s[0]}|${s[1]}`))}function Bo(t,e){return NO(jg("sha256").update(t).digest(),jg("sha256").update(e).digest())}function LO(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Bo(r,e))return!0;let n=$O(t.req.header("cookie")??"")[Wd];return n!==void 0&&RO(n,e)}function OO(t){return t==="/login"||t==="/logout"}function $O(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function qg(t,e){return IO("sha256",t).update(e).digest("hex")}var Wd,AO,Bg=E(()=>{"use strict";Ud();Wd="lmctl_next_session",AO=30});import{existsSync as Dn,mkdirSync as CO,readdirSync as MO,readFileSync as Ho,unlinkSync as DO,writeFileSync as Xd}from"node:fs";import{join as Yr}from"node:path";function lt(t){if(!jO.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Xg(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return WO(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Hg,updated_at:Hg}:null}function PO(t,e,r,n){let s=r!==null?`
|
|
2027
2027
|
description: ${r}`:"";return`---
|
|
2028
2028
|
name: ${t}${s}
|
|
2029
2029
|
type: ${e}
|
|
@@ -2037,7 +2037,7 @@ description: ${n}`:"",o=`---
|
|
|
2037
2037
|
name: ${e}${i}
|
|
2038
2038
|
type: ${r}
|
|
2039
2039
|
---
|
|
2040
|
-
${s}`;KO(t,o,"utf8")}function ZO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function QO(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?e$(t.path):t$(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function e$(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function t$(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Xo,Jo,Zg,ry=E(()=>{"use strict";
|
|
2040
|
+
${s}`;KO(t,o,"utf8")}function ZO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function QO(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?e$(t.path):t$(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function e$(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function t$(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Xo,Jo,Zg,ry=E(()=>{"use strict";Qt();zg();Gd();Xo=["user","feedback","project","reference"],Jo=new Set(["smoke","integration","vision","scenario","regression"]),Zg="operator"});function Me(t,e){return`<!doctype html>
|
|
2041
2041
|
<html lang="en">
|
|
2042
2042
|
<head>
|
|
2043
2043
|
<meta charset="utf-8">
|
|
@@ -2109,7 +2109,7 @@ ${s}`;KO(t,o,"utf8")}function ZO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2109
2109
|
`).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function gy(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function yy(t,e){if(e.length===0)return null;let r=hy(t,"durable-memory");if(!y$(r))return null;let n;try{n=E$(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=w$(hy(r,i),"utf8");if(T$(o).some(l=>e.includes(l))){let l=gy(o,"name")??i.replace(".md",""),c=gy(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 Ey=E(()=>{"use strict"});function nu(t){let e=t.trim().replace(v$,"").trim();for(let r=0;r<4;r+=1){let n=b$.exec(e);if(n===null)break;e=n[2].trim()}return e}function wy(t){let e=t.trim(),r=S$.exec(e);if(r!==null)return r[2];let n=k$.exec(e);return n!==null?n[0]:null}function Vs(t,e){let r=t.split(`
|
|
2110
2110
|
`),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=nu(r[o]),l=tu.exec(a);if(l===null)continue;let c=l[1].trim();if(ru.test(c))continue;let d=wy(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=nu(r[o]),l=tu.exec(a);if(l===null)break;let c=ru.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function Ty(t){let e=t.split(`
|
|
2111
2111
|
`),r=null;for(let n=0;n<e.length;n+=1){let s=nu(e[n]),i=tu.exec(s);if(i===null)continue;let o=i[1].trim();if(ru.test(o))continue;let a=wy(o);if(a===null||!En(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var v$,b$,tu,ru,S$,k$,su=E(()=>{"use strict";ks();v$=/^#{1,6}\s+/,b$=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,tu=/^STANCE:\s+(.+)$/,ru=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,S$=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,k$=/^[A-Za-z0-9_-]+/});function vy(t,e,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),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:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var by=E(()=>{"use strict"});import{readFileSync as I$}from"node:fs";import{dirname as N$,join as A$}from"node:path";import{fileURLToPath as x$}from"node:url";function O$(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function D$(t){let e=[],r=[];for(let n of t)R$.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function j$(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&L$.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function P$(t,e){if(t.length===0)return{matched:!1};let r=D$(t);for(let n of r){let s=j$(n,e);if(s.matched)return s}return{matched:!1}}function iu(t){return P$(t,M$)}function F$(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 ou(t){return F$(t).split(" ").filter(e=>e.length>0)}var R$,L$,$$,C$,M$,Sy=E(()=>{"use strict";R$=new Set(["&&","||",";","|",">",">>","<","<<"]),L$=/^[A-Za-z_][A-Za-z0-9_]*=/;$$=N$(x$(import.meta.url)),C$=JSON.parse(I$(A$($$,"side_effect_classifier.json"),"utf-8")),M$=O$(C$)});function zo(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 ky(t,e){try{return await Kr(au(t)??t,zo(e))===!0}catch{return!1}}async function Zo(t,e){try{return await Kr(au(t)??t,zo(e))}catch{return}}async function Iy(t,e){if(typeof t!="string")return t;let r=au(t);if(r===null)return t;try{return await Kr(r,zo(e))}catch{return}}async function Ny(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let i of r){let o=i.index??0;n+=t.slice(s,o);let a=i[1]?.trim()??"";try{n+=U$(await Kr(a,zo(e)))}catch{n+=""}s=o+i[0].length}return n+=t.slice(s),n}function au(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function U$(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Ks=E(()=>{"use strict";Us()});import{existsSync as Ay,readdirSync as xy,readFileSync as W$,statSync as Ry}from"node:fs";import{join as ea}from"node:path";function Ly(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function H(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function ct(t,e,r,n,s={}){let i=C(),o=H(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ys}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=En(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:$i,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:o.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:q$(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function q$(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
2112
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function Oy(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=
|
|
2112
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function K(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function Oy(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=Nr(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function tt(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=Nr(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=Nr(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=B$(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return Ny(n,e)}function B$(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function Nr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function zs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=vy(e.dal,e.run_id,()=>i),c=lu(e,r),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=ou(y.summary),v=iu(T);v.matched&&!c&&(d.violation={summary:y.summary,kind:v.kind})}},m=new Date(Date.now()-1),f=0,p=0,h=y=>{u(y),H$(y,(T,v)=>{f+=T,p+=v})},g=await co({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ke(n),model:n.model??"unknown",tokens_in:f,tokens_out:p,wall_time_ms:g.ms})}),X$(e.project,e.dal,m);let _=d.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&cu(e.project.local_path,m)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function H$(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=Qo(s.input_tokens),a=Qo(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=Qo(i.input_tokens),a=Qo(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Qo(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function rr(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=H(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await zs({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let 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 Pn(t,e,r,n,s,i,o,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=H(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(Kp(s)),l!=null&&l.length>0&&u.push(l);let m=r.prompt_template!==void 0?await tt(r.prompt_template,t,e):"";m.length>0&&u.push(m),n!==null&&n.length>0&&u.push(n);let f=u.join(`
|
|
2113
2113
|
|
|
2114
2114
|
`);try{let p=await zs({context:t,stateId:e,member:c,prompt:f,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id: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,g),{outcome:null,text:"",status_detail:g}}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 h=Vs(p.text,s);return t.dal.finishStep(d.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ie?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}}function Fn(t,e){return(e?.length??0)>0?yy(t.project.local_path,e):null}function $y(t){return iu(ou(t))}function lu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
2115
2115
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
@@ -2117,28 +2117,28 @@ ${s}`;KO(t,o,"utf8")}function ZO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2117
2117
|
`),M({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function G$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!J$.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ys,J$,ze=E(()=>{"use strict";it();$n();uo();Ey();su();ks();by();me();Sy();Ks();Ys="__paused__:";J$=new Set(["user","feedback","project","reference"])});import{spawnSync as Cy}from"node:child_process";function V$(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=Cy("git",["diff","--quiet"],{cwd:i}).status!==0,a=Cy("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),K(t,r,n,Id),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),K(t,r,n,"clean"),V(t.workflow,e.next)}var My,Dy=E(()=>{"use strict";ze();My={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:t=>V$(t,t.state)}});async function K$(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await ky(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),K(t,r,n,"matched"),V(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),K(t,r,n,"no_match"),e.default_next!==void 0?V(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var jy,Py=E(()=>{"use strict";ze();Ks();jy={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async t=>K$(t,t.state)}});async function Y$(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=Fn(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(f,p)=>{let h=`${n}:researcher_${f.alias}[${p}]`,g=await Pn(t,h,f,`TOPIC: ${f.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((f,p)=>f!==null?`# Research ${p+1}: ${i[p]?.topic??""}
|
|
2118
2118
|
${f}`:null).filter(f=>f!==null).join(`
|
|
2119
2119
|
|
|
2120
|
-
`),c=`${n}:consolidator`,d=await Pn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=H(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,d.outcome===null||d.outcome==="error"){t.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&K(t,r,n,"error");let f=e.outcomes.error;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let m=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${m}_consolidated`,content:d.text}),t.dal.finishStep(u.id,"ok","consolidated"),K(t,r,n,"ok"),e.write_back_durable_memory){let f=t.membersByAlias.get(e.consolidator.alias);f!==void 0&&await
|
|
2120
|
+
`),c=`${n}:consolidator`,d=await Pn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=H(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,d.outcome===null||d.outcome==="error"){t.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&K(t,r,n,"error");let f=e.outcomes.error;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let m=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${m}_consolidated`,content:d.text}),t.dal.finishStep(u.id,"ok","consolidated"),K(t,r,n,"ok"),e.write_back_durable_memory){let f=t.membersByAlias.get(e.consolidator.alias);f!==void 0&&await rr(t,n,f,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.ok)}var Fy,Uy=E(()=>{"use strict";ze();Fy={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=>Y$(t,t.state)}});async function z$(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await Zo(e.items_from,t),a=tC(o);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let m=e.outcomes.any_failed;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await Q$(t,e,s.id,a,l):await Z$(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(m=>m.outcome===null||m.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(t.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),K(t,r,n,u),d){let m=e.outcomes.any_failed;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}return V(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function Z$(t,e,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await qy(t,e,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function Q$(t,e,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await qy(t,e,r,n[l],l,s)}});return await Promise.all(a),i}async function qy(t,e,r,n,s,i){let o=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":eC(t.outcomes[a]);return t.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function eC(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function tC(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var Wy,By=E(()=>{"use strict";ze();Ks();Wy={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=>z$(t,t.state)}});async function rC(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let m=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(m.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:Z(t.workflow)}}let o=Fn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await rr(t,n,i,e.write_back_durable_memory),V(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),K(t,r,n,"timeout");let f=e.outcomes.timeout;return f!==void 0?V(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let m=a.last_operator_input??"";try{let f=await zs({context:t,stateId:n,member:i,prompt:m,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let p=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:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,f.text,"waiting_operator"),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:f.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),K(t,r,n,"done"),e.write_back_durable_memory&&await rr(t,n,i,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Hy({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:f.text}),{kind:"paused"})}catch(f){let p=f instanceof Ie?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}}return{kind:"paused"}}let l=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await tt(e.agent.initial_prompt_template,t,n),u=o?`${o}
|
|
2121
2121
|
|
|
2122
|
-
${d}`:d;try{let m=await zs({context:t,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let f=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:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,f),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,m.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:m.text}),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await
|
|
2122
|
+
${d}`:d;try{let m=await zs({context:t,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let f=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:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,f),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,m.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:m.text}),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await rr(t,n,i,e.write_back_durable_memory),V(t.workflow,e.outcomes.done)):(Hy({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:m.text}),{kind:"paused"})}catch(m){let f=m instanceof Ie?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(l.id,null,f),{kind:"terminal",terminal:Z(t.workflow)}}}function Hy(t){let{context:e,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=t,a=C();e.dal.setRunPausedState(e.run_id,`${Ys}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(nC({context:e,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function nC(t){let{context:e,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=sC(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:iC(i,3),paused_at:o,created_run_inputs:Nr(e.job.payload)}}function sC(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=t.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(e),r}function iC(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var Xy,Jy=E(()=>{"use strict";uo();ze();Xy={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=>rC(t,t.state)}});async function oC(t,e){let r=t.stateId,n=t.displayName,s=Oy(t,e.over);if(s===null){let u=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_invalid_items:${e.over}`);let m=e.outcomes.error;return m!==void 0?V(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let u=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:Z(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let m=o[u],f=`${n}[${u}]`,p=t.iteration;t.iteration={item:m,index:u};let h;try{h=await t.dispatchState(f,i,{iteration:{item:m,index:u}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=aC(t.outcomes[f]);if(a.push({index:u,value:m,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=l?"error":"ok";if(t.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),K(t,r,n,d),l){let u=e.outcomes.error;return u!==void 0?V(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}return V(t.workflow,e.outcomes.ok)}function aC(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Gy,Vy=E(()=>{"use strict";ze();Gy={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>oC(t,t.state)}});import{createHash as lC}from"node:crypto";import{existsSync as cC,mkdirSync as dC,readFileSync as uC,writeFileSync as mC}from"node:fs";import{dirname as fC,isAbsolute as Yy,normalize as pC,resolve as Zs}from"node:path";import{Document as _C,ExternalHyperlink as hC,HeadingLevel as Un,LevelFormat as gC,Packer as yC,Paragraph as wt,Table as EC,TableCell as wC,TableRow as TC,TextRun as Tt,WidthType as vC}from"docx";import{marked as bC}from"marked";async function SC(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await kC(t,e,n),o=await IC(t,e),a=await NC(t,e.title),l=await OC(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return dC(fC(o),{recursive:!0}),mC(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:lC("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),K(t,r,n,{output_path:o,path:o,bytes:l.length}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),K(t,r,n,{error:o}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function kC(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await tt(e.markdown_source,t,r)).trim(),i=(n.length===0?LC(t,e.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=xC(t.project.local_path,i);if(o!==null){if(!cC(o))throw new Error(`markdown_source file not found: ${o}`);return ta(uC(o,"utf8"))}return ta(i)}async function IC(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await tt(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=AC(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function NC(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await tt(e,t,t.stateId)).trim();return r.length===0?null:r}function AC(t,e){let r=Zs(t);return pC(Yy(e)?Zs(e):Zs(r,e))}function xC(t,e){return RC(e)?Yy(e)?Zs(e):Zs(t,e):null}function RC(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function LC(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return ta(s);let i=t.dal.query(`SELECT sa.content
|
|
2123
2123
|
FROM step_artifact sa
|
|
2124
2124
|
JOIN step s ON s.id = sa.step_id
|
|
2125
2125
|
WHERE s.run_id = ?
|
|
2126
2126
|
AND s.state_name LIKE ?
|
|
2127
2127
|
AND sa.content IS NOT NULL
|
|
2128
2128
|
ORDER BY sa.id DESC
|
|
2129
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:ta(i[0].content)}function ta(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function OC(t,e){let r=Zy(bC.lexer(t,{gfm:!0})),n=new _C({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:gC.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new wt("")]:r}]});return yC.toBuffer(n)}function Zy(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new wt({heading:FC(r.depth),children:Ar(
|
|
2130
|
-
`).map(r=>new wt({children:[new Tt({text:r.length===0?" ":r,font:"Courier New"})]}))}function
|
|
2131
|
-
${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let g=Ty(p.text);if(g!==null){let _=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),T=Vs(p.text,y);if(T.outcome===null){let I=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${T.reason}`),{kind:"escalate",token:"",reason:`no_stance:${T.reason}`}}let v=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,T.outcome,"outcomes_from_stance"),K(t,r,n,T.outcome),V(t.workflow,e.outcomes_from_stance[T.outcome])}let g=Vs(p.text,yM);if(g.outcome!==null){let y=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=H(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await
|
|
2132
|
-
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=H(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${m}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await
|
|
2129
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:ta(i[0].content)}function ta(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function OC(t,e){let r=Zy(bC.lexer(t,{gfm:!0})),n=new _C({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:gC.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new wt("")]:r}]});return yC.toBuffer(n)}function Zy(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new wt({heading:FC(r.depth),children:xr(Ar(r))}));break;case"paragraph":e.push(new wt({children:xr(Ar(r))}));break;case"text":e.push(new wt({children:Ar(r).length===0?[new Tt(r.text)]:xr(Ar(r))}));break;case"blockquote":e.push(...Zy(Ar(r)).map(n=>n instanceof wt?n:new wt({children:[new Tt(r.text)]})));break;case"list":DC(r)&&e.push(...$C(r));break;case"table":jC(r)&&e.push(CC(r));break;case"code":PC(r)&&e.push(...MC(r));break;case"hr":e.push(new wt(""));break;case"html":r.text.trim().length>0&&e.push(new wt({children:[new Tt(r.text)]}));break;default:break}return e}function xr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new Tt({text:n.text,...du(e)}));break;case"strong":r.push(...xr(Ar(n),{...e,bold:!0}));break;case"em":r.push(...xr(Ar(n),{...e,italics:!0}));break;case"codespan":r.push(new Tt({text:n.text,...du({...e,code:!0})}));break;case"link":r.push(new hC({link:n.href,children:xr(Ar(n),{...e})}));break;case"br":r.push(new Tt({text:"",break:1}));break;case"image":r.push(new Tt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new Tt({text:n.text,strike:!0}));break;default:r.push(new Tt({text:n.raw,...du(e)}));break}return r.length===0?[new Tt("")]:r}function du(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function $C(t){return t.items.map(e=>new wt({children:xr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Ky(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Ky(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ky(t){return t.task?`[${t.checked?"x":" "}] `:""}function CC(t){let e=[t.header,...t.rows].map(r=>new TC({children:r.map(n=>new wC({children:[new wt({children:xr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new EC({width:{size:100,type:vC.PERCENTAGE},rows:e})}function MC(t){return t.text.split(`
|
|
2130
|
+
`).map(r=>new wt({children:[new Tt({text:r.length===0?" ":r,font:"Courier New"})]}))}function Ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function DC(t){return t.type==="list"&&Array.isArray(t.items)}function jC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function PC(t){return t.type==="code"&&typeof t.text=="string"}function FC(t){switch(t){case 1:return Un.HEADING_1;case 2:return Un.HEADING_2;case 3:return Un.HEADING_3;case 4:return Un.HEADING_4;case 5:return Un.HEADING_5;default:return Un.HEADING_6}}var zy,Qy=E(()=>{"use strict";ze();zy={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=>SC(t,t.state)}});import{createHash as UC}from"node:crypto";import{existsSync as WC,mkdirSync as qC,readFileSync as eE,statSync as BC}from"node:fs";import{dirname as HC,isAbsolute as tE,normalize as XC,resolve as Qs}from"node:path";import{marked as JC}from"marked";import GC from"write-excel-file/node";async function VC(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await KC(t,e),o=YC(e.input_format),a=await zC(t,e),l=await ZC(t,e.title),c=o==="markdown"?aM(i):rM(i);await lM({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let d=BC(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=UC("sha256").update(eE(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:d}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),K(t,r,n,{error:o}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function KC(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await tt(e.source,t,t.stateId)).trim(),n=eM(t.project.local_path,r);if(n!==null){if(!WC(n))throw new Error(`source file not found: ${n}`);return eE(n,"utf8")}return r}function YC(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function zC(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await tt(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=QC(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function ZC(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await tt(e,t,t.stateId)).trim();return r.length===0?null:r}function QC(t,e){let r=Qs(t);return XC(tE(e)?Qs(e):Qs(r,e))}function eM(t,e){return tM(e)?tE(e)?Qs(e):Qs(t,e):null}function tM(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function rM(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ra(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>nM(r,n))}function nM(t,e){if(!ra(t))throw new Error(`sheets[${e}] must be an object`);let r=sM(t.headers,`sheets[${e}].headers`),n=iM(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:oM(t.styles)}}function sM(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function iM(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${i}] must be string, number, boolean, or null`)})})}function oM(t){if(!ra(t)||!ra(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 aM(t){let e=JC.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(_M(s)){n=s.text;continue}hM(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function lM(t){qC(HC(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:mM(n.name,e),data:cM(n),columns:uM(n)}));await GC(r).toFile(t.outputPath)}function cM(t){let e=[];if(t.headers.length>0){let r=pM(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(dM));return e.length===0?[[{}]]:e}function dM(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 uM(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function mM(t,e){let r=fM(t),n=r,s=2;for(;e.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return e.add(n.toLowerCase()),n}function fM(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function pM(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 _M(t){return t.type==="heading"&&typeof t.text=="string"}function hM(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ra(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var rE,nE=E(()=>{"use strict";ze();rE={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=>VC(t,t.state)}});import{spawnSync as gM}from"node:child_process";async function EM(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let m of e.pre_checks??[])if(gM("sh",["-c",m.command],{cwd:t.project.local_path}).status!==0){let p=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${m.description??m.command}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let i=Fn(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 m=0;m<e.max_loops;m+=1){let f=`${n}:coder[${m}]`,p=await Pn(t,f,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
2131
|
+
${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let g=Ty(p.text);if(g!==null){let _=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),T=Vs(p.text,y);if(T.outcome===null){let I=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${T.reason}`),{kind:"escalate",token:"",reason:`no_stance:${T.reason}`}}let v=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,T.outcome,"outcomes_from_stance"),K(t,r,n,T.outcome),V(t.workflow,e.outcomes_from_stance[T.outcome])}let g=Vs(p.text,yM);if(g.outcome!==null){let y=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=H(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await rr(t,n,y,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(g=>Pn(t,`${n}:reviewer_${g.alias}[${m}]`,g,`CODER OUTPUT:
|
|
2132
|
+
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=H(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${m}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await rr(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
2133
2133
|
|
|
2134
|
-
`),e.loop_feedback_artifact!==void 0){let g=H(t,{run_id:t.run_id,state_name:`${n}:feedback[${m}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${m}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let d=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?V(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}var yM,sE,iE=E(()=>{"use strict";su();ze();yM=["blocked","failed","aborted"],sE={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=>EM(t,t.state)}});import{spawnSync as wM}from"node:child_process";async function TM(t,e){let r=t.stateId,n=t.displayName,s=await tt(e.command,t,n),i=lu(t,n),o=$y(s);if(o.matched&&!i){let h=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=wM("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",m=c.error;if((u.length>0||m!==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:n,exit_status:c.status,stderr:u,spawn_error:m===void 0?null:m instanceof Error?m.message:String(m),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:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&cu(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:n,message:`ShellStep ${n} 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:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:d.id,kind:e.capture_output_to,content:h})}let f=String(c.status),p=e.outcomes_from_exit[f]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:f}),t.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${f}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(d.id,f,`exit=${c.status}`),K(t,r,n,f),V(t.workflow,p))}var oE,aE=E(()=>{"use strict";ze();oE={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=>TM(t,t.state)}});async function vM(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let o=ht(i.definition),a=await bM(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:Z(t.workflow)};K(t,r,n,SM(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:Z(t.workflow)}:V(t.workflow,d)}async function bM(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await Iy(s,t);r[n]=i===s?await Zo(s,t):i}return r}function SM(t,e,r){let n={};for(let s of r)n[s.name]=kM(t,e,s);return n}function kM(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let i=IM(s,r.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function IM(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 lE,cE=E(()=>{"use strict";qs();ze();Ks();lE={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=>vM(t,t.state)}});function NM(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var dE,uE=E(()=>{"use strict";ze();dE={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=>NM(t,t.state)}});async function AM(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=xM(t.cursor),a=i.filter(RM).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 xM(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function RM(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 mE,fE=E(()=>{"use strict";mE={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=>AM(t)}});async function LM(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var pE,_E=E(()=>{"use strict";pE={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=>LM(t)}});function hE(t){t.register(My),t.register(sE),t.register(Fy),t.register(Xy),t.register(Gy),t.register(zy),t.register(rE),t.register(oE),t.register(jy),t.register(Wy),t.register(lE),t.register(dE),t.register(pE),t.register(mE)}var gE=E(()=>{"use strict";Dy();Py();Uy();By();Jy();Vy();Qy();nE();iE();aE();cE();uE();fE();_E()});function yE(){return na===null&&(na=new uu,hE(na)),na}var OM,uu,na,EE=E(()=>{"use strict";gE();OM={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"},uu=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:OM[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},na=null});async function vE(t){NE(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=CM(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ei(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=py(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(f=>[f.alias,f]));if(ei(n)){let f=mu({dal:t.dal,workflow:ia(n),job:t.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Ir(t.job.payload)??{},team_id:t.team.id}),p=await SE(n,f,o.current_state??n.entry_step_id);return TE(t.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=mu({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:Ir(t.job.payload)??{},team_id:t.team.id}),m=await bE(u,o.current_state??n.start_at);return TE(t.dal,r.id,o.id,n.name,m),m}function TE(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=t.getRun(r);if(d!==null){let u=t.getWorkflow(d.workflow_id);if(u!==null){let m=JSON.parse(u.definition),p=(m.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(m.steps)){for(let g of m.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=m.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function 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(r,n,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await fu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{NE(n);let i=ei(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=mu({dal:t.dal,workflow:ei(n)?ia(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ei(n)?SE(n,a,o.current_state??n.entry_step_id):bE(a,o.current_state??n.start_at)}};return e}async function bE(t,e){let r=e;if(r.startsWith(Ys))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return rr(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=sa(t,Z(t.workflow));if(l.kind==="paused")return qe(t);if(l.kind==="escalate")return ct(t,{id:r,name:r,type:"unknown"},l.token,l.reason),qe(t);if(l.kind==="terminal")return rr(t,l.terminal);r=l.state;continue}let o,a=IE(t,r);if(a!==null){let l=H(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===Ss)return rr(t,zl);let c=i.outcomes?.[a];o=c!==void 0?V(t.workflow,c):ct(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await fu(t,r,i);if(o.kind==="paused")return qe(t);if(o.kind==="escalate")return ct(t,{id:r,name:r,type:i.type},o.token,o.reason),qe(t);if(o.kind==="terminal"){let l=sa(t,o.terminal);if(l.kind==="paused")return qe(t);if(l.kind==="escalate")return ct(t,{id:r,name:r,type:i.type},l.token,l.reason),qe(t);if(l.kind==="terminal")return rr(t,l.terminal);r=l.state;continue}r=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=sa(t,Z(t.workflow));return n.kind==="terminal"?rr(t,n.terminal):rr(t,Z(t.workflow))}async function SE(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return ct(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),qe(e);let l=IE(e,a.id);if(l!==null){let f=H(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(f.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===Ss)return rr(e,zl);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return ct(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}),qe(e);i=h;continue}let c=await $M(e,t,a);if(c.kind==="paused")return qe(e);let d=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return ct(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),qe(e);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let f=e.workflow;e.workflow=ia(t,a);try{let p=sa(e,u);if(p.kind==="paused")return qe(e);if(p.kind==="escalate")return ct(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),qe(e);if(p.kind==="terminal")return rr(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ct(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),qe(e);i=h.id;continue}finally{e.workflow=f}}if(En(u))return ct(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),qe(e);let m=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(m===void 0)return ct(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),qe(e);i=m}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})}),rr(e,"aborted")}async function $M(t,e,r){let n=kE(e,r),s=t.workflow;t.workflow=ia(e,r);try{return await fu(t,r.id,n,r.name)}finally{t.workflow=s}}function kE(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function fu(t,e,r,n){let s=yE().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?jM(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Ly(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function CM(t,e){try{let r=JSON.parse(t);if(DM(r)&&r.definition_schema_version===3)return Dt.parse(r)}catch{return e}return e}function ei(t){return t.definition_schema_version===3}function ia(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=kE(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:MM(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function MM(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function DM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function jM(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function rr(t,e){t.dal.setRunTerminalState(t.run_id,e);try{dy(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function qe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function IE(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function sa(t,e){if(!PM(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&FM(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function PM(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function FM(t,e,r){let n=UM(t),s=r.capture_evidence&&n!==null?WM(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function UM(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 WM(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function NE(t){if(!wE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${wE.join(", ")}`)}var wE,AE=E(()=>{"use strict";Cn();uy();_y();ze();EE();ks();wE=[1,2,3]});import{readFileSync as qM,readdirSync as BM}from"node:fs";import{basename as HM,join as XM,resolve as JM}from"node:path";function LE(t={}){let e=JM(t.workflowsDir??"workflows"),r=BM(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>GM(XM(e,n)))}}function GM(t){let e=HM(t);try{let r=qM(t,"utf8"),n=ht(r);return CE(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ME(r)}}}function OE(t,e){try{let r=ht(e);return CE(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ME(r)}}}function $E(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
2134
|
+
`),e.loop_feedback_artifact!==void 0){let g=H(t,{run_id:t.run_id,state_name:`${n}:feedback[${m}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${m}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let d=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?V(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}var yM,sE,iE=E(()=>{"use strict";su();ze();yM=["blocked","failed","aborted"],sE={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=>EM(t,t.state)}});import{spawnSync as wM}from"node:child_process";async function TM(t,e){let r=t.stateId,n=t.displayName,s=await tt(e.command,t,n),i=lu(t,n),o=$y(s);if(o.matched&&!i){let h=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=wM("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",m=c.error;if((u.length>0||m!==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:n,exit_status:c.status,stderr:u,spawn_error:m===void 0?null:m instanceof Error?m.message:String(m),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:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&cu(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:n,message:`ShellStep ${n} 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:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:d.id,kind:e.capture_output_to,content:h})}let f=String(c.status),p=e.outcomes_from_exit[f]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:f}),t.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${f}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(d.id,f,`exit=${c.status}`),K(t,r,n,f),V(t.workflow,p))}var oE,aE=E(()=>{"use strict";ze();oE={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=>TM(t,t.state)}});async function vM(t,e){let r=t.stateId,n=t.displayName,s=H(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let o=ht(i.definition),a=await bM(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:Z(t.workflow)};K(t,r,n,SM(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:Z(t.workflow)}:V(t.workflow,d)}async function bM(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await Iy(s,t);r[n]=i===s?await Zo(s,t):i}return r}function SM(t,e,r){let n={};for(let s of r)n[s.name]=kM(t,e,s);return n}function kM(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let i=IM(s,r.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function IM(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 lE,cE=E(()=>{"use strict";qs();ze();Ks();lE={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=>vM(t,t.state)}});function NM(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=H(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var dE,uE=E(()=>{"use strict";ze();dE={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=>NM(t,t.state)}});async function AM(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=xM(t.cursor),a=i.filter(RM).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 xM(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function RM(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 mE,fE=E(()=>{"use strict";mE={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=>AM(t)}});async function LM(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var pE,_E=E(()=>{"use strict";pE={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=>LM(t)}});function hE(t){t.register(My),t.register(sE),t.register(Fy),t.register(Xy),t.register(Gy),t.register(zy),t.register(rE),t.register(oE),t.register(jy),t.register(Wy),t.register(lE),t.register(dE),t.register(pE),t.register(mE)}var gE=E(()=>{"use strict";Dy();Py();Uy();By();Jy();Vy();Qy();nE();iE();aE();cE();uE();fE();_E()});function yE(){return na===null&&(na=new uu,hE(na)),na}var OM,uu,na,EE=E(()=>{"use strict";gE();OM={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"},uu=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:OM[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},na=null});async function vE(t){NE(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=CM(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ei(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=py(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(f=>[f.alias,f]));if(ei(n)){let f=mu({dal:t.dal,workflow:ia(n),job:t.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Nr(t.job.payload)??{},team_id:t.team.id}),p=await SE(n,f,o.current_state??n.entry_step_id);return TE(t.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=mu({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:Nr(t.job.payload)??{},team_id:t.team.id}),m=await bE(u,o.current_state??n.start_at);return TE(t.dal,r.id,o.id,n.name,m),m}function TE(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=t.getRun(r);if(d!==null){let u=t.getWorkflow(d.workflow_id);if(u!==null){let m=JSON.parse(u.definition),p=(m.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(m.steps)){for(let g of m.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=m.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function 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(r,n,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await fu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{NE(n);let i=ei(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=mu({dal:t.dal,workflow:ei(n)?ia(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ei(n)?SE(n,a,o.current_state??n.entry_step_id):bE(a,o.current_state??n.start_at)}};return e}async function bE(t,e){let r=e;if(r.startsWith(Ys))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return nr(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=sa(t,Z(t.workflow));if(l.kind==="paused")return qe(t);if(l.kind==="escalate")return ct(t,{id:r,name:r,type:"unknown"},l.token,l.reason),qe(t);if(l.kind==="terminal")return nr(t,l.terminal);r=l.state;continue}let o,a=IE(t,r);if(a!==null){let l=H(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===Ss)return nr(t,zl);let c=i.outcomes?.[a];o=c!==void 0?V(t.workflow,c):ct(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await fu(t,r,i);if(o.kind==="paused")return qe(t);if(o.kind==="escalate")return ct(t,{id:r,name:r,type:i.type},o.token,o.reason),qe(t);if(o.kind==="terminal"){let l=sa(t,o.terminal);if(l.kind==="paused")return qe(t);if(l.kind==="escalate")return ct(t,{id:r,name:r,type:i.type},l.token,l.reason),qe(t);if(l.kind==="terminal")return nr(t,l.terminal);r=l.state;continue}r=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=sa(t,Z(t.workflow));return n.kind==="terminal"?nr(t,n.terminal):nr(t,Z(t.workflow))}async function SE(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return ct(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),qe(e);let l=IE(e,a.id);if(l!==null){let f=H(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(f.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===Ss)return nr(e,zl);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return ct(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}),qe(e);i=h;continue}let c=await $M(e,t,a);if(c.kind==="paused")return qe(e);let d=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return ct(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),qe(e);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let f=e.workflow;e.workflow=ia(t,a);try{let p=sa(e,u);if(p.kind==="paused")return qe(e);if(p.kind==="escalate")return ct(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),qe(e);if(p.kind==="terminal")return nr(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ct(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),qe(e);i=h.id;continue}finally{e.workflow=f}}if(En(u))return ct(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),qe(e);let m=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(m===void 0)return ct(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),qe(e);i=m}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})}),nr(e,"aborted")}async function $M(t,e,r){let n=kE(e,r),s=t.workflow;t.workflow=ia(e,r);try{return await fu(t,r.id,n,r.name)}finally{t.workflow=s}}function kE(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function fu(t,e,r,n){let s=yE().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?jM(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Ly(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function CM(t,e){try{let r=JSON.parse(t);if(DM(r)&&r.definition_schema_version===3)return jt.parse(r)}catch{return e}return e}function ei(t){return t.definition_schema_version===3}function ia(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=kE(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:MM(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function MM(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function DM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function jM(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function nr(t,e){t.dal.setRunTerminalState(t.run_id,e);try{dy(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function qe(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function IE(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function sa(t,e){if(!PM(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&FM(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function PM(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function FM(t,e,r){let n=UM(t),s=r.capture_evidence&&n!==null?WM(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function UM(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 WM(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function NE(t){if(!wE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${wE.join(", ")}`)}var wE,AE=E(()=>{"use strict";Cn();uy();_y();ze();EE();ks();wE=[1,2,3]});import{readFileSync as qM,readdirSync as BM}from"node:fs";import{basename as HM,join as XM,resolve as JM}from"node:path";function LE(t={}){let e=JM(t.workflowsDir??"workflows"),r=BM(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>GM(XM(e,n)))}}function GM(t){let e=HM(t);try{let r=qM(t,"utf8"),n=ht(r);return CE(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ME(r)}}}function OE(t,e){try{let r=ht(e);return CE(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ME(r)}}}function $E(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
|
|
2135
2135
|
`)}
|
|
2136
|
-
`}function CE(t,e){let r=KM(e),n=YM(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=VM(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function VM(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function KM(t){return pu(t)?t.entry_step_id:t.start_at}function YM(t){return pu(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function pu(t){return t.definition_schema_version===3}function ME(t){return t instanceof
|
|
2136
|
+
`}function CE(t,e){let r=KM(e),n=YM(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=VM(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function VM(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function KM(t){return pu(t)?t.entry_step_id:t.start_at}function YM(t){return pu(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function pu(t){return t.definition_schema_version===3}function ME(t){return t instanceof tr?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 DE(t){let e=new Set;if(pu(t))for(let r of t.steps){let n=r.members??{};xE(n,e)}else for(let r of Object.values(t.states))xE(r,e);return[...e].sort()}function xE(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=RE(i);o!==null&&e.add(o)}for(let s of n){let i=t[s];if(Array.isArray(i))for(let o of i){let a=RE(o);a!==null&&e.add(a)}}}function RE(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var oa=E(()=>{"use strict";qs()});function zM({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,aa)[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}=ZM(t,r,o);if(a<20)continue;let c=o??"initial",d=`${ti}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:aa,source_ref:ti,payload:JSON.stringify({kind:ti,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function ZM(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
2137
2137
|
FROM run r
|
|
2138
2138
|
JOIN job j ON j.id = r.job_id
|
|
2139
2139
|
WHERE j.project_id = ?
|
|
2140
2140
|
AND r.terminal_state IS NOT NULL
|
|
2141
|
-
${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function jE(t){for(let e of QM)try{e(t)}catch{}}var aa,ti,QM,_u=E(()=>{"use strict";aa="memory_policy",ti="memory_consolidation_request";QM=[zM]});var BE={};pe(BE,{getOrInsertConsolidationWorkflow:()=>FE,runJobById:()=>sD,runOnce:()=>Zr,startWorker:()=>iD});import{createHash as eD}from"node:crypto";import{readFileSync as tD}from"node:fs";import{pathToFileURL as rD}from"node:url";function FE(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{cy({swallow:!0});let n=Yo(e);if(n===null)return null;let s=tD(n,"utf8"),i=ht(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:rD(n).href,source_sha256:eD("sha256").update(s).digest("hex")})}catch{return null}}async function Zr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??PE,evaluator:n=>WE(t.dal,n)}),r===null?null:await UE(t.dal,r,e)}catch(n){if(r!==null)return
|
|
2141
|
+
${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function jE(t){for(let e of QM)try{e(t)}catch{}}var aa,ti,QM,_u=E(()=>{"use strict";aa="memory_policy",ti="memory_consolidation_request";QM=[zM]});var BE={};pe(BE,{getOrInsertConsolidationWorkflow:()=>FE,runJobById:()=>sD,runOnce:()=>Zr,startWorker:()=>iD});import{createHash as eD}from"node:crypto";import{readFileSync as tD}from"node:fs";import{pathToFileURL as rD}from"node:url";function FE(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{cy({swallow:!0});let n=Yo(e);if(n===null)return null;let s=tD(n,"utf8"),i=ht(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:rD(n).href,source_sha256:eD("sha256").update(s).digest("hex")})}catch{return null}}async function Zr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??PE,evaluator:n=>WE(t.dal,n)}),r===null?null:await UE(t.dal,r,e)}catch(n){if(r!==null)return Rr(t.dal,r,"worker_run_failed",zr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:la(zr(n))})})}catch{}return null}finally{t.max_concurrent}}async function sD(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??PE,evaluator:s=>WE(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await UE(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Rr(t.dal,r,"worker_run_failed",zr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:la(zr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function UE(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Rr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===aa&&e.source_ref===ti,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=FE(t):o=qE(t,e,n),o===null)return Rr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(i?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Rr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=ht(o.definition)}catch(u){return Rr(t,e,"worker_workflow_invalid",zr(u),r,n)}let d=oD(c,l);if(d.length>0)return Rr(t,e,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await vE({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()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return Rr(t,e,"worker_run_failed",zr(u),r,n,a)}}function WE(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=qE(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=ht(n.definition)}catch{s=null}return Po({workflow:s,job:e,project:r})}function qE(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function iD(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await Zr(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:la(zr(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??nD))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Rr(t,e,r,n,s,i,o){let a=la(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function zr(t){return t instanceof Error?t.message:String(t)}function la(t){return t.length>4096?t.slice(0,4096):t}function oD(t,e){let r=DE(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var PE,nD,ca=E(()=>{"use strict";Qd();AE();qs();oa();Cd();_u();PE=6e5,nD=5e3});import{existsSync as aD,readFileSync as lD}from"node:fs";import{marked as cD}from"marked";function GE(t,e){t.get("/layman",r=>r.html(Me("Layman Home",dD(e.dal)))),t.get("/api/layman",r=>r.json(zE(e.dal))),t.get("/layman/start/:workflow",r=>{let n=JE(r);return n===null?r.notFound():r.html(Me(`Start ${Wn(n)}`,fD(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=JE(r);return n===null?r.notFound():n==="newspaper"?HE(r,e.dal):pD(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Jr(e.dal,da(r,"id"));return n===null?r.notFound():r.html(Me(`Run ${n.id}`,gD(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Jr(e.dal,da(r,"id"));return n===null?r.notFound():r.json(AD(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>ED(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Me("Newspaper Subscriptions",ID(e.dal)))),t.post("/layman/newspaper",r=>HE(r,e.dal)),t.delete("/layman/newspaper/:id",r=>XE(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>XE(r,e.dal))}function dD(t){let e=zE(t);return`<section class="layman-home">
|
|
2142
2142
|
<h1>Welcome</h1>
|
|
2143
2143
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
2144
2144
|
<div class="grid">${ua.map(uD).join("")}</div>
|
|
@@ -2217,19 +2217,19 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2217
2217
|
WHERE w.name = ?
|
|
2218
2218
|
ORDER BY pw.id DESC`,"newspaper")}function QE(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function ew(t,e){let r=Number(rt(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function RD(t){let e=rt(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:rt(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function JE(t){let e=t.req.param("workflow");return yu.includes(e)?e:null}function Wn(t){return ua.find(e=>e.name===t)?.title??t}function LD(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function wu(t){return cD.parse(t,{async:!1})}function OD(t){return t==="done"||t==="pr_ready"||t==="merged"}function $D(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function CD(t,e){return t.split(`
|
|
2219
2219
|
`).slice(0,e).join(`
|
|
2220
|
-
`)}function MD(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function rt(t){return typeof t=="string"?t:""}function DD(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 gu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function da(t,e){return Number(t.req.param(e))}var ua,yu,tw=E(()=>{"use strict";ca();Zt();Vd();ua=[{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."}],yu=ua.map(t=>t.name)});function PD(t){return t.replace(/^\/+/,"")}function rw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function qn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=PD(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return rw(t.userId)&&rw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${jD}/${t.identityId}/`}function UD(t){return String(Math.max(0,Math.floor(t))).padStart(FD,"0")}function Tu(t,e,r){return`${t}${e}${UD(r)}.json`}function ma(t,e){return`${t}${e}`}function fa(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var jD,FD,pa=E(()=>{"use strict";jD="mailbox";FD=12});function nr(t,e){let r=Math.floor(t),n="",s=r;for(let d=0;d<12;d++)n=_a[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=_a[a&15]+o,a=a>>4;let l=_a[8|Math.floor(e()*4)&3],c="";for(let d=0;d<15;d++)c+=_a[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var _a,ha=E(()=>{"use strict";_a="0123456789abcdef"});function bu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Su(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 aw(t){return t.conversation_id===ow&&BD(t.payload)}function BD(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function HD(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:aw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var nw,sw,iw,WD,ow,qD,vu,Qr,ga=E(()=>{"use strict";pa();ha();nw=3e3,sw=1e4,iw=12e3,WD=1e3,ow="__lmctl_heartbeat__",qD={kind:"heartbeat"},vu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Qr=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=qn({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=bu(e.readIntervalMs??e.pollIntervalMs??nw,nw),this.heartbeatIdleMs=bu(e.heartbeatIdleMs??sw,sw),this.backoffReadIntervalMs=bu(e.backoffReadIntervalMs??e.pollIntervalMs??iw,iw)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??vu;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=ma(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:WD,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=fa(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:nr(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=Tu(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??vu;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Tu(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Su(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),aw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=HD(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??vu;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(ow,qD)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as XD}from"@hono/node-server/conninfo";function lw(t,e){let r=e.bucket??JD,n=e.remoteAddressOf??(i=>VD(i)),s=i=>{let o=n(i);return KD(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:r,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 Su(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Iu(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:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Iu(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=GD(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(m=>({Key:m.Key,LastModified:m.LastModified instanceof Date?m.LastModified.toISOString():m.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Iu(u)},500)}})}function ku(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function GD(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function VD(t){try{return XD(t).remote.address}catch{return}}function KD(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Iu(t){return t instanceof Error?t.message:String(t)}var JD,cw=E(()=>{"use strict";ga();JD="local"});function dw(t,e){t.get("/mailbox/workspace",r=>ZD(r,e)),t.get("/mailbox/projects",r=>QD(r,e)),t.get("/mailbox/projects/:id",r=>ej(r,e)),t.post("/mailbox/projects",r=>tj(r,e)),t.patch("/mailbox/projects/:id",r=>rj(r,e)),t.delete("/mailbox/projects/:id",r=>nj(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>sj(r,e)),t.get("/mailbox/prompts/:id",r=>ij(r,e))}function ZD(t,e){e.dal.ensureWorkspace({id:Hn,name:Nu});let r=uw(e.dal),n={id:Hn,name:Nu,created_at:zD,projects:r};return t.json({workspace:n})}function QD(t,e){return t.json({projects:uw(e.dal)})}function ej(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(Bn)){let s=Au(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:wa(s)})}let n=fw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:mw(n)})}async function tj(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Hn,name:Nu});let s=e.dal.insertWebProject({workspace_id:Hn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:wa(s)},201)}async function rj(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(Bn)){let i=Au(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:wa(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function nj(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(Bn)){let n=Au(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function sj(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=fw(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=`${YD}${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 oj({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:`${Ea}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function ij(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=aj(e.dal,r);return t.json({result:n})}function uw(t){let e=t.listProjects().map(mw),r=t.listWebProjectsActive(Hn).map(wa);return[...e,...r].sort(gj)}function mw(t){return{id:`${Ea}${t.id}`,workspace_id:Hn,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 wa(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Bn}${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 Au(t,e){if(!e.startsWith(Bn))return null;let r=e.slice(Bn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function fw(t,e){if(e.startsWith(Ea)){let n=e.slice(Ea.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function oj(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Dd(),Lg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function aj(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),i=t.getProject(r.project_id),o=pj(t,i?.team_id??null),a=fj(s),l=_j(n,a,o.length>0),c=hj(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:lj(t,i.workflow_name),u=d.totalEstimatedMs,m=pw(r.created_at),f=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:cj(t,s.id),g=dj(s,a,h,d.perStep,o),_=uj(h,d.perStep),y=mj(g,_,u,m,f,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...ya(u,m),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...ya(u,m),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...ya(u,m),...y},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...ya(u,m),...y},errors_json:null,duration_ms:c}}function lj(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let 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 cj(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function dj(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(m=>m.state_name===i&&m.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),c=l?.name??i,d=pw(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 uj(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function mj(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function pw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function ya(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function fj(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function pj(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function _j(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function hj(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function gj(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var Ea,Bn,YD,Hn,Nu,zD,_w=E(()=>{"use strict";Ea="project:",Bn="web_project:",YD="prompt:",Hn="default",Nu="Default workspace",zD=new Date(0).toISOString()});import{Buffer as hw}from"node:buffer";function gw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function yw(t){return wj[t]}function Ew(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var yj,Ej,Ta,wj,xu=E(()=>{"use strict";yj=1e4,Ej=256*1024,Ta=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=gw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,yj),this.pushByteCap=gw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,Ej),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=hw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${hw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
|
|
2220
|
+
`)}function MD(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function rt(t){return typeof t=="string"?t:""}function DD(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 gu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function da(t,e){return Number(t.req.param(e))}var ua,yu,tw=E(()=>{"use strict";ca();Qt();Vd();ua=[{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."}],yu=ua.map(t=>t.name)});function PD(t){return t.replace(/^\/+/,"")}function rw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function qn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=PD(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return rw(t.userId)&&rw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${jD}/${t.identityId}/`}function UD(t){return String(Math.max(0,Math.floor(t))).padStart(FD,"0")}function Tu(t,e,r){return`${t}${e}${UD(r)}.json`}function ma(t,e){return`${t}${e}`}function fa(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var jD,FD,pa=E(()=>{"use strict";jD="mailbox";FD=12});function sr(t,e){let r=Math.floor(t),n="",s=r;for(let d=0;d<12;d++)n=_a[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=_a[a&15]+o,a=a>>4;let l=_a[8|Math.floor(e()*4)&3],c="";for(let d=0;d<15;d++)c+=_a[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var _a,ha=E(()=>{"use strict";_a="0123456789abcdef"});function bu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Su(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 aw(t){return t.conversation_id===ow&&BD(t.payload)}function BD(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function HD(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:aw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var nw,sw,iw,WD,ow,qD,vu,Qr,ga=E(()=>{"use strict";pa();ha();nw=3e3,sw=1e4,iw=12e3,WD=1e3,ow="__lmctl_heartbeat__",qD={kind:"heartbeat"},vu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Qr=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=qn({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=bu(e.readIntervalMs??e.pollIntervalMs??nw,nw),this.heartbeatIdleMs=bu(e.heartbeatIdleMs??sw,sw),this.backoffReadIntervalMs=bu(e.backoffReadIntervalMs??e.pollIntervalMs??iw,iw)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??vu;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=ma(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:WD,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=fa(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:sr(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=Tu(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??vu;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=Tu(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Su(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),aw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=HD(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??vu;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(ow,qD)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as XD}from"@hono/node-server/conninfo";function lw(t,e){let r=e.bucket??JD,n=e.remoteAddressOf??(i=>VD(i)),s=i=>{let o=n(i);return KD(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:r,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 Su(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Iu(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:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Iu(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=GD(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(m=>({Key:m.Key,LastModified:m.LastModified instanceof Date?m.LastModified.toISOString():m.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Iu(u)},500)}})}function ku(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function GD(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function VD(t){try{return XD(t).remote.address}catch{return}}function KD(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Iu(t){return t instanceof Error?t.message:String(t)}var JD,cw=E(()=>{"use strict";ga();JD="local"});function dw(t,e){t.get("/mailbox/workspace",r=>ZD(r,e)),t.get("/mailbox/projects",r=>QD(r,e)),t.get("/mailbox/projects/:id",r=>ej(r,e)),t.post("/mailbox/projects",r=>tj(r,e)),t.patch("/mailbox/projects/:id",r=>rj(r,e)),t.delete("/mailbox/projects/:id",r=>nj(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>sj(r,e)),t.get("/mailbox/prompts/:id",r=>ij(r,e))}function ZD(t,e){e.dal.ensureWorkspace({id:Hn,name:Nu});let r=uw(e.dal),n={id:Hn,name:Nu,created_at:zD,projects:r};return t.json({workspace:n})}function QD(t,e){return t.json({projects:uw(e.dal)})}function ej(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(Bn)){let s=Au(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:wa(s)})}let n=fw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:mw(n)})}async function tj(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Hn,name:Nu});let s=e.dal.insertWebProject({workspace_id:Hn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:wa(s)},201)}async function rj(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(Bn)){let i=Au(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:wa(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function nj(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(Bn)){let n=Au(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function sj(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=fw(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=`${YD}${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 oj({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:`${Ea}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function ij(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=aj(e.dal,r);return t.json({result:n})}function uw(t){let e=t.listProjects().map(mw),r=t.listWebProjectsActive(Hn).map(wa);return[...e,...r].sort(gj)}function mw(t){return{id:`${Ea}${t.id}`,workspace_id:Hn,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 wa(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Bn}${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 Au(t,e){if(!e.startsWith(Bn))return null;let r=e.slice(Bn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function fw(t,e){if(e.startsWith(Ea)){let n=e.slice(Ea.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function oj(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Dd(),Lg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function aj(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),i=t.getProject(r.project_id),o=pj(t,i?.team_id??null),a=fj(s),l=_j(n,a,o.length>0),c=hj(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:lj(t,i.workflow_name),u=d.totalEstimatedMs,m=pw(r.created_at),f=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:cj(t,s.id),g=dj(s,a,h,d.perStep,o),_=uj(h,d.perStep),y=mj(g,_,u,m,f,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...ya(u,m),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...ya(u,m),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...ya(u,m),...y},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...ya(u,m),...y},errors_json:null,duration_ms:c}}function lj(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let 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 cj(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function dj(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(m=>m.state_name===i&&m.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),c=l?.name??i,d=pw(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 uj(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function mj(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function pw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function ya(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function fj(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function pj(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function _j(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function hj(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function gj(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var Ea,Bn,YD,Hn,Nu,zD,_w=E(()=>{"use strict";Ea="project:",Bn="web_project:",YD="prompt:",Hn="default",Nu="Default workspace",zD=new Date(0).toISOString()});import{Buffer as hw}from"node:buffer";function gw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function yw(t){return wj[t]}function Ew(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var yj,Ej,Ta,wj,xu=E(()=>{"use strict";yj=1e4,Ej=256*1024,Ta=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=gw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,yj),this.pushByteCap=gw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,Ej),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=hw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${hw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
|
|
2221
2221
|
[process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
|
|
2222
2222
|
`,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};wj={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function Tw(t,e){t.post("/mailbox/terminal/launch",r=>Tj(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>vj(r,e)),t.get("/mailbox/terminal/sessions",r=>bj(r,e))}async function Tj(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!ww.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=Ew(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=yw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function vj(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!ww.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function bj(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var ww,vw=E(()=>{"use strict";xu();ww=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as Sj}from"node:buffer";function Nj(t){try{return Sj.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function bw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Sw(t){return Aj[t]}function kw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let i=e[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;r.push(e.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var kj,Ij,va,Aj,Ru=E(()=>{"use strict";kj=2e3,Ij=64*1024,va=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=bw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,kj),this.pushByteCap=bw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,Ij),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(e,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=Nj(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,i)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};Aj={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function Nw(t,e){t.post("/mailbox/chat/launch",r=>xj(r,e)),t.post("/mailbox/chat/end/:session_id",r=>Rj(r,e)),t.get("/mailbox/chat/sessions",r=>Lj(r,e))}async function xj(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Iw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=kw(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Sw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function Rj(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Iw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function Lj(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Iw,Aw=E(()=>{"use strict";Ru();Iw=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as Oj}from"node:fs";function Rw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return xw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=Oj(e.path,{encoding:"utf8"});return xw(r)}catch{return[]}}function xw(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var Lw=E(()=>{"use strict"});function Ow(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(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 ba(t,e){let r=t.query(`SELECT id, kind FROM attention
|
|
2223
2223
|
WHERE run_id = ?
|
|
2224
2224
|
AND acknowledged_at IS NULL
|
|
2225
2225
|
AND requires_user = 1
|
|
2226
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Sa=E(()=>{"use strict"});function qw(t,e){t.all("/runtime/*",r=>$j(r.req.raw,e))}async function $j(t,e){try{return Response.json(await Cj(t,e))}catch(r){if(r instanceof le)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function Cj(t,e){let r=new URL(t.url),n=Wj(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Lu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ka(t,n.id,s[2]),Mj(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ka(t,n.id,s[2]);let i=Cw(e.dal,s[4]);return $w(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Lu(t),e.dal.listTeams().map(i=>Uj(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Mw(e.dal,Dw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new le(400,"runtime lead chat body does not match route team");return Pw(t,n.id,o.context),jw(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Mw(e.dal,Dw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new le(400,"runtime lead message body does not match route team");Pw(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new le(400,"runtime lead message requires draft.body");return jw(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ka(t,n.id,s[2]);let i=Cw(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new le(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new le(400,"runtime workflow message requires draft.body");return Pj(e.dal,i,a),$w(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ri(t,n.id),e.dal.listWorkflows().map(i=>qj(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ri(t,n.id);let i=Hj(e.dal,s[2]);return Bj(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ri(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new le(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return Xj(e.dal,i,o).map(l=>Uw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ri(t,n.id);let i=Fw(e.dal,s[2]);return Uw(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ri(t,n.id);let i=Fw(e.dal,s[2]),o=Gj(e.dal,i);return{runId:Du(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new le(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function Mj(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Bw(t,e,r))}}function $w(t,e,r){let n=Bw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:Dj(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:jj(t,r)}}function Bw(t,e,r){let n=Hw(t,r.id),s=$u(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function Dj(t,e){let r=Hw(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:$u(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function jj(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function Pj(t,e,r){let n=Fj(t,e.id);if(n!==null){let s=ba(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new le(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Mt(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new le(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new le(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Hw(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function Fj(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e)[0]??null}function $u(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function Cw(t,e){let r=t.findProjectByName(e);if(r===null)throw new le(404,`project not found: ${e}`);return r}function Mw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new le(404,`team not found: ${e}`);return r}function Dw(t){return t.startsWith("team:")?t.slice(5):t}function Uj(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function jw(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??Ww}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function Wj(t){let e=t.workspaceName??Nt()??fr.default;return{id:e,name:e}}function Lu(t){if(t.headers.get("x-lmctl-workspace-id")!==Ww)throw new le(400,"runtime request requires global-admin workspace identity")}function ka(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new le(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new le(400,"runtime workspace identity does not match route")}function ri(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new le(400,"runtime request requires workspace identity");if(r!==e)throw new le(400,"runtime workspace identity does not match server workspace")}function Pw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new le(400,"workspace manager context requires workspace identity");ka(t,e,r.workspaceId);return}Lu(t)}function Cu(t){return`${Xn}${Mu(t.name)}`}function Mu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Du(t){return`${Ou}${t.id}`}function qj(t){let e=Ia(t.definition);return{id:Cu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function Bj(t){let e=Ia(t.definition);return{id:Cu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ia(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function Hj(t,e){if(!e.startsWith(Xn))throw new le(404,`template not found: ${e}`);let r=e.slice(Xn.length),n=t.listWorkflows().filter(s=>Mu(s.name)===r);if(n.length===0)throw new le(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new le(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Fw(t,e){if(!e.startsWith(Ou))throw new le(404,`run not found: ${e}`);let r=e.slice(Ou.length);if(!/^[1-9]\d*$/.test(r))throw new le(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new le(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new le(404,`run not found: ${e}`);return s}function Xj(t,e,r){if(r!==null){if(!r.startsWith(Xn))return[];let s=r.slice(Xn.length),i=t.listWorkflows().filter(a=>Mu(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function Uw(t,e){let r=t.getWorkflow(e.workflow_id),n=$u(e),s=Jj(r,e);return{id:Du(e),templateId:r===null?`${Xn}unknown`:Cu(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function Jj(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[Ia(t.definition).nameToId.get(r)??r]}function Gj(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ia(r.definition),s=c=>n.nameToId.get(c)??c,i=Du(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=Vj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:d})}let l=t.listSessionEvents(e.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let f=a.find(p=>p.id===c.step_id);return f===void 0?void 0:s(f.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),m={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let f=JSON.parse(c.payload);f!==null&&typeof f=="object"&&!Array.isArray(f)&&(m={...m,...f})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:m})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function Vj(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var Ww,Xn,Ou,le,Xw=E(()=>{"use strict";Fe();Sa();Zt();Ww="global-admin";Xn="template:",Ou="run:";le=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as Kj,writeFileSync as Yj}from"node:fs";import{randomUUID as Jw}from"node:crypto";import{dirname as zj,resolve as Na,sep as Gw}from"node:path";async function Kw(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!rP(n))return t.text("missing image file",400);if(n.size>Zj)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=nP(s);if(i===null||!(i in Vw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=Qj(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?Na(tP()):Na(o.local_path),l=Na(a,"uploads",Jw()),c=Na(l,`${Jw()}${Vw[i]}`);if(!eP(c,a))return t.text("invalid upload path",400);Kj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);Yj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function Qj(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function eP(t,e){let r=e.endsWith(Gw)?e:`${e}${Gw}`;return t.startsWith(r)}function tP(){return zj(ee())}function rP(t){return typeof File<"u"&&t instanceof File}function nP(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var Zj,Vw,Yw=E(()=>{"use strict";Fe();Zj=10*1024*1024,Vw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Aa}from"node:fs";import{basename as sP,dirname as iP,extname as oP,isAbsolute as aP,join as lP,relative as cP}from"node:path";import{fileURLToPath as dP}from"node:url";import{Hono as uP}from"hono";import{serveStatic as jt}from"@hono/node-server/serve-static";function nT(t){let e=new uP,r=[],n=t.localWebui!==void 0?Pu(t.localWebui.webuiDir):mP();if(t.localWebui!==void 0&&lw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=fP();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,jt({root:n})),e.use("/vendor/*",s,jt({root:n})),e.use("/src/*",s,jt({root:n})),e.get("/",s,jt({root:n,path:"index.html"})),e.get("/admin",s,jt({root:n,path:"index.html"})),e.get("/admin/*",s,jt({root:n,path:"index.html"})),e.get("/terminal",s,jt({root:n,path:"index.html"})),e.get("/terminal/*",s,jt({root:n,path:"index.html"})),e.get("/chat",s,jt({root:n,path:"index.html"})),e.get("/chat/*",s,jt({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",Pg({disabled:t.authDisabled})),e.get("/login",s=>s.html(Me("Login",`
|
|
2226
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Sa=E(()=>{"use strict"});function qw(t,e){t.all("/runtime/*",r=>$j(r.req.raw,e))}async function $j(t,e){try{return Response.json(await Cj(t,e))}catch(r){if(r instanceof le)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function Cj(t,e){let r=new URL(t.url),n=Wj(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Lu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ka(t,n.id,s[2]),Mj(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ka(t,n.id,s[2]);let i=Cw(e.dal,s[4]);return $w(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Lu(t),e.dal.listTeams().map(i=>Uj(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Mw(e.dal,Dw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new le(400,"runtime lead chat body does not match route team");return Pw(t,n.id,o.context),jw(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Mw(e.dal,Dw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new le(400,"runtime lead message body does not match route team");Pw(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new le(400,"runtime lead message requires draft.body");return jw(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ka(t,n.id,s[2]);let i=Cw(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new le(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new le(400,"runtime workflow message requires draft.body");return Pj(e.dal,i,a),$w(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ri(t,n.id),e.dal.listWorkflows().map(i=>qj(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ri(t,n.id);let i=Hj(e.dal,s[2]);return Bj(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ri(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new le(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return Xj(e.dal,i,o).map(l=>Uw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ri(t,n.id);let i=Fw(e.dal,s[2]);return Uw(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ri(t,n.id);let i=Fw(e.dal,s[2]),o=Gj(e.dal,i);return{runId:Du(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new le(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function Mj(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Bw(t,e,r))}}function $w(t,e,r){let n=Bw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:Dj(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:jj(t,r)}}function Bw(t,e,r){let n=Hw(t,r.id),s=$u(n);return{id:r.name,workspaceId:e.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function Dj(t,e){let r=Hw(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:$u(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function jj(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function Pj(t,e,r){let n=Fj(t,e.id);if(n!==null){let s=ba(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new le(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Dt(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new le(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new le(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Hw(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",e)[0]??null}function Fj(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e)[0]??null}function $u(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function Cw(t,e){let r=t.findProjectByName(e);if(r===null)throw new le(404,`project not found: ${e}`);return r}function Mw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new le(404,`team not found: ${e}`);return r}function Dw(t){return t.startsWith("team:")?t.slice(5):t}function Uj(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function jw(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??Ww}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function Wj(t){let e=t.workspaceName??Nt()??pr.default;return{id:e,name:e}}function Lu(t){if(t.headers.get("x-lmctl-workspace-id")!==Ww)throw new le(400,"runtime request requires global-admin workspace identity")}function ka(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new le(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new le(400,"runtime workspace identity does not match route")}function ri(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new le(400,"runtime request requires workspace identity");if(r!==e)throw new le(400,"runtime workspace identity does not match server workspace")}function Pw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new le(400,"workspace manager context requires workspace identity");ka(t,e,r.workspaceId);return}Lu(t)}function Cu(t){return`${Xn}${Mu(t.name)}`}function Mu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Du(t){return`${Ou}${t.id}`}function qj(t){let e=Ia(t.definition);return{id:Cu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function Bj(t){let e=Ia(t.definition);return{id:Cu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Ia(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function Hj(t,e){if(!e.startsWith(Xn))throw new le(404,`template not found: ${e}`);let r=e.slice(Xn.length),n=t.listWorkflows().filter(s=>Mu(s.name)===r);if(n.length===0)throw new le(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new le(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Fw(t,e){if(!e.startsWith(Ou))throw new le(404,`run not found: ${e}`);let r=e.slice(Ou.length);if(!/^[1-9]\d*$/.test(r))throw new le(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new le(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new le(404,`run not found: ${e}`);return s}function Xj(t,e,r){if(r!==null){if(!r.startsWith(Xn))return[];let s=r.slice(Xn.length),i=t.listWorkflows().filter(a=>Mu(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function Uw(t,e){let r=t.getWorkflow(e.workflow_id),n=$u(e),s=Jj(r,e);return{id:Du(e),templateId:r===null?`${Xn}unknown`:Cu(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function Jj(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[Ia(t.definition).nameToId.get(r)??r]}function Gj(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Ia(r.definition),s=c=>n.nameToId.get(c)??c,i=Du(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=Vj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:d})}let l=t.listSessionEvents(e.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let f=a.find(p=>p.id===c.step_id);return f===void 0?void 0:s(f.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),m={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let f=JSON.parse(c.payload);f!==null&&typeof f=="object"&&!Array.isArray(f)&&(m={...m,...f})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:m})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function Vj(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var Ww,Xn,Ou,le,Xw=E(()=>{"use strict";Fe();Sa();Qt();Ww="global-admin";Xn="template:",Ou="run:";le=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as Kj,writeFileSync as Yj}from"node:fs";import{randomUUID as Jw}from"node:crypto";import{dirname as zj,resolve as Na,sep as Gw}from"node:path";async function Kw(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!rP(n))return t.text("missing image file",400);if(n.size>Zj)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=nP(s);if(i===null||!(i in Vw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=Qj(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?Na(tP()):Na(o.local_path),l=Na(a,"uploads",Jw()),c=Na(l,`${Jw()}${Vw[i]}`);if(!eP(c,a))return t.text("invalid upload path",400);Kj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);Yj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function Qj(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function eP(t,e){let r=e.endsWith(Gw)?e:`${e}${Gw}`;return t.startsWith(r)}function tP(){return zj(ee())}function rP(t){return typeof File<"u"&&t instanceof File}function nP(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var Zj,Vw,Yw=E(()=>{"use strict";Fe();Zj=10*1024*1024,Vw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Aa}from"node:fs";import{basename as sP,dirname as iP,extname as oP,isAbsolute as aP,join as lP,relative as cP}from"node:path";import{fileURLToPath as dP}from"node:url";import{Hono as uP}from"hono";import{serveStatic as Pt}from"@hono/node-server/serve-static";function nT(t){let e=new uP,r=[],n=t.localWebui!==void 0?Pu(t.localWebui.webuiDir):mP();if(t.localWebui!==void 0&&lw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=fP();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Pt({root:n})),e.use("/vendor/*",s,Pt({root:n})),e.use("/src/*",s,Pt({root:n})),e.get("/",s,Pt({root:n,path:"index.html"})),e.get("/admin",s,Pt({root:n,path:"index.html"})),e.get("/admin/*",s,Pt({root:n,path:"index.html"})),e.get("/terminal",s,Pt({root:n,path:"index.html"})),e.get("/terminal/*",s,Pt({root:n,path:"index.html"})),e.get("/chat",s,Pt({root:n,path:"index.html"})),e.get("/chat/*",s,Pt({root:n,path:"index.html"}))}else e.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return e.use("*",Pg({disabled:t.authDisabled})),e.get("/login",s=>s.html(Me("Login",`
|
|
2227
2227
|
<h1>Login</h1>
|
|
2228
2228
|
<form method="post" action="/login">
|
|
2229
2229
|
<label>Token <input name="token" type="password"></label>
|
|
2230
2230
|
<button type="submit">Login</button>
|
|
2231
2231
|
</form>
|
|
2232
|
-
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Ug(o)?(qd(s,o),s.redirect("/",302)):s.html(Me("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Wg(s),s.redirect("/login",302))),GE(e,{dal:t.dal}),qw(e,{dal:t.dal}),dw(e,{dal:t.dal}),Tw(e,{terminalSessionManager:t.terminalSessionManager}),Nw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=js(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let m=t.dal.listTeamMembers(o.id),f=m.filter(p=>p.state!=="idle");if(f.length>0)return{ok:!1,nonIdle:f.map(p=>({alias:p.alias,state:p.state}))};for(let p of m)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=m.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let m=c.nonIdle.map(f=>`${f.alias}:${f.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${m}`,409)}let d=[],u=[];for(let m of a)try{await md(t.dal,i,m.alias),t.dal.setMemberState(m.id,"idle",null),d.push(m.alias)}catch(f){let p=f instanceof Error?f.message:String(f);t.dal.setMemberState(m.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:m.alias,error:p})}return F(s,{team:i,seeded:d,failed:u},m=>`<p>refreshed team ${b(m.team)}: seeded [${m.seeded.map(f=>b(f)).join(", ")}]${m.failed.length>0?` failed [${m.failed.map(f=>`${b(f.alias)}: ${b(f.error)}`).join(", ")}]`:""}</p>`)}),Vg(e,{dal:t.dal}),ty(e,{dal:t.dal}),e.get("/api/status",s=>F(s,yo(t.dal),wP)),e.get("/api/projects",s=>F(s,Eo(t.dal),TP)),e.get("/api/teams",s=>F(s,Ph(t.dal),SP)),e.get("/api/workflows",s=>F(s,wo(t.dal),kP)),e.get("/api/workflows/verify",s=>{let i=LE();return s.req.header("accept")?.includes("text/plain")?s.text($E(i)):s.json(i)}),e.get("/api/jobs",s=>F(s,Fh(t.dal,{status:s.req.query("status")}),IP)),e.post("/api/uploads",s=>Kw(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=To(t.dal,re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),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 m=t.dal.findProjectByName(i.project);if(m===null)return s.text(`project not found: ${i.project}`,404);o=m.id}else{let m=t.dal.listProjects();m.length===1&&(o=m[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 m=t.dal.getWorkflowByName(i.workflow);if(m===null)return s.text(`workflow not found: ${i.workflow}`,404);a=m.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 F(s,u,fe)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(ca(),BE)),o=To(t.dal,re(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():F(s,i,fe)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():F(s,t.dal.listProjectWorkflows(i.id),vP)}),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 Jn(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{On(d)}catch{return s.text("invalid condition",400)}let u=hP(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let m=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,f=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:m});return F(s,f,fe)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?F(s,{removed:!0},fe):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return i===null?s.notFound():F(s,i,fe)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return i===null?s.notFound():F(s,i,fe)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Zw(s.req.query("status"),gP);if(typeof o=="string")return s.text(o,400);let a=Zw(s.req.query("severity"),iT);return typeof a=="string"?s.text(a,400):F(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")}:{}}),bP)}),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 Jn(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=yP(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=EP(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 F(s,u,fe)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),e.post("/api/issues/:id/claim",async s=>{let i=re(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Jn(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):F(s,c,fe)}),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 Jn(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):F(s,l,fe)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(re(s,"id"));if(i===null)return s.notFound();let o=await Jn(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 F(s,t.dal.closeIssue(re(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),fe)}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(re(s,"id"));if(i===null)return s.notFound();let o=await Jn(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 F(s,t.dal.reopenIssue(re(s,"id"),a),fe)}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 F(s,{...i,owner:a,repo:l},fe)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=re(s,"run_id"),o=s.req.query("kind"),a=Gr(t.dal,i,o);return F(s,a,fe)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=re(s,"run_id"),o=s.req.param("kind"),a=Gr(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):F(s,l,fe);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=pP(l.path);if(_P(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let m=d(l.path),f=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength),p=sP(l.path);return s.body(f,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return F(s,l,fe)}return F(s,l,fe)}),e.get("/api/runs",s=>F(s,Rn(t.dal,{limit:ju(s,"limit")??100}),NP)),e.get("/api/runs/:id",s=>{let i=Jr(t.dal,re(s,"id"));return i===null?s.notFound():F(s,i,AP)}),e.get("/api/runs/:id/where",s=>{let i=Ln(t.dal,re(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(bo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=So(t.dal,re(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ko(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(re(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(xa(t.daemon),F(s,o,Qw)):F(s,o,Qw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=re(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?(xa(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=>zw(s,t.dal,i=>F(s,i,RP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Bh(t.dal,re(s,"id"),re(s,"step_id"));return i===null?s.notFound():sT(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>zw(s,t.dal,i=>{let o=Rw(i);return F(s,o,a=>he(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>F(s,Hh(t.dal,{type:s.req.query("type")}),LP)),e.get("/api/external-signals",s=>F(s,Xh(t.dal,{unhandled:s.req.query("unhandled")==="true"}),OP)),e.get("/api/attentions",s=>F(s,br(t.dal,{unacked:s.req.query("unacked")==="true"}),$P)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(re(s,"id"));return i===null?s.notFound():F(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=vo(t.dal,l);return F(s,c,d=>`<h1>Escalations</h1>${he(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Mt(t.dal,re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),e.post("/api/escalations/:id/respond",async s=>{let i=re(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let f=await s.req.json();typeof f.input=="string"&&(o=f.input),f.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let f=await s.req.parseBody().catch(()=>({}));typeof f.input=="string"&&(o=f.input),(f.done==="true"||f.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Mt(t.dal,i);if(c===null)return s.notFound();let d=br(t.dal).find(f=>f.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let f=t.dal.resumeEscalation(i,o);if(!f.resumed)return s.json({ok:!1,reason:f.reason},400);xa(t.daemon);let p=br(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:f.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 m=t.dal.acknowledgeAttention(i);return xa(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:m?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=Uh(t.dal,{status:o,pr_url:i});return F(s,a,CP)}),e.get("/api/submitted-prs/:id",s=>{let i=re(s,"id"),o=Wh(t.dal,i);return o===null?s.notFound():F(s,o,MP)}),e.get("/api/sessions",s=>F(s,t.dal.latestSessionSizes(),eT)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=js(s.req.param("team_name"));return F(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),eT)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=js(s.req.param("team_name"));try{let o=await Lh(t.dal,i,s.req.param("alias"));return F(s,o,a=>tT("compacted",a.row))}catch(o){if(o instanceof Ds)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=js(s.req.param("team_name")),o=await md(t.dal,i,s.req.param("alias"));return F(s,o,a=>tT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>F(s,r,rT)),e.post("/api/intake/scan",async s=>(r=await Wo(t.dal),F(s,r,rT))),e.get("/api/stats/run-throughput",s=>F(s,Vh(t.dal),DP)),e.get("/api/daemon/state",s=>F(s,t.daemon?.state??null,jP)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return F(s,{disabled:!0},fe);let i=await t.daemon.runCycle();return F(s,{state:t.daemon.state,result:i},fe)}),e.get("/metrics/:project_id",s=>{let i=re(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Ed(t.dal,i),l=wd(t.dal,{project_id:i});return s.html(Me(`Metrics \u2014 ${o.name}`,PP(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=re(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=ju(s,"since_days");return s.json(Ed(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=re(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=ju(s,"since_days");return s.json(wd(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(re(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function zw(t,e,r){let n=yd(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function xa(t){t!==void 0&&t.runCycle().catch(()=>{})}function F(t,e,r,n=200){return sT(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function sT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function mP(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Aa(`${t}/index.html`)?Pu(t):null;let e="src/serve/webui-dist";if(Aa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Aa(`${r}/index.html`))return r;let n=lP(iP(dP(import.meta.url)),"webui-dist");return Aa(`${n}/index.html`)?Pu(n):null}function Pu(t){if(!aP(t))return t;let e=cP(process.cwd(),t);return e.length===0?".":e}function fP(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function ju(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function pP(t){switch(oP(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 _P(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Jn(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 hP(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 Zw(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function yP(t){if(t!=null)return typeof t=="string"&&iT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function EP(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function wP(t){return`<h1>Status</h1><div class="grid">
|
|
2232
|
+
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Ug(o)?(qd(s,o),s.redirect("/",302)):s.html(Me("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Wg(s),s.redirect("/login",302))),GE(e,{dal:t.dal}),qw(e,{dal:t.dal}),dw(e,{dal:t.dal}),Tw(e,{terminalSessionManager:t.terminalSessionManager}),Nw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=js(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let m=t.dal.listTeamMembers(o.id),f=m.filter(p=>p.state!=="idle");if(f.length>0)return{ok:!1,nonIdle:f.map(p=>({alias:p.alias,state:p.state}))};for(let p of m)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=m.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let m=c.nonIdle.map(f=>`${f.alias}:${f.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${m}`,409)}let d=[],u=[];for(let m of a)try{await md(t.dal,i,m.alias),t.dal.setMemberState(m.id,"idle",null),d.push(m.alias)}catch(f){let p=f instanceof Error?f.message:String(f);t.dal.setMemberState(m.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:m.alias,error:p})}return F(s,{team:i,seeded:d,failed:u},m=>`<p>refreshed team ${b(m.team)}: seeded [${m.seeded.map(f=>b(f)).join(", ")}]${m.failed.length>0?` failed [${m.failed.map(f=>`${b(f.alias)}: ${b(f.error)}`).join(", ")}]`:""}</p>`)}),Vg(e,{dal:t.dal}),ty(e,{dal:t.dal}),e.get("/api/status",s=>F(s,yo(t.dal),wP)),e.get("/api/projects",s=>F(s,Eo(t.dal),TP)),e.get("/api/teams",s=>F(s,Ph(t.dal),SP)),e.get("/api/workflows",s=>F(s,wo(t.dal),kP)),e.get("/api/workflows/verify",s=>{let i=LE();return s.req.header("accept")?.includes("text/plain")?s.text($E(i)):s.json(i)}),e.get("/api/jobs",s=>F(s,Fh(t.dal,{status:s.req.query("status")}),IP)),e.post("/api/uploads",s=>Kw(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=To(t.dal,re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),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 m=t.dal.findProjectByName(i.project);if(m===null)return s.text(`project not found: ${i.project}`,404);o=m.id}else{let m=t.dal.listProjects();m.length===1&&(o=m[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 m=t.dal.getWorkflowByName(i.workflow);if(m===null)return s.text(`workflow not found: ${i.workflow}`,404);a=m.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 F(s,u,fe)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(ca(),BE)),o=To(t.dal,re(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():F(s,i,fe)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():F(s,t.dal.listProjectWorkflows(i.id),vP)}),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 Jn(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{On(d)}catch{return s.text("invalid condition",400)}let u=hP(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let m=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,f=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:m});return F(s,f,fe)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?F(s,{removed:!0},fe):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return i===null?s.notFound():F(s,i,fe)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return i===null?s.notFound():F(s,i,fe)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Zw(s.req.query("status"),gP);if(typeof o=="string")return s.text(o,400);let a=Zw(s.req.query("severity"),iT);return typeof a=="string"?s.text(a,400):F(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")}:{}}),bP)}),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 Jn(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=yP(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=EP(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 F(s,u,fe)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),e.post("/api/issues/:id/claim",async s=>{let i=re(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Jn(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):F(s,c,fe)}),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 Jn(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):F(s,l,fe)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(re(s,"id"));if(i===null)return s.notFound();let o=await Jn(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 F(s,t.dal.closeIssue(re(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),fe)}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(re(s,"id"));if(i===null)return s.notFound();let o=await Jn(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 F(s,t.dal.reopenIssue(re(s,"id"),a),fe)}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 F(s,{...i,owner:a,repo:l},fe)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=re(s,"run_id"),o=s.req.query("kind"),a=Gr(t.dal,i,o);return F(s,a,fe)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=re(s,"run_id"),o=s.req.param("kind"),a=Gr(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):F(s,l,fe);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=pP(l.path);if(_P(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let m=d(l.path),f=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength),p=sP(l.path);return s.body(f,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return F(s,l,fe)}return F(s,l,fe)}),e.get("/api/runs",s=>F(s,Rn(t.dal,{limit:ju(s,"limit")??100}),NP)),e.get("/api/runs/:id",s=>{let i=Jr(t.dal,re(s,"id"));return i===null?s.notFound():F(s,i,AP)}),e.get("/api/runs/:id/where",s=>{let i=Ln(t.dal,re(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(bo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=So(t.dal,re(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ko(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(re(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(xa(t.daemon),F(s,o,Qw)):F(s,o,Qw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=re(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?(xa(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=>zw(s,t.dal,i=>F(s,i,RP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Bh(t.dal,re(s,"id"),re(s,"step_id"));return i===null?s.notFound():sT(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>zw(s,t.dal,i=>{let o=Rw(i);return F(s,o,a=>he(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>F(s,Hh(t.dal,{type:s.req.query("type")}),LP)),e.get("/api/external-signals",s=>F(s,Xh(t.dal,{unhandled:s.req.query("unhandled")==="true"}),OP)),e.get("/api/attentions",s=>F(s,Sr(t.dal,{unacked:s.req.query("unacked")==="true"}),$P)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(re(s,"id"));return i===null?s.notFound():F(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=vo(t.dal,l);return F(s,c,d=>`<h1>Escalations</h1>${he(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Dt(t.dal,re(s,"id"));return i===null?s.notFound():F(s,i,fe)}),e.post("/api/escalations/:id/respond",async s=>{let i=re(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let f=await s.req.json();typeof f.input=="string"&&(o=f.input),f.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let f=await s.req.parseBody().catch(()=>({}));typeof f.input=="string"&&(o=f.input),(f.done==="true"||f.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Dt(t.dal,i);if(c===null)return s.notFound();let d=Sr(t.dal).find(f=>f.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let f=t.dal.resumeEscalation(i,o);if(!f.resumed)return s.json({ok:!1,reason:f.reason},400);xa(t.daemon);let p=Sr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:f.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 m=t.dal.acknowledgeAttention(i);return xa(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:m?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=Uh(t.dal,{status:o,pr_url:i});return F(s,a,CP)}),e.get("/api/submitted-prs/:id",s=>{let i=re(s,"id"),o=Wh(t.dal,i);return o===null?s.notFound():F(s,o,MP)}),e.get("/api/sessions",s=>F(s,t.dal.latestSessionSizes(),eT)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=js(s.req.param("team_name"));return F(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),eT)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=js(s.req.param("team_name"));try{let o=await Lh(t.dal,i,s.req.param("alias"));return F(s,o,a=>tT("compacted",a.row))}catch(o){if(o instanceof Ds)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=js(s.req.param("team_name")),o=await md(t.dal,i,s.req.param("alias"));return F(s,o,a=>tT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>F(s,r,rT)),e.post("/api/intake/scan",async s=>(r=await Wo(t.dal),F(s,r,rT))),e.get("/api/stats/run-throughput",s=>F(s,Vh(t.dal),DP)),e.get("/api/daemon/state",s=>F(s,t.daemon?.state??null,jP)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return F(s,{disabled:!0},fe);let i=await t.daemon.runCycle();return F(s,{state:t.daemon.state,result:i},fe)}),e.get("/metrics/:project_id",s=>{let i=re(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Ed(t.dal,i),l=wd(t.dal,{project_id:i});return s.html(Me(`Metrics \u2014 ${o.name}`,PP(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=re(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=ju(s,"since_days");return s.json(Ed(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=re(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=ju(s,"since_days");return s.json(wd(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(re(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function zw(t,e,r){let n=yd(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function xa(t){t!==void 0&&t.runCycle().catch(()=>{})}function F(t,e,r,n=200){return sT(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function sT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function mP(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Aa(`${t}/index.html`)?Pu(t):null;let e="src/serve/webui-dist";if(Aa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Aa(`${r}/index.html`))return r;let n=lP(iP(dP(import.meta.url)),"webui-dist");return Aa(`${n}/index.html`)?Pu(n):null}function Pu(t){if(!aP(t))return t;let e=cP(process.cwd(),t);return e.length===0?".":e}function fP(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function ju(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function pP(t){switch(oP(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 _P(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Jn(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 hP(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 Zw(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function yP(t){if(t!=null)return typeof t=="string"&&iT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function EP(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function wP(t){return`<h1>Status</h1><div class="grid">
|
|
2233
2233
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
2234
2234
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
2235
2235
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -2272,13 +2272,13 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2272
2272
|
<h2>Retry counts (runs with >1 attempt per state)</h2>
|
|
2273
2273
|
${he(["state","retried runs","avg attempts"],o)}
|
|
2274
2274
|
<h2>Tool efficacy</h2>
|
|
2275
|
-
${he(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var gP,iT,oT=E(()=>{"use strict";Pd();Us();Bg();Kg();ry();
|
|
2275
|
+
${he(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var gP,iT,oT=E(()=>{"use strict";Pd();Us();Bg();Kg();ry();Qt();Vd();tw();cw();_w();vw();Aw();Lw();Xw();po();Yw();oa();gP=["open","assigned","closed","reopened"],iT=["low","medium","high","critical"]});function FP(t){return Math.floor(t/6e4)*6e4}function UP(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)WP(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function WP(t,e){let r=Date.now(),n=FP(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let i={};try{i=JSON.parse(e.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let i=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function aT(t,e=250){let r=setInterval(()=>{try{UP(t)}catch{}},e);return{stop(){clearInterval(r)}}}var lT=E(()=>{"use strict"});function BP({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
|
|
2276
2276
|
FROM run r
|
|
2277
2277
|
JOIN job j ON j.id = r.job_id
|
|
2278
2278
|
WHERE j.project_id = ?
|
|
2279
2279
|
AND r.terminal_state IS NOT NULL
|
|
2280
2280
|
ORDER BY r.id DESC
|
|
2281
|
-
LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,qP).length>0))continue;let i=n[0].team_id,o=t.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,cT)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:cT,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function dT(t){for(let e of HP)try{e(t)}catch{}}var qP,cT,HP,uT=E(()=>{"use strict";qP="request_changes",cT="reviewer_rejection_rate_high";HP=[BP]});import{hostname as Fu}from"node:os";function
|
|
2281
|
+
LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,qP).length>0))continue;let i=n[0].team_id,o=t.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,cT)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:cT,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function dT(t){for(let e of HP)try{e(t)}catch{}}var qP,cT,HP,uT=E(()=>{"use strict";qP="request_changes",cT="reviewer_rejection_rate_high";HP=[BP]});import{hostname as Fu}from"node:os";function Lr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let c=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:c}}if(!_T(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid},reclaim_reason:"dead-pid"});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Ra(t){return t.status!=="running"?null:t.holder_host===Fu()&&t.holder_pid!==null&&t.holder_pid>0?mt(t.holder_pid)?"live":"dead":"unknown"}function ir(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&XP(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=JP(t,e,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=t.getAgentInflight(e,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-hT()).toISOString();return _T(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function XP(t){if(t.holder_host===Fu())return mt(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=GP():!1}function JP(t,e,r){let s=t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
|
|
2282
2282
|
FROM tracked_invocation
|
|
2283
2283
|
WHERE target_teamfile = ?
|
|
2284
2284
|
AND target_alias = ?
|
|
@@ -2288,28 +2288,28 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2288
2288
|
LIMIT 1`,e,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Fu())?mt(s.holder_pid)?s:null:pT(s)?s:null}function pT(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=hT():!1}function _T(t,e){return t.holder_pid===null?t.started_at<e:!mt(t.holder_pid)}function hT(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return mT;let r=Number(e);return!Number.isFinite(r)||r<=0?mT:r}function GP(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return fT;let r=Number(e);return!Number.isFinite(r)||r<=0?fT:r}var mT,fT,en=E(()=>{"use strict";Ts();mT=8*60*60*1e3,fT=12e4});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=xe({path:ee()});try{return await e(r)}finally{r.close()}}function J(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function $(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function q(t,e){return t.flags[e]===!0}function Y(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
2289
2289
|
`)}function S(t,e){return t.stderr.write(`error: ${e}
|
|
2290
2290
|
`),1}function Be(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
2291
|
-
`),2}var $e=E(()=>{"use strict";it();Fe()});import{hostname as ET}from"node:os";async function Oa(t){let e=t.finalize??"auto";await $a(t.io,t.env);let r=await O(t.io,f=>f.listEnqueuedRequestMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),n=r.length===0?[]:await O(t.io,f=>f.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,ET())),s=VP(n,t.newMessage,{newMessageFrom:t.newMessageFrom??vT(t.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let i=!1,o=ue(),a=0,l=0,c=0,d={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:s,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{i=!0,o&&(a+=1,c=Buffer.byteLength(f,"utf8"),l+=c),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(d.model=t.receiver.model),t.receiver.effort!==void 0&&(d.effort=t.receiver.effort),d.alias=t.receiver.alias,d.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(d.timeoutMs=t.idleTimeoutMs);let u;try{
|
|
2292
|
-
${i.text}`;return
|
|
2291
|
+
`),2}var $e=E(()=>{"use strict";it();Fe()});import{hostname as ET}from"node:os";async function Oa(t){let e=t.finalize??"auto";await $a(t.io,t.env);let r=await O(t.io,f=>f.listEnqueuedRequestMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),n=r.length===0?[]:await O(t.io,f=>f.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,ET())),s=VP(n,t.newMessage,{newMessageFrom:t.newMessageFrom??vT(t.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let i=!1,o=ue(),a=0,l=0,c=0,d={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:s,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{i=!0,o&&(a+=1,c=Buffer.byteLength(f,"utf8"),l+=c),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(d.model=t.receiver.model),t.receiver.effort!==void 0&&(d.effort=t.receiver.effort),d.alias=t.receiver.alias,d.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(d.timeoutMs=t.idleTimeoutMs);let u;try{or("mailbox_delivery_attempt_started",n,{batch_ids:n.map(f=>f.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId}),await t.onPromptBuilt?.(s),u=await Ct(d)}catch(f){let p=f instanceof Error?f.message:String(f);if(or("mailbox_delivery_attempt_failed",n,{error_message:p}),e==="auto"&&await yT(t.io,n,"provider-or-preflight-error",p),e==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw f}if(o&&je(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return or("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:u.stalledAfterMs,duration_ms:u.durationMs}),e==="auto"&&await yT(t.io,n,"provider-stalled"),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let m=n.map(f=>f.id);return e==="auto"&&await La(t.io,n,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:m,wroteDelta:i,durationMs:u.durationMs}}async function wT(t){await $a(t.io,t.env);let e=await O(t.io,i=>i.listEnqueuedResponseMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await O(t.io,i=>i.claimMailForDelivery(e.map(o=>o.id),new Date().toISOString(),process.pid,ET())),n=KP(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,alias:t.receiver.alias,isLead:t.receiver.isLead};t.receiver.model!==void 0&&(s.model=t.receiver.model),t.receiver.effort!==void 0&&(s.effort=t.receiver.effort),t.idleTimeoutMs!==void 0&&(s.timeoutMs=t.idleTimeoutMs),or("mailbox_delivery_attempt_started",r,{batch_ids:r.map(i=>i.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId});try{let i=await Ct(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
|
|
2292
|
+
${i.text}`;return or("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.stalledAfterMs,duration_ms:i.durationMs}),await La(t.io,r,a),{status:"stalled",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),durationMs:i.durationMs,stalledAfterMs:i.stalledAfterMs}}let o="response delivered; recipient output discarded";return await La(t.io,r,o),{status:"ok",receipt:o,prompt:n,queued:r,deliveredIds:r.map(a=>a.id),durationMs:i.durationMs}}catch(i){let o=i instanceof Error?i.message:String(i),a=`response delivery error: ${o}`;return or("mailbox_delivery_attempt_failed",r,{error_message:o}),await La(t.io,r,a),{status:"error",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),error:o}}}function VP(t,e,r={}){let n=t.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${TT(s)}, sent ${s.created_at}) ---`,s.payload].join(`
|
|
2293
2293
|
`));return e!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,e].join(`
|
|
2294
2294
|
`)),n.join(`
|
|
2295
2295
|
|
|
2296
2296
|
`)}function KP(t){return t.map((r,n)=>[`--- queued response ${n+1} (mail #${r.id}, from ${TT(r)}, sent ${r.created_at}) ---`,r.payload,"","[lmctl] This is a response to your earlier message. Read it and update your context; no follow-up response will be sent."].join(`
|
|
2297
2297
|
`)).join(`
|
|
2298
2298
|
|
|
2299
|
-
`)}function TT(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":vT({teamfile:t.sender_teamfile,alias:t.sender_alias})}function vT(t){return`${t.teamfile}:${t.alias}`}async function La(t,e,r){if(e.length!==0)try{await O(t,n=>{n.markRelayRequestDelivered(e,r,new Date().toISOString())})}catch(n){let s=n instanceof Error?n.message:String(n);
|
|
2300
|
-
`)}}async function yT(t,e,r,n){if(e.length!==0)try{let s=await O(t,i=>e.map(o=>({row:o,cleared:i.reclaimMailboxDeliveryIfUnchanged(o)!==null})));for(let i of s)
|
|
2301
|
-
`)}}async function $a(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-Uu(e)).toISOString())})}catch{}}function Uu(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return gT;let r=Number(e);return!Number.isFinite(r)||r<=0?gT:r}function
|
|
2302
|
-
`);if(e[0]!=="---")throw new
|
|
2303
|
-
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=xT(i)}catch(l){if(l instanceof
|
|
2299
|
+
`)}function TT(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":vT({teamfile:t.sender_teamfile,alias:t.sender_alias})}function vT(t){return`${t.teamfile}:${t.alias}`}async function La(t,e,r){if(e.length!==0)try{await O(t,n=>{n.markRelayRequestDelivered(e,r,new Date().toISOString())})}catch(n){let s=n instanceof Error?n.message:String(n);or("mailbox_delivery_finalize_failed",e,{error_message:s}),t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${s}
|
|
2300
|
+
`)}}async function yT(t,e,r,n){if(e.length!==0)try{let s=await O(t,i=>e.map(o=>({row:o,cleared:i.reclaimMailboxDeliveryIfUnchanged(o)!==null})));for(let i of s)or(i.cleared?"mailbox_delivery_cleared":"mailbox_delivery_clear_skipped",[i.row],{transition:i.cleared?"delivering->pending":"delivering->delivering",reason:r,...n===void 0?{}:{error_message:n}})}catch(s){let i=s instanceof Error?s.message:String(s);or("mailbox_delivery_clear_failed",e,{reason:r,error_message:i,...n===void 0?{}:{causing_error:n}}),t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${i}
|
|
2301
|
+
`)}}async function $a(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-Uu(e)).toISOString())})}catch{}}function Uu(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return gT;let r=Number(e);return!Number.isFinite(r)||r<=0?gT:r}function or(t,e,r={}){let n=new Date().toISOString();for(let s of e)M({event:t,event_at:n,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...r})}var gT,Wu=E(()=>{"use strict";Mt();me();$e();gT=60*60*1e3});import{basename as YP}from"node:path";function kT(t,e){let r=new Date(e.now.getTime()-Or()).toISOString(),n=AT(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=eF(e.sender,n),i=tF(e.sender,n);i!==null&&i.teamfile===e.root&&!ST(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(f=>ST(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,p)=>p-f)[0]??null,d=c!==null&&e.now.getTime()-c<zP,u=qu(e.sender,n).length;return{stop:l.length>=1&&d&&u>=ZP,chain:rF(a)}}function IT(t,e){let r=new Date(e.now.getTime()-Or()).toISOString(),n=AT(t,r),s=qu(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function Or(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return bT;let r=Number(e);return!Number.isFinite(r)||r<=0?bT:r}function NT(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function QP(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 AT(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(QP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function eF(t,e,r={}){let n=new Map;for(let a of e)n.set(tn(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([tn(t)]);for(let a=0;a<64;a+=1){let l=n.get(tn(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:")&&r.includePromptSender!==!0)break;let d=tn(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function qu(t,e){let r=tn(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=tn(l.sender),d=tn(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function tF(t,e){let r=qu(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ST(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function tn(t){return`${t.teamfile}\0${t.alias}`}function rF(t){return t.map(e=>`${YP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var zP,ZP,bT,Ca=E(()=>{"use strict";zP=6e4,ZP=2,bT=8*60*60*1e3});function xT(t){if(t.length===0||!t.startsWith("---"))throw new Ft("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2302
|
+
`);if(e[0]!=="---")throw new Ft("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Ft(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!nF.has(c))throw new Ft(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Ma.join(", ")}`);r[c]=d}if(n===-1)throw new Ft("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Ma)if(r[o]===void 0)throw new Ft(`missing required frontmatter key "${o}" \u2014 required: ${Ma.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var Ma,nF,Ft,RT=E(()=>{"use strict";Ma=["title","description","members"],nF=new Set(Ma),Ft=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as sF,writeFileSync as i5,renameSync as o5,existsSync as OT}from"node:fs";import{basename as iF,resolve as Gn,dirname as Bu}from"node:path";function aF(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];e[s]=i}return e}function lF(t){return/^\s*_MEMBER_\s+\S/.test(t)}function cF(t){return/^\s*_SESSION_\s+\S/.test(t)}function dF(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Da(t){let e=iF(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function nt(t){let e=sF(t,"utf-8"),r=Bu(Gn(t)),n=Xu(e,Da(t),{baseDir:r,sourcePath:Gn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Gn(r,s.sessiondir));return n}function Xu(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2303
|
+
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=xT(i)}catch(l){if(l instanceof Ft)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
2304
2304
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(cF(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(dF(c)||!lF(c))continue;let u=aF(c);for(let p of Object.keys(u))if(!LT.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
2305
|
-
allowed keys: ${LT.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let f={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),n.push(f)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function Ju(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===Hu.toLowerCase());n.length>1&&r.push({field:Hu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Gn(e,i.teamfile):Gn(i.teamfile);if(!OT(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=nt(a),c=
|
|
2305
|
+
allowed keys: ${LT.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let f={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),n.push(f)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function Ju(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===Hu.toLowerCase());n.length>1&&r.push({field:Hu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Gn(e,i.teamfile):Gn(i.teamfile);if(!OT(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=nt(a),c=Ut(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else oF.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Ut(t){return t.members.find(e=>e.alias.toLowerCase()===Hu.toLowerCase())}function Gu(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Gn(e,t.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!OT(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=nt(i),l=Ut(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Gu(l,Bu(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Bu(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function ja(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Hu,oF,LT,ar=E(()=>{"use strict";RT();Hu="Lead",oF=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);LT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as uF}from"node:crypto";import{existsSync as Vu,readFileSync as mF,realpathSync as fF}from"node:fs";import{basename as $T,dirname as pF,resolve as CT}from"node:path";function Ne(t,e){let r=CT(t);if(Vu(r))return fF(r);if(e!==void 0){let n=yF(t,r,e);if(n!==null)return n}return r}function hF(t,e){let r=pF(e),n=Xu(t,Da(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=CT(r,s.sessiondir));return n}function He(t,e){let r=Ne(t,gF(e)?e:void 0);if(Vu(r)){let s=mF(r,"utf8"),i=hF(s,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&EF(i)&&wF(e,r,i,s),i}let n=e?.getRootTeam(r)??null;throw n!==null?new Error(`teamfile missing on disk: ${r} (registered ${n.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function gF(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function yF(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=$T(t),i=Da(t),o=r.listRootTeams().filter(l=>($T(l.teamfile_path)===s||l.name===i)&&Vu(l.teamfile_path));if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function EF(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=_F)}function wF(t,e,r,n){let s={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:uF("sha256").update(n).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(s)}var _F,lr=E(()=>{"use strict";ar();_F=5});import{existsSync as TF}from"node:fs";import{dirname as MT}from"node:path";function SF(t){return vF.test(t)||bF.test(t)}function DT(t){return Pa.test(t)}function rn(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Pa.test(n)?null:{teamfile:r,alias:n}}function De(t,e,r){if(!t.endsWith(".lmctl"))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!DT(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${Pa.source}).`);let n=Ne(t,r);if(r===void 0&&!TF(n))throw new ve(`lmctl: teamfile not found: ${t}`);let s;try{s=He(n,r)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=ja(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
|
|
2306
2306
|
Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=Gu(i,MT(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ve(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
|
|
2307
|
-
Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??MT(n),isLead:
|
|
2307
|
+
Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??MT(n),isLead:Ut(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function $r(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=rn(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?DT(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Pa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
2308
2308
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(SF(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
|
|
2309
2309
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
|
|
2310
2310
|
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.
|
|
2311
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ve,vF,bF,Pa,vt=E(()=>{"use strict";
|
|
2312
|
-
${t.receipt}`:`relay delivery error: ${t.error}`}function MF(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-Uu(e)).toISOString())}function DF(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var UT,BT=E(()=>{"use strict";en();Wu();Ca();vt();Zu();UT=10});function ni(){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 PF(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(HT);jF.has(s)&&r.add(s)}}return r}function XT(t){let e=t.intervalMs??ni(),r=t.runOnceFn??Zr,n=new Set(t.features??PF()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(c=(t.startRollupUpdaterFn??aT)(t.dal));let d=f=>{s.running&&(i=setTimeout(()=>{m.runCycle().finally(()=>d(e))},f))},u=f=>{s.running&&(o=setTimeout(()=>{l===null&&(l=JT(t.dal,n,t.monitorSessionActivityFn??fd,e,s).finally(()=>{l=null})),l.finally(()=>u(pd(t.dal,e)))},f))},m={state:s,runCycle:async()=>(a!==null||(a=FF(t.dal,r,t.collectSessionSizesFn??Rh,t.scanIntakeFn??Wo,t.monitorSessionActivityFn??fd,t.mailboxRelayFn??qT,t.worker_id??"daemon",e,n,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 f=t.firstDelayMs??5e3;d(f),n.has("session-monitor")&&u(f)}return m}async function FF(t,e,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,m=0,f=[],p=null,h=UF();try{if(l.has("durable-memory-policies")&&jE({dal:t}),l.has("drift-detectors")&&dT({dal:t}),l.has("intake")&&(f=await n(t)),l.has("job-worker"))for(;;){let g=await e({dal:t,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let g=await r(t);u=g.recorded,m=g.failed}l.has("session-monitor")&&(p=await JT(t,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=m,c.last_intake_scanned=f.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=f.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=f.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:m,intake:f,session_monitor:p,mailbox_relay:h}}function UF(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function JT(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=pd(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var HT,jF,Qu=E(()=>{"use strict";Pd();ca();_u();po();lT();uT();_d();BT();HT=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],jF=new Set(HT)});function GT(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var VT=E(()=>{"use strict"});import{mkdirSync as WF,readFileSync as qF,readdirSync as BF,statSync as HF,writeFileSync as XF}from"node:fs";import{dirname as JF,join as YT,sep as KT}from"node:path";function qa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case zT:return GF(t,s.input);case ZT:return VF(t,s.input);case QT:return KF(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:rm,GetObjectCommand:tm,PutObjectCommand:em}}}function GF(t,e){let r=ev(t,e.Key);return WF(JF(r),{recursive:!0}),XF(r,e.Body),{}}function VF(t,e){let r=ev(t,e.Key),n;try{n=qF(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function KF(t,e){let r=e.Prefix??"";tv(r);let s=YF(t).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),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 ev(t,e){return tv(e),YT(t,e)}function tv(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function YF(t){let e=[],r=(n,s)=>{let i;try{i=BF(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=YT(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=KT==="/"?a:a.split(KT).join("/");e.push({key:c,lastModified:HF(l).mtime})}}};return r(t,""),e}var zT,ZT,QT,em,tm,rm,nm=E(()=>{"use strict";zT="localfs-put",ZT="localfs-get",QT="localfs-list",em=class{input;_localfsTag=zT;constructor(e){this.input=e}},tm=class{input;_localfsTag=ZT;constructor(e){this.input=e}},rm=class{input;_localfsTag=QT;constructor(e){this.input=e}}});function rv(){return{put:0,get:0,list:0}}function sm(t,e=zF){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function im(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var zF,Ba,om=E(()=>{"use strict";zF={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ba=class{counts=rv();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=rv(),e}estimateCostUsd(e){return sm(this.counts,e)}}});function nv(t){let e=t.now??Date.now,r=t.timers??ZF,n=null,s=null;async function i(){let l=e(),c=im(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),m=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,m)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let f=m;if(t.readUserTotal!==void 0)try{f=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),f=m}let p=sm(f);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===im(e())}}}var ZF,sv=E(()=>{"use strict";om();ZF={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var am=E(()=>{"use strict";pa();ha();ha()});function QF(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function e1(t){return t.reply_to!==void 0&&t.response!==void 0}function t1(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function iv(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Ha,si,ov=E(()=>{"use strict";am();Ha=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},si=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Ha("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=nr(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(iv(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(iv(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 m=this.pending.get(s);m!==void 0&&(this.pending.delete(s),m.abortListener!==void 0&&m.abortSignal!==void 0&&m.abortSignal.removeEventListener("abort",m.abortListener),m.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Ha;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=QF(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(e1(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??t1(e)??n.message_id,i;try{i=await this.requestHandler(n.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:nr(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function lm(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 av=E(()=>{"use strict"});function cm(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var lv=E(()=>{"use strict"});function um(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var dm,cv=E(()=>{"use strict";dm="daemon:events"});function uv(t){return{kind:"prompt",prompt_id:t.prompt_id??nr(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function mm(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 dv,fm=E(()=>{"use strict";am();dv="prompt:root"});function ii(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fv(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function r1(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fv(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function mv(t,e=60){if(typeof t!="string"||t==="")return!0;let r=r1(t);return r===null?!0:Date.now()/1e3>=r-e}function fv(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var pm=E(()=>{"use strict"});async function Xa(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":n1},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let 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 n1,_m=E(()=>{"use strict";n1="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as pv,mkdirSync as _v,readFileSync as hv,writeFileSync as gv}from"node:fs";import{homedir as yv}from"node:os";import{dirname as Ev,join as wv}from"node:path";function oi(){return process.env.LMCTL_DEVICE_AUTH_PATH??wv(yv(),".lmctl","device-auth.json")}function Tv(){return process.env.LMCTL_TOKEN_PATH??wv(yv(),".lmctl","cli-tokens.json")}function hm(t=oi()){try{let e=JSON.parse(hv(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 vv(t,e=oi()){_v(Ev(e),{recursive:!0,mode:448}),gv(e,JSON.stringify(t,null,2));try{pv(e,384)}catch{}}function gm(t,e=Tv()){let r={};try{r=JSON.parse(hv(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};_v(Ev(e),{recursive:!0,mode:448}),gv(e,JSON.stringify(s,null,2));try{pv(e,384)}catch{}}async function bv(t){let e=t.deviceAuthPath??oi(),r=hm(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Xa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return gm({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Tv()),{idToken:n.idToken,userId:r.userId}}var ym=E(()=>{"use strict";_m()});import{existsSync as s1,realpathSync as i1}from"node:fs";import{dirname as o1}from"node:path";function Em(t){a1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function a1(t){let e=t.payload.root_teamfile;try{e=i1(t.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Kn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unavailable"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"root_unregistered"}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=c1(e);if("error"in r)return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Rr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:f1(t.env??process.env)});if(!n.acquired){let s=m1(r.alias,n.current);return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(t.chat??$t)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await d1(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:i.text,status:c,error_detail:null,log:t.log}):Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function Kn(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:l1(t.message)})}function l1(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function c1(t){if(!s1(t))return{error:`prompt root missing/unreadable: ${t}`};let e=nt(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Ft(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??o1(t)}}async function d1(t,e){let r=Iv(e.message),n=e.response===null?null:Iv(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Iv(t){return t.length<=Sv?{text:t,truncated:!1}:{text:t.slice(0,Sv),truncated:!0}}function u1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function m1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:u1(t,e)}function f1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return kv;let r=Number(e);return!Number.isFinite(r)||r<=0?kv:r}var Sv,kv,Nv=E(()=>{"use strict";Ct();or();me();en();Sv=256*1024,kv=30*60*1e3});import{chmodSync as $v,existsSync as p1,mkdirSync as Cv,readFileSync as Ka,writeFileSync as Mv}from"node:fs";import{dirname as wm,resolve as Ja,join as Dv}from"node:path";import{fileURLToPath as _1}from"node:url";import{homedir as jv}from"node:os";import{CognitoIdentityClient as h1,GetIdCommand as g1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Av}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as y1,ListObjectsV2Command as E1,PutObjectCommand as w1,S3Client as xv}from"@aws-sdk/client-s3";function li(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:k1(t.selfUrl),n={},s;for(let I of r)if(p1(I)){n=S1(I),s=I;break}let i=(...I)=>{for(let A of I)if(typeof A=="string"&&A!=="")return A},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??T1,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??v1,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??b1,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",d=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ya,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 m={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return m;let f=e.LMCTL_MAILBOX_POLL_MS,p=f!==void 0&&f.length>0?Number(f):void 0,h=Va(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Va(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Va(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Va(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return m.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...v!==void 0?{tokenPath:v}:{}},m}function S1(t){try{let e=Ka(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function k1(t){let e=wm(_1(t??import.meta.url));return[Ja(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ja(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ja(e,"..","..","..","infra","terraform","terraform.tfstate"),Ja(e,"..","..","infra","terraform","terraform.tfstate")]}function Va(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function I1(t){let e=N1(t.intervalMs)??Pv,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let m of u){let f={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:m.id,root_teamfile:m.root_teamfile,sender_teamfile:m.sender_teamfile,sender_alias:m.sender_alias,receiver_teamfile:m.receiver_teamfile,receiver_alias:m.receiver_alias,message:m.message,response:m.response,status:m.status,created_at:m.created_at}};await t.publishDaemonEvent(f),s!==null&&s.save({cursor_key:s.key,last_pushed_id:m.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,m.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 N1(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Fv(t){let e=t.tokenPath??Dv(jv(),".lmctl","cli-tokens.json"),r=Lv(t.tokenPath);if(mv(r.cognito?.idToken)&&hm()!==null)try{await bv({region:t.region,clientId:t.cognitoClientId??Ya,cliTokensPath:e}),r=Lv(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let te=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${te}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await Ov({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Av({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new xv({region:t.region,credentials:a}),c={ListObjectsV2Command:E1,GetObjectCommand:y1,PutObjectCommand:w1},d=ii(n),u=d??i,m=t.deviceId,f=qn({identityId:i,userId:d,deviceId:m,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(u,f);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let te=!1,B=0;for(;!te&&B<2;){B+=1;try{let k=ma(f,"web"),N=0,L;do{let W=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let P of W.Contents??[]){let D=fa(P.Key??"",f,"web");D!==void 0&&D>N&&(N=D)}L=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(L!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),te=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&R1(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),x1(e),o=!1,i=await Ov({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Av({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new xv({region:t.region,credentials:a}),f=qn({identityId:i,userId:d,deviceId:m,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:f,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,y=t.persistentSessionManager,T=t.promptTriggerStore,v=new Ba,I=new Qr({bucket:t.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...m!==void 0?{deviceId:m}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>v.record(x),onMessage:async x=>{if(_!==void 0&&lm(x.payload)){_.onInbound(x.payload);return}if(y!==void 0&&cm(x.payload)){await y.onInbound(x.payload);return}if(!um(x.payload)){if(T!==void 0&&mm(x.payload)){Em({store:T,payload:x.payload,log:t.log});return}g!==null&&await g.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:u,mailbox_key:f,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new si({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>I.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),y!==void 0&&y.setPublish(async x=>I.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let A=x=>I.putMessage({conversation_id:dm,payload:x});I.start();let X=t.chatLogTailStore===void 0?void 0:I1({store:t.chatLogTailStore,publishDaemonEvent:A,cursorKey:f,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Pv,log:t.log});t.log?.(`[mx-mailbox] agent polling ${f} (bucket=${t.mailboxBucket})`);let ge=t.deviceId??i,U=`${u}/usage/`,j;return j=t.usageStore===void 0?void 0:nv({meter:v,store:t.usageStore,userId:u,deviceId:ge,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:te,ceilingUsd:B})=>{t.log?.(`[usage] month ${x} cost $${te.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),j?.stop()},publishOwnRollup:async(x,te)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${ge}-${x}.json`,Body:JSON.stringify({...te,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let te={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${x}.json`))try{let W=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(W.Body===void 0)continue;let P=JSON.parse(await W.Body.transformToString("utf-8"));te.put+=P.put??0,te.get+=P.get??0,te.list+=P.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return te},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:A,async stop(){X?.stop(),j!==void 0&&(await j.flushNow().catch(()=>{}),j.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function Uv(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:qa(t.rootDir),r=qn({identityId:ai,userId:ai,deviceId:Rv}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new Qr({bucket:"local",identityId:ai,userId:ai,deviceId:Rv,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&lm(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&cm(c.payload)){await i.onInbound(c.payload);return}if(!um(c.payload)){if(o!==void 0&&mm(c.payload)){Em({store:o,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Ga,readIntervalMs:t.readIntervalMs??Ga,heartbeatIdleMs:t.heartbeatIdleMs??Ga,backoffReadIntervalMs:t.backoffReadIntervalMs??Ga});n=new si({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:dm,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ai,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Lv(t){let e=t??Dv(jv(),".lmctl","cli-tokens.json");try{let r=Ka(e,"utf8");return JSON.parse(r)}catch{return{}}}function A1(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ka(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};Cv(wm(t),{recursive:!0,mode:448}),Mv(t,JSON.stringify(n,null,2));try{$v(t,384)}catch{}}function x1(t){let e={};try{let n=Ka(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,Cv(wm(t),{recursive:!0,mode:448}),Mv(t,JSON.stringify(r,null,2));try{$v(t,384)}catch{}}async function Ov(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new h1({region:t.region}).send(new g1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{A1(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function R1(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var Pv,Ga,Ya,T1,v1,b1,ai,Rv,Tm=E(()=>{"use strict";ga();nm();om();sv();ov();av();lv();cv();fm();pa();pm();ym();Nv();Pv=3e3,Ga=1e3,Ya="79u5jhkk46qofog661c9i0bdcs",T1="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",v1="us-east-1_4iUdFggDn",b1="lmctl-next-preview-mailbox-254332045686";ai="local",Rv="local"});import{spawn as km}from"node:child_process";import{createInterface as Wv}from"node:readline";var vm,bm,Sm,qv,Bv=E(()=>{"use strict";Xi();me();vm=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=km(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Wv({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
|
|
2311
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ve,vF,bF,Pa,vt=E(()=>{"use strict";ar();lr();ve=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},vF=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,bF=/^ses_[A-Za-z0-9_-]+$/,Pa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Fa(t){return IF.has(t)}function Yu(){return Ku===null&&(Ku=Lt($t())),Ku}function zu(t,e,r={}){if(!Fa(t))return null;try{let n=Yu().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?qi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?kF[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...jT[t]??[]]}catch{return null}}function Ua(t,e,r={}){let n=zu(t,e,r);return n===null?null:n.join(" ")}function Xe(t,e){return Yu().getSession(t,e)}async function Vn(t){return(await Yu().resolveSessions(t)).map(r=>r.provider.name)}var jT,kF,IF,PT,Ku,cr=E(()=>{"use strict";Mt();ac();jT={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},kF={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]},IF=new Set(Object.keys(jT)),PT=/^[\w.:-]+$/;Ku=null});function NF(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return FT;let r=Number(e);return!Number.isFinite(r)||r<=0?FT:r}async function AF(t,e,r){try{let n=De(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let c=await Vn(s);if(c.length!==1)return null;i=c[0]}let o=await Xe(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 Wa(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??NF(),o=await AF(t,r,n),a=o!==null&&o>=i;return a&&M({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var FT,Zu=E(()=>{"use strict";me();cr();vt();FT=36e5});function xF(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return UT;let r=Number(e);return!Number.isFinite(r)||r<=0?UT:Math.max(1,Math.trunc(r))}async function qT(t){let e=t.env??process.env,r=t.maxBatches??xF(e),n=DF(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};MF(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(WT(l)));if(o===void 0)break;i.add(WT(o)),s.scanned+=1;let a=await RF(t.dal,n,e,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function WT(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function RF(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=ir(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await Wa(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=De(n.receiver_teamfile,n.receiver_alias,t),c=Lr(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:Or(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a=c.lease,n.message_type==="response"){let u=await wT({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r});return $F(u)}let d=await Oa({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return OF(t,d)}catch(l){return LF(t,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{t.releaseAgentInflight(a)}catch{}}}function LF(t,e,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=e.message_type==="response"?t.listEnqueuedResponseMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias):t.listEnqueuedRequestMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias),i=e.message_type==="response"?t.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):t.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function OF(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=CF(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function $F(t){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:t.deliveredIds.length,errors:t.status==="ok"?0:1}}function CF(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
|
|
2312
|
+
${t.receipt}`:`relay delivery error: ${t.error}`}function MF(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-Uu(e)).toISOString())}function DF(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var UT,BT=E(()=>{"use strict";en();Wu();Ca();vt();Zu();UT=10});function ni(){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 PF(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(HT);jF.has(s)&&r.add(s)}}return r}function XT(t){let e=t.intervalMs??ni(),r=t.runOnceFn??Zr,n=new Set(t.features??PF()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(c=(t.startRollupUpdaterFn??aT)(t.dal));let d=f=>{s.running&&(i=setTimeout(()=>{m.runCycle().finally(()=>d(e))},f))},u=f=>{s.running&&(o=setTimeout(()=>{l===null&&(l=JT(t.dal,n,t.monitorSessionActivityFn??fd,e,s).finally(()=>{l=null})),l.finally(()=>u(pd(t.dal,e)))},f))},m={state:s,runCycle:async()=>(a!==null||(a=FF(t.dal,r,t.collectSessionSizesFn??Rh,t.scanIntakeFn??Wo,t.monitorSessionActivityFn??fd,t.mailboxRelayFn??qT,t.worker_id??"daemon",e,n,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 f=t.firstDelayMs??5e3;d(f),n.has("session-monitor")&&u(f)}return m}async function FF(t,e,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,m=0,f=[],p=null,h=UF();try{if(l.has("durable-memory-policies")&&jE({dal:t}),l.has("drift-detectors")&&dT({dal:t}),l.has("intake")&&(f=await n(t)),l.has("job-worker"))for(;;){let g=await e({dal:t,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let g=await r(t);u=g.recorded,m=g.failed}l.has("session-monitor")&&(p=await JT(t,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=m,c.last_intake_scanned=f.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=f.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=f.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:m,intake:f,session_monitor:p,mailbox_relay:h}}function UF(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function JT(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=pd(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var HT,jF,Qu=E(()=>{"use strict";Pd();ca();_u();po();lT();uT();_d();BT();HT=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],jF=new Set(HT)});function GT(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var VT=E(()=>{"use strict"});import{mkdirSync as WF,readFileSync as qF,readdirSync as BF,statSync as HF,writeFileSync as XF}from"node:fs";import{dirname as JF,join as YT,sep as KT}from"node:path";function qa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case zT:return GF(t,s.input);case ZT:return VF(t,s.input);case QT:return KF(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:rm,GetObjectCommand:tm,PutObjectCommand:em}}}function GF(t,e){let r=ev(t,e.Key);return WF(JF(r),{recursive:!0}),XF(r,e.Body),{}}function VF(t,e){let r=ev(t,e.Key),n;try{n=qF(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function KF(t,e){let r=e.Prefix??"";tv(r);let s=YF(t).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),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 ev(t,e){return tv(e),YT(t,e)}function tv(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function YF(t){let e=[],r=(n,s)=>{let i;try{i=BF(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=YT(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=KT==="/"?a:a.split(KT).join("/");e.push({key:c,lastModified:HF(l).mtime})}}};return r(t,""),e}var zT,ZT,QT,em,tm,rm,nm=E(()=>{"use strict";zT="localfs-put",ZT="localfs-get",QT="localfs-list",em=class{input;_localfsTag=zT;constructor(e){this.input=e}},tm=class{input;_localfsTag=ZT;constructor(e){this.input=e}},rm=class{input;_localfsTag=QT;constructor(e){this.input=e}}});function rv(){return{put:0,get:0,list:0}}function sm(t,e=zF){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function im(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var zF,Ba,om=E(()=>{"use strict";zF={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ba=class{counts=rv();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=rv(),e}estimateCostUsd(e){return sm(this.counts,e)}}});function nv(t){let e=t.now??Date.now,r=t.timers??ZF,n=null,s=null;async function i(){let l=e(),c=im(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),m=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,m)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let f=m;if(t.readUserTotal!==void 0)try{f=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),f=m}let p=sm(f);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===im(e())}}}var ZF,sv=E(()=>{"use strict";om();ZF={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var am=E(()=>{"use strict";pa();ha();ha()});function QF(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function e1(t){return t.reply_to!==void 0&&t.response!==void 0}function t1(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function iv(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Ha,si,ov=E(()=>{"use strict";am();Ha=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},si=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Ha("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=sr(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(iv(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(iv(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 m=this.pending.get(s);m!==void 0&&(this.pending.delete(s),m.abortListener!==void 0&&m.abortSignal!==void 0&&m.abortSignal.removeEventListener("abort",m.abortListener),m.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Ha;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=QF(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(e1(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??t1(e)??n.message_id,i;try{i=await this.requestHandler(n.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:sr(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function lm(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 av=E(()=>{"use strict"});function cm(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var lv=E(()=>{"use strict"});function um(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var dm,cv=E(()=>{"use strict";dm="daemon:events"});function uv(t){return{kind:"prompt",prompt_id:t.prompt_id??sr(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function mm(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 dv,fm=E(()=>{"use strict";am();dv="prompt:root"});function ii(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fv(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function r1(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(fv(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function mv(t,e=60){if(typeof t!="string"||t==="")return!0;let r=r1(t);return r===null?!0:Date.now()/1e3>=r-e}function fv(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var pm=E(()=>{"use strict"});async function Xa(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":n1},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let 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 n1,_m=E(()=>{"use strict";n1="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as pv,mkdirSync as _v,readFileSync as hv,writeFileSync as gv}from"node:fs";import{homedir as yv}from"node:os";import{dirname as Ev,join as wv}from"node:path";function oi(){return process.env.LMCTL_DEVICE_AUTH_PATH??wv(yv(),".lmctl","device-auth.json")}function Tv(){return process.env.LMCTL_TOKEN_PATH??wv(yv(),".lmctl","cli-tokens.json")}function hm(t=oi()){try{let e=JSON.parse(hv(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 vv(t,e=oi()){_v(Ev(e),{recursive:!0,mode:448}),gv(e,JSON.stringify(t,null,2));try{pv(e,384)}catch{}}function gm(t,e=Tv()){let r={};try{r=JSON.parse(hv(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};_v(Ev(e),{recursive:!0,mode:448}),gv(e,JSON.stringify(s,null,2));try{pv(e,384)}catch{}}async function bv(t){let e=t.deviceAuthPath??oi(),r=hm(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Xa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return gm({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Tv()),{idToken:n.idToken,userId:r.userId}}var ym=E(()=>{"use strict";_m()});import{existsSync as s1,realpathSync as i1}from"node:fs";import{dirname as o1}from"node:path";function Em(t){a1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function a1(t){let e=t.payload.root_teamfile;try{e=i1(t.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Kn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unavailable"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"root_unregistered"}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=c1(e);if("error"in r)return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Lr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:f1(t.env??process.env)});if(!n.acquired){let s=m1(r.alias,n.current);return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(t.chat??Ct)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await d1(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:i.text,status:c,error_detail:null,log:t.log}):Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Kn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function Kn(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:l1(t.message)})}function l1(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function c1(t){if(!s1(t))return{error:`prompt root missing/unreadable: ${t}`};let e=nt(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Ut(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??o1(t)}}async function d1(t,e){let r=Iv(e.message),n=e.response===null?null:Iv(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Iv(t){return t.length<=Sv?{text:t,truncated:!1}:{text:t.slice(0,Sv),truncated:!0}}function u1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function m1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:u1(t,e)}function f1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return kv;let r=Number(e);return!Number.isFinite(r)||r<=0?kv:r}var Sv,kv,Nv=E(()=>{"use strict";Mt();ar();me();en();Sv=256*1024,kv=30*60*1e3});import{chmodSync as $v,existsSync as p1,mkdirSync as Cv,readFileSync as Ka,writeFileSync as Mv}from"node:fs";import{dirname as wm,resolve as Ja,join as Dv}from"node:path";import{fileURLToPath as _1}from"node:url";import{homedir as jv}from"node:os";import{CognitoIdentityClient as h1,GetIdCommand as g1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Av}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as y1,ListObjectsV2Command as E1,PutObjectCommand as w1,S3Client as xv}from"@aws-sdk/client-s3";function li(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:k1(t.selfUrl),n={},s;for(let I of r)if(p1(I)){n=S1(I),s=I;break}let i=(...I)=>{for(let A of I)if(typeof A=="string"&&A!=="")return A},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??T1,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??v1,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??b1,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",d=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ya,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 m={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return m;let f=e.LMCTL_MAILBOX_POLL_MS,p=f!==void 0&&f.length>0?Number(f):void 0,h=Va(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Va(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Va(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Va(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return m.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...v!==void 0?{tokenPath:v}:{}},m}function S1(t){try{let e=Ka(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function k1(t){let e=wm(_1(t??import.meta.url));return[Ja(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ja(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ja(e,"..","..","..","infra","terraform","terraform.tfstate"),Ja(e,"..","..","infra","terraform","terraform.tfstate")]}function Va(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function I1(t){let e=N1(t.intervalMs)??Pv,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let m of u){let f={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:m.id,root_teamfile:m.root_teamfile,sender_teamfile:m.sender_teamfile,sender_alias:m.sender_alias,receiver_teamfile:m.receiver_teamfile,receiver_alias:m.receiver_alias,message:m.message,response:m.response,status:m.status,created_at:m.created_at}};await t.publishDaemonEvent(f),s!==null&&s.save({cursor_key:s.key,last_pushed_id:m.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,m.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 N1(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Fv(t){let e=t.tokenPath??Dv(jv(),".lmctl","cli-tokens.json"),r=Lv(t.tokenPath);if(mv(r.cognito?.idToken)&&hm()!==null)try{await bv({region:t.region,clientId:t.cognitoClientId??Ya,cliTokensPath:e}),r=Lv(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let te=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${te}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await Ov({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Av({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new xv({region:t.region,credentials:a}),c={ListObjectsV2Command:E1,GetObjectCommand:y1,PutObjectCommand:w1},d=ii(n),u=d??i,m=t.deviceId,f=qn({identityId:i,userId:d,deviceId:m,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(u,f);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let te=!1,B=0;for(;!te&&B<2;){B+=1;try{let k=ma(f,"web"),N=0,L;do{let W=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let P of W.Contents??[]){let D=fa(P.Key??"",f,"web");D!==void 0&&D>N&&(N=D)}L=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(L!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),te=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&R1(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),x1(e),o=!1,i=await Ov({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Av({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new xv({region:t.region,credentials:a}),f=qn({identityId:i,userId:d,deviceId:m,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:f,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,y=t.persistentSessionManager,T=t.promptTriggerStore,v=new Ba,I=new Qr({bucket:t.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...m!==void 0?{deviceId:m}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>v.record(x),onMessage:async x=>{if(_!==void 0&&lm(x.payload)){_.onInbound(x.payload);return}if(y!==void 0&&cm(x.payload)){await y.onInbound(x.payload);return}if(!um(x.payload)){if(T!==void 0&&mm(x.payload)){Em({store:T,payload:x.payload,log:t.log});return}g!==null&&await g.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:u,mailbox_key:f,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new si({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>I.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),y!==void 0&&y.setPublish(async x=>I.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let A=x=>I.putMessage({conversation_id:dm,payload:x});I.start();let X=t.chatLogTailStore===void 0?void 0:I1({store:t.chatLogTailStore,publishDaemonEvent:A,cursorKey:f,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Pv,log:t.log});t.log?.(`[mx-mailbox] agent polling ${f} (bucket=${t.mailboxBucket})`);let ge=t.deviceId??i,U=`${u}/usage/`,j;return j=t.usageStore===void 0?void 0:nv({meter:v,store:t.usageStore,userId:u,deviceId:ge,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:te,ceilingUsd:B})=>{t.log?.(`[usage] month ${x} cost $${te.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),j?.stop()},publishOwnRollup:async(x,te)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${ge}-${x}.json`,Body:JSON.stringify({...te,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let te={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${x}.json`))try{let W=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(W.Body===void 0)continue;let P=JSON.parse(await W.Body.transformToString("utf-8"));te.put+=P.put??0,te.get+=P.get??0,te.list+=P.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return te},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:A,async stop(){X?.stop(),j!==void 0&&(await j.flushNow().catch(()=>{}),j.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function Uv(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:qa(t.rootDir),r=qn({identityId:ai,userId:ai,deviceId:Rv}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new Qr({bucket:"local",identityId:ai,userId:ai,deviceId:Rv,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&lm(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&cm(c.payload)){await i.onInbound(c.payload);return}if(!um(c.payload)){if(o!==void 0&&mm(c.payload)){Em({store:o,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Ga,readIntervalMs:t.readIntervalMs??Ga,heartbeatIdleMs:t.heartbeatIdleMs??Ga,backoffReadIntervalMs:t.backoffReadIntervalMs??Ga});n=new si({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:dm,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:ai,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Lv(t){let e=t??Dv(jv(),".lmctl","cli-tokens.json");try{let r=Ka(e,"utf8");return JSON.parse(r)}catch{return{}}}function A1(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ka(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};Cv(wm(t),{recursive:!0,mode:448}),Mv(t,JSON.stringify(n,null,2));try{$v(t,384)}catch{}}function x1(t){let e={};try{let n=Ka(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,Cv(wm(t),{recursive:!0,mode:448}),Mv(t,JSON.stringify(r,null,2));try{$v(t,384)}catch{}}async function Ov(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new h1({region:t.region}).send(new g1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{A1(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function R1(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var Pv,Ga,Ya,T1,v1,b1,ai,Rv,Tm=E(()=>{"use strict";ga();nm();om();sv();ov();av();lv();cv();fm();pa();pm();ym();Nv();Pv=3e3,Ga=1e3,Ya="79u5jhkk46qofog661c9i0bdcs",T1="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",v1="us-east-1_4iUdFggDn",b1="lmctl-next-preview-mailbox-254332045686";ai="local",Rv="local"});import{spawn as km}from"node:child_process";import{createInterface as Wv}from"node:readline";var vm,bm,Sm,qv,Bv=E(()=>{"use strict";Xi();me();vm=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=km(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Wv({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
|
|
2313
2313
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
|
|
2314
2314
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},bm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=km(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
|
|
2315
2315
|
`);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
|
|
@@ -2317,8 +2317,8 @@ ${t.receipt}`:`relay delivery error: ${t.error}`}function MF(t,e){t.reclaimStale
|
|
|
2317
2317
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
|
|
2318
2318
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
|
|
2319
2319
|
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},qv=t=>{switch(t){case"codex":return new vm;case"claude":case"qwen":return new bm;case"gemini":case"copilot":case"opencode":return new Sm;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as L1}from"node:crypto";import{existsSync as K9,mkdirSync as O1,readFileSync as $1,writeFileSync as C1}from"node:fs";import{homedir as M1}from"node:os";import{dirname as D1,join as j1}from"node:path";function za(){return process.env.LMCTL_DEVICE_FILE??j1(M1(),".lmctl","device.json")}function nn(t=za()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse($1(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Im(t=za()){let e=nn(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:L1(),created_at:new Date().toISOString()};return O1(D1(t),{recursive:!0}),C1(t,`${JSON.stringify(r,null,2)}
|
|
2320
|
-
`,{encoding:"utf8",mode:384}),r}var Nm=E(()=>{"use strict"});import{mkdirSync as P1,readFileSync as Hv,rmSync as F1,writeFileSync as U1}from"node:fs";import{dirname as Xv,join as W1}from"node:path";function
|
|
2321
|
-
`,"utf-8"),r}function Am(t){let e=
|
|
2320
|
+
`,{encoding:"utf8",mode:384}),r}var Nm=E(()=>{"use strict"});import{mkdirSync as P1,readFileSync as Hv,rmSync as F1,writeFileSync as U1}from"node:fs";import{dirname as Xv,join as W1}from"node:path";function Wt(t=ee()){return W1(Xv(t),"serve.pid")}function Jv(t,e){let r=Wt(e);return P1(Xv(r),{recursive:!0}),U1(r,`${JSON.stringify(t,null,2)}
|
|
2321
|
+
`,"utf-8"),r}function Am(t){let e=Wt(t),r;try{r=Hv(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function Yn(t){F1(Wt(t),{force:!0})}function Za(t){let e=q1(t),r=Am(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Np(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function q1(t){let e=Wt(t),r;try{r=Hv(e,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function Gv(){return Bl(process.pid)}var Vv=E(()=>{"use strict";Ts();Fe()});var lb={};pe(lb,{_resetStdoutEpipeGuardForTests:()=>V1,bootstrapAgentRestMailbox:()=>nb,installStdoutEpipeGuard:()=>Qv,publishRegisteredWorkflowsOnStart:()=>rb,resolveLocalMailboxDir:()=>ob,resolveLocalWebuiDir:()=>ib,resolveServeConfig:()=>sb,runServe:()=>J1,runServeStatus:()=>eb,runServeStop:()=>tb,validateServeArgs:()=>ab});import{randomBytes as B1}from"node:crypto";import{existsSync as zv}from"node:fs";import{isIP as Kv}from"node:net";import{homedir as H1}from"node:os";import{isAbsolute as Zv,resolve as xm}from"node:path";async function J1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(X1),0;let r=t[0];return r==="status"?eb(t.slice(1),e):r==="stop"?tb(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?Yv:`error: unknown serve subcommand: ${r}
|
|
2322
2322
|
|
|
2323
2323
|
${Yv.replace(/^error: [^\n]*\n\n/,"")}`),2):G1(t.slice(1),e)}async function G1(t,e){let r=ab(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2324
2324
|
`),2;let n=xe({path:ee()}),s={portCli:nU(t)},i;try{i=sb({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(v){return n.close(),e.stderr.write(`error: ${v instanceof Error?v.message:String(v)}
|
|
@@ -2333,12 +2333,12 @@ ${Yv.replace(/^error: [^\n]*\n\n/,"")}`),2):G1(t.slice(1),e)}async function G1(t
|
|
|
2333
2333
|
`)}catch(v){e.stderr.write(`warning: could not write serve pidfile: ${v instanceof Error?v.message:String(v)}; \`lmctl serve status\`/\`stop\` will not find this daemon
|
|
2334
2334
|
`)}return await new Promise(v=>{let I=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close();try{let A=Am(T);A!==null&&A.pid===process.pid&&Yn(T)}catch{}v()})()};process.once("SIGTERM",I),process.once("SIGINT",I)}),0}function Qv(t){if(t.stdout!==process.stdout||Rm)return;Rm=!0;let e=r=>{throw r.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),r};process.stdout.on("error",e)}function V1(){Rm=!1}async function eb(t,e){return Qv(e),K1(t,e)}async function K1(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
|
|
2335
2335
|
`),2;let r=ee(),n=Za(r);if(n.entry===null)return e.stdout.write(`serve: not running
|
|
2336
|
-
`),e.stdout.write(n.corrupt?` unreadable pidfile at ${
|
|
2336
|
+
`),e.stdout.write(n.corrupt?` unreadable pidfile at ${Wt(r)} (could not parse)
|
|
2337
2337
|
run \`lmctl serve stop\` to clear it
|
|
2338
|
-
`:` no pidfile at ${
|
|
2338
|
+
`:` no pidfile at ${Wt(r)}
|
|
2339
2339
|
`),0;if(n.stale)return e.stdout.write(`serve: not running
|
|
2340
|
-
`),e.stdout.write(n.staleReason==="pid-reused"?` stale pidfile at ${
|
|
2341
|
-
`:` stale pidfile at ${
|
|
2340
|
+
`),e.stdout.write(n.staleReason==="pid-reused"?` stale pidfile at ${Wt(r)} (pid ${n.entry.pid} is alive but is NOT this daemon \u2014 pid reused)
|
|
2341
|
+
`:` stale pidfile at ${Wt(r)} (recorded pid ${n.entry.pid} is not alive)
|
|
2342
2342
|
`),e.stdout.write(" run `lmctl serve stop` to clear it\n"),0;let s=n.entry;e.stdout.write(n.unverified?`serve: running (identity UNVERIFIED)
|
|
2343
2343
|
`:`serve: running
|
|
2344
2344
|
`),n.unverified&&(e.stdout.write(` warning could not confirm this pid is our daemon (no/unreadable identity token)
|
|
@@ -2358,7 +2358,7 @@ ${Yv.replace(/^error: [^\n]*\n\n/,"")}`),2):G1(t.slice(1),e)}async function G1(t
|
|
|
2358
2358
|
`),0;let{pid:o,port:a}=i.entry;if(i.unverified===!0)return e.stderr.write(`error: refusing to stop pid ${o}: cannot confirm it is this workspace's daemon (the pidfile has no usable identity token \u2014 it likely predates identity tracking, or /proc is unreadable here).
|
|
2359
2359
|
verify with: ps -p ${o} -o pid,lstart,args
|
|
2360
2360
|
then either: kill ${o} (if it IS the daemon)
|
|
2361
|
-
or: rm ${
|
|
2361
|
+
or: rm ${Wt(s)} (if it is not)
|
|
2362
2362
|
`),1;try{process.kill(o,"SIGTERM")}catch(c){return(c!==null&&typeof c=="object"&&"code"in c?c.code:void 0)==="ESRCH"?(Yn(s),e.stdout.write(`serve: not running (pid ${o} already gone); cleared stale pidfile
|
|
2363
2363
|
`),0):(e.stderr.write(`error: could not signal pid ${o}: ${c instanceof Error?c.message:String(c)}
|
|
2364
2364
|
`),1)}let l=Date.now()+n;for(;Date.now()<l;){if(!mt(o))return Yn(s),e.stdout.write(`serve: stopped (pid ${o}, port ${a})
|
|
@@ -2427,19 +2427,19 @@ unauthenticated daemon.
|
|
|
2427
2427
|
lmctl serve stop
|
|
2428
2428
|
|
|
2429
2429
|
Run 'lmctl serve --help' for details.
|
|
2430
|
-
`;Rm=!1;Y1=2e3;Z1=100,Q1=1e4});import{existsSync as oU,mkdirSync as aU,readFileSync as lU,renameSync as cU,unlinkSync as dU,writeFileSync as uU}from"node:fs";import{homedir as ub}from"node:os";import{dirname as ci,join as bt,resolve as mU}from"node:path";function es(t,e,r){let n=ci(mU(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())
|
|
2431
|
-
`,"utf8"),dt.renameSync(r,t)}catch(n){try{dt.unlinkSync(r)}catch{}throw n}}function _U(t,e){dt.mkdirSync(ci(t),{recursive:!0});let r=bt(ci(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{dt.writeFileSync(r,e,"utf8"),dt.renameSync(r,t)}catch(n){try{dt.unlinkSync(r)}catch{}throw n}}function
|
|
2430
|
+
`;Rm=!1;Y1=2e3;Z1=100,Q1=1e4});import{existsSync as oU,mkdirSync as aU,readFileSync as lU,renameSync as cU,unlinkSync as dU,writeFileSync as uU}from"node:fs";import{homedir as ub}from"node:os";import{dirname as ci,join as bt,resolve as mU}from"node:path";function es(t,e,r){let n=ci(mU(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Cr(bt(o,".mcp.json"),"mcpServers",[zn(),Zn()]),a.has("opencode")&&Cr(bt(o,".opencode","opencode.json"),"mcp",[pb(),_b()]);for(let o of s)hU(o)}function fb(t=mb??ub()){return bt(t,".copilot","mcp-config.json")}function pU(t,e){dt.mkdirSync(ci(t),{recursive:!0});let r=bt(ci(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{dt.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
2431
|
+
`,"utf8"),dt.renameSync(r,t)}catch(n){try{dt.unlinkSync(r)}catch{}throw n}}function _U(t,e){dt.mkdirSync(ci(t),{recursive:!0});let r=bt(ci(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{dt.writeFileSync(r,e,"utf8"),dt.renameSync(r,t)}catch(n){try{dt.unlinkSync(r)}catch{}throw n}}function Cr(t,e,r){try{if(!dt.existsSync(t))return;let n=JSON.parse(dt.readFileSync(t,"utf8"));if(!Qn(n)||!Qn(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,pU(t,n),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function zn(){return{name:el,shouldRemove:SU}}function pb(){return{name:el,shouldRemove:kU}}function Zn(){return{name:Qa,shouldRemove:vU}}function _b(){return{name:Qa,shouldRemove:bU}}function hU(t){let e=mb??ub();switch(t){case"copilot":Cr(fb(e),"mcpServers",[zn(),Zn()]);return;case"claude":Cr(bt(e,".claude.json"),"mcpServers",[zn(),Zn()]);return;case"gemini":Cr(bt(e,".gemini","settings.json"),"mcpServers",[zn(),Zn()]);return;case"qwen":Cr(bt(e,".qwen","settings.json"),"mcpServers",[zn(),Zn()]);return;case"agy":Cr(bt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[zn(),Zn()]);return;case"opencode":Cr(bt(e,".config","opencode","opencode.json"),"mcp",[pb(),_b()]);return;case"codex":gU(bt(e,".codex","config.toml"));return;default:return}}function gU(t){try{if(!dt.existsSync(t))return;let e=dt.readFileSync(t,"utf8"),r=yU(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=hb(l);if(c===null)return;if(c!==void 0){if(db(c,r)){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=wU(l);if(d===null)return;if(d!==void 0&&db(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;_U(t,s.join(`
|
|
2432
2432
|
`)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function db(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function yU(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=hb(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=EU(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Qa&&c[1]!==el)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=gb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=TU(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let n=new Set;for(let[s,i]of e.entries())s===Qa&&Eb(i.command,i.args)&&n.add(s),s===el&&wb(i.command,i.args)&&n.add(s);return n}function EU(t,e){if(t.startsWith("mcp_servers"))return tl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=tl(t);return r===null?null:[...e,...r]}function hb(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:tl(e[1])}function wU(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return tl(r)}function tl(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function gb(t){let e=yb(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function TU(t){let e=yb(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>gb(s.trim()));return n.some(s=>s===null)?null:n}function yb(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function vU(t){return Qn(t)?t.type==="stdio"&&typeof t.command=="string"&&Eb(t.command,t.args):!1}function bU(t){return!Qn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&vb(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 SU(t){return Qn(t)?t.type==="stdio"&&wb(t.command,t.args):!1}function kU(t){return!Qn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&bb(t.command[0])&&t.command[1]==="mcp"}function Eb(t,e){return vb(t)&&Sb(e)||Tb(t,e)}function wb(t,e){return bb(t)&&Sb(e)}function Tb(t,e){return IU(t)&&Array.isArray(e)&&e.length===2&&NU(e[0])&&e[1]==="mcp"}function vb(t){return typeof t=="string"&&Lm(t)==="lmctl"}function bb(t){return typeof t=="string"&&Lm(t)==="lmctl0"}function IU(t){if(typeof t!="string")return!1;let e=Lm(t).toLowerCase();return e==="node"||e==="node.exe"}function NU(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 Lm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function Sb(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function Qn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Qa,el,fU,dt,mb,di=E(()=>{"use strict";me();Qa="lmctl",el="lmctl0",fU={existsSync:oU,mkdirSync:aU,readFileSync:lU,writeFileSync:uU,renameSync:cU,unlinkSync:dU},dt=fU});function Nb(t){let e=kb(t.registry,t.fromTeamfile);if(e===void 0)return ts(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Ib(e,t.fromAlias))return ts(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=kb(t.registry,t.toTeamfile);return r===void 0?ts(`target team is not registered in policy graph: ${t.toTeamfile}`):Ib(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?ts(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?ts(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:ts(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function kb(t,e){return t.teams.find(r=>r.teamfile===e)}function Ib(t,e){return t.aliases.some(r=>r===e)}function ts(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Ab=E(()=>{"use strict"});import{randomUUID as AU}from"node:crypto";import{hostname as xb,networkInterfaces as xU}from"node:os";function Rb(t){let e=(t.now??new Date).toISOString();return{lock_id:AU(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??xb(),holder_ips:t.ips??CU(),started_at:e,last_heartbeat:e}}function Lb(t=process.env){return Ob(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,RU)}function OU(t=process.env){return Ob(t.LMCTL_TERMINAL_LOCK_STALE_MS,LU)}function Om(t,e={}){let r=e.now??new Date,n=e.localHost??xb(),s=e.staleMs??OU();if(t.holder_host===n)return(e.isProcessAlive??$U)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function $m(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Ob(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function $U(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 CU(){let t=new Set;for(let e of Object.values(xU()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var RU,LU,Cm=E(()=>{"use strict";RU=15e3,LU=12e4});function Mm(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2433
2433
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
2434
2434
|
not officially supported.
|
|
2435
|
-
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function
|
|
2435
|
+
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Mr(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
2436
2436
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
2437
2437
|
Consulted ${ms(Nt(),ee())}
|
|
2438
2438
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function $b(t){return`unknown option --from
|
|
2439
|
-
${Mm(t)}`}function Cb(t,e){let r=rs(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function rs(t,e){let r=t[As];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=He(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var ui=E(()=>{"use strict";ft();Fe();
|
|
2440
|
-
`}),i=await FU(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:m,rootTeamfile:f,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:u.origin}),o=qU(r,i);try{es(r,nt(d),d)}catch{}n={root_teamfile:f,sender_teamfile:m?.teamfile??null,sender_alias:m?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,receiver_provider:c.provider,receiver_session_id:c.sessionid,origin:u.origin,policy:p};let h=await Pb(r,d,c.alias);if(h!==null){let I=$m(h);if(m!==null){let A=await Dm(r,{sender:m,receiverTeamfile:d,receiverAlias:c.alias,receiverProvider:c.provider,receiverSessionId:c.sessionid,rootTeamfile:f,payload:t.prompt});return a=nl(`enqueued mailbox message ${A.id}`,null),jm(A.id,m,d,c.alias)}return ns(i,n,t.prompt,I,"unavailable"),a=Pm(I,null),{status:"busy",message:I,teamChatLogId:null}}let g=await jU(r,d,c.alias);if(g.busy){if(m!==null){let A=await Dm(r,{sender:m,receiverTeamfile:d,receiverAlias:c.alias,receiverProvider:c.provider,receiverSessionId:c.sessionid,rootTeamfile:f,payload:t.prompt});return a=nl(`enqueued mailbox message ${A.id}`,null),jm(A.id,m,d,c.alias)}let I=await PU(r,d,c.alias);return ns(i,n,t.prompt,I,"unavailable"),a=Pm(I,null),{status:"busy",message:I,teamChatLogId:null}}if(m!==null&&m.teamfile!==d){let I=await O(r,A=>kT(A,{root:f,sender:m,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(I.stop){let A=NT(I.chain);return ns(i,n,t.prompt,A,"cycle"),a=sl(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null}}}let _=await KU(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:m?.teamfile??d,sender_alias:m?.alias??"operator",...g.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!_.acquired){let I=Fb(d,c.alias,_.current);if(m!==null){let A=await Dm(r,{sender:m,receiverTeamfile:d,receiverAlias:c.alias,receiverProvider:c.provider,receiverSessionId:c.sessionid,rootTeamfile:f,payload:t.prompt});return a=nl(`enqueued mailbox message ${A.id}`,null),jm(A.id,m,d,c.alias)}return ns(i,n,t.prompt,I,"unavailable"),a=Pm(I,null),{status:"busy",message:I,teamChatLogId:null}}s=_.lease;let y=await Oa({sender:m??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,newMessageFrom:m===null?"operator":`${m.teamfile}:${m.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:I=>e({kind:"delta",chunk:I}),onProgress:I=>e({kind:"progress",alias:c.alias,event:I}),onPromptBuilt:I=>{if(l=I,i!==null)return WU(r,i,I)}});l=y.prompt;let T=y.status==="stalled",v=null;if(T){let I=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;ns(i,n,l,I,"error"),a=sl(I,null,y.receipt)}else v=await zU(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=nl(y.receipt,v);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:v,durationMs:y.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return ns(i,n,l,d,"error"),a=sl(d,null),{status:"error",errorKind:c instanceof ve?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await YU(r,s),i!==null&&await UU(r,i,a??sl("chat turn exited without a terminal outcome",null))}}function DU(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function jU(t,e,r){let n=await O(t,i=>
|
|
2439
|
+
${Mm(t)}`}function Cb(t,e){let r=rs(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function rs(t,e){let r=t[As];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=He(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var ui=E(()=>{"use strict";ft();Fe();lr()});function Je(t){let e=rn(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var rl=E(()=>{"use strict";vt()});async function il(t){let e=t.onEvent??(()=>{}),r=DU(t.io,e),n=null,s=null,i=null,o,a=null,l=t.prompt;try{let c=await O(r,I=>De(t.teamfile,t.alias,I)),d=c.teamfile,u=await O(r,I=>HU(I,t.env??process.env)),m=u.sender,f=await XU(r,{explicitRoot:t.rootFlag,sender:m,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=m===null?null:await JU(r,{rootTeamfile:f,sender:m,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
|
|
2440
|
+
`}),i=await FU(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:m,rootTeamfile:f,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:u.origin}),o=qU(r,i);try{es(r,nt(d),d)}catch{}n={root_teamfile:f,sender_teamfile:m?.teamfile??null,sender_alias:m?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,receiver_provider:c.provider,receiver_session_id:c.sessionid,origin:u.origin,policy:p};let h=await Pb(r,d,c.alias);if(h!==null){let I=$m(h);if(m!==null){let A=await Dm(r,{sender:m,receiverTeamfile:d,receiverAlias:c.alias,receiverProvider:c.provider,receiverSessionId:c.sessionid,rootTeamfile:f,payload:t.prompt});return a=nl(`enqueued mailbox message ${A.id}`,null),jm(A.id,m,d,c.alias)}return ns(i,n,t.prompt,I,"unavailable"),a=Pm(I,null),{status:"busy",message:I,teamChatLogId:null}}let g=await jU(r,d,c.alias);if(g.busy){if(m!==null){let A=await Dm(r,{sender:m,receiverTeamfile:d,receiverAlias:c.alias,receiverProvider:c.provider,receiverSessionId:c.sessionid,rootTeamfile:f,payload:t.prompt});return a=nl(`enqueued mailbox message ${A.id}`,null),jm(A.id,m,d,c.alias)}let I=await PU(r,d,c.alias);return ns(i,n,t.prompt,I,"unavailable"),a=Pm(I,null),{status:"busy",message:I,teamChatLogId:null}}if(m!==null&&m.teamfile!==d){let I=await O(r,A=>kT(A,{root:f,sender:m,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(I.stop){let A=NT(I.chain);return ns(i,n,t.prompt,A,"cycle"),a=sl(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null}}}let _=await KU(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:m?.teamfile??d,sender_alias:m?.alias??"operator",...g.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!_.acquired){let I=Fb(d,c.alias,_.current);if(m!==null){let A=await Dm(r,{sender:m,receiverTeamfile:d,receiverAlias:c.alias,receiverProvider:c.provider,receiverSessionId:c.sessionid,rootTeamfile:f,payload:t.prompt});return a=nl(`enqueued mailbox message ${A.id}`,null),jm(A.id,m,d,c.alias)}return ns(i,n,t.prompt,I,"unavailable"),a=Pm(I,null),{status:"busy",message:I,teamChatLogId:null}}s=_.lease;let y=await Oa({sender:m??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,newMessageFrom:m===null?"operator":`${m.teamfile}:${m.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:I=>e({kind:"delta",chunk:I}),onProgress:I=>e({kind:"progress",alias:c.alias,event:I}),onPromptBuilt:I=>{if(l=I,i!==null)return WU(r,i,I)}});l=y.prompt;let T=y.status==="stalled",v=null;if(T){let I=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;ns(i,n,l,I,"error"),a=sl(I,null,y.receipt)}else v=await zU(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=nl(y.receipt,v);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:v,durationMs:y.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return ns(i,n,l,d,"error"),a=sl(d,null),{status:"error",errorKind:c instanceof ve?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await YU(r,s),i!==null&&await UU(r,i,a??sl("chat turn exited without a terminal outcome",null))}}function DU(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function jU(t,e,r){let n=await O(t,i=>ir(i,e,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>Wa(i,n,e,r));return{busy:!s,idleReclaim:s}}async function PU(t,e,r){let n=await Pb(t,e,r);if(n!==null)return $m(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?Fb(e,r,s):`${r} is busy; wait and retry`}async function Dm(t,e){return await $a(t,t.env??process.env),await O(t,r=>{let n=De(e.sender.teamfile,e.sender.alias,r);return r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,sender_provider:n.provider,sender_session_id:n.sessionid,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,receiver_provider:e.receiverProvider,receiver_session_id:e.receiverSessionId,root_teamfile:e.rootTeamfile,payload:e.payload})})}function jm(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function FU(t,e){try{return(await O(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:BU(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ue()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function UU(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function WU(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function qU(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ue()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},MU);return r.unref?.(),r}function nl(t,e){return{status:"done",result_summary:mi(t),error:null,team_chat_log_id:e}}function Pm(t,e){return{status:"busy",result_summary:mi(t),error:t,team_chat_log_id:e}}function sl(t,e,r){return{status:"error",result_summary:mi(r===void 0?t:r),error:t,team_chat_log_id:e}}function mi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function BU(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function HU(t,e){let r=Cb(e,t);if(r.ok)return{sender:Je(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Mr("chat"))}async function XU(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>Ne(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>IT(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function JU(t,e){return await O(t,r=>Nb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:GU(r,e.sender.teamfile,e.receiverTeamfile)}))}function GU(t,e,r){return{teams:[e,r].map(s=>VU(s,t))}}function VU(t,e){let r=He(t,e),n=Ut(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function KU(t,e){return await O(t,r=>{let n=ue(),s=Lr(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Or(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Db(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Db(s.current)})),{acquired:!1,current:s.current})})}async function Pb(t,e,r){return await O(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(Om(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:Om(s).live?s:null})}function Db(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 YU(t,e){try{await O(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
2441
2441
|
`)}}function Fb(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function zU(t,e){let r=jb(e.message),n=e.response===null?null:jb(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:r.text,response:n?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
2442
|
-
`),null}}function ns(t,e,r,n,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:n,message_preview:mi(r)})}function jb(t){return t.length<=Mb?{text:t,truncated:!1}:{text:t.slice(0,Mb),truncated:!0}}var Mb,MU,Fm=E(()=>{"use strict";vt();
|
|
2442
|
+
`),null}}function ns(t,e,r,n,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:n,message_preview:mi(r)})}function jb(t){return t.length<=Mb?{text:t,truncated:!1}:{text:t.slice(0,Mb),truncated:!0}}var Mb,MU,Fm=E(()=>{"use strict";vt();ar();di();Ab();lr();Ca();me();$e();en();Zu();Cm();ui();rl();Wu();Mb=256*1024,MU=3e4});var Xb={};pe(Xb,{parseIdleTimeoutMs:()=>Bb,resolvePromptInput:()=>qb,runChat:()=>eW});import{readFileSync as ZU}from"node:fs";async function eW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Wb}
|
|
2443
2443
|
`),t.length===0?2:0;let n=tW(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
2444
2444
|
${Wb}
|
|
2445
2445
|
`),2;if(n.promptFile!==void 0){let u=await qb(n.promptFile,e);if(typeof u!="string")return e.stderr.write(`error: ${u.error}
|
|
@@ -2449,11 +2449,11 @@ ${Wb}
|
|
|
2449
2449
|
`),1;if(p.kind==="workflow_escalation"){if(n.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
|
|
2450
2450
|
`),2;let h=m.resumeEscalation(p.attention_id,n.prompt);return h.resumed===!0?(e.stdout.write(`run ${u}: escalation resumed (decision: ${n.prompt})
|
|
2451
2451
|
`),0):(e.stderr.write(`error: run ${u}: resumeEscalation failed (${h.reason})
|
|
2452
|
-
`),1)}if(p.kind==="interactive_waiting_operator"){let h=
|
|
2452
|
+
`),1)}if(p.kind==="interactive_waiting_operator"){let h=Dt(m,p.attention_id);if(h===null||h.step_id===null)return e.stderr.write(`error: run ${u}: pending interactive_waiting_operator attention has no associated interactive step
|
|
2453
2453
|
`),1;let g=m.resumeInteractive(h.step_id,n.prompt,n.done===!0);return g.resumed===!0?(e.stdout.write(`run ${u}: interactive resumed (step ${h.step_id}${n.done===!0?", done":""})
|
|
2454
2454
|
`),0):(e.stderr.write(`error: run ${u}: resumeInteractive failed (${g.reason})
|
|
2455
2455
|
`),1)}return e.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
|
|
2456
|
-
`),1})}let s
|
|
2456
|
+
`),1})}let s=$r(QU,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
|
|
2457
2457
|
`),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
|
|
2458
2458
|
`),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
|
|
2459
2459
|
`),2;let u=await il({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:m=>sW(e,m)});return n.json===!0?u.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
|
|
@@ -2469,7 +2469,7 @@ ${Wb}
|
|
|
2469
2469
|
`):e.stdout.write(`${u.replyText}${u.replyText.endsWith(`
|
|
2470
2470
|
`)?"":`
|
|
2471
2471
|
`}`),u.status==="stalled"?1:0)}else{if(s.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
|
|
2472
|
-
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ue(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),e.stdout.write(p)},onProgress:p=>Hb(e,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let m=await
|
|
2472
|
+
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ue(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),e.stdout.write(p)},onProgress:p=>Hb(e,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let m=await Ct(u);a&&je(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:d,tailPreview:nW(m.text,200)}));let f=m.status==="stalled";return o?m.text.endsWith(`
|
|
2473
2473
|
`)||e.stdout.write(`
|
|
2474
2474
|
`):e.stdout.write(`${m.text}${m.text.endsWith(`
|
|
2475
2475
|
`)?"":`
|
|
@@ -2482,7 +2482,7 @@ ${Wb}
|
|
|
2482
2482
|
`),s}async function rW(t){let e=[];for await(let r of t)e.push(typeof r=="string"?Buffer.from(r,"utf8"):r);return Buffer.concat(e).toString("utf8")}function Bb(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Hb(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
2483
2483
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
2484
2484
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
2485
|
-
`)}function nW(t,e){return t.slice(-e)}function sW(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Hb(t,e.alias,e.event):t.stderr.write(e.message)}var QU,Wb,Jb=E(()=>{"use strict";
|
|
2485
|
+
`)}function nW(t,e){return t.slice(-e)}function sW(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Hb(t,e.alias,e.event):t.stderr.write(e.message)}var QU,Wb,Jb=E(()=>{"use strict";Mt();ql();$e();vt();Fm();ui();me();Sa();Qt();QU={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Wb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2486
2486
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
2487
2487
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
2488
2488
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -2500,14 +2500,14 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
|
|
|
2500
2500
|
your file-writing tool (not echo/heredoc), then pass --prompt-file.
|
|
2501
2501
|
--permission-mode defaults to yolo.
|
|
2502
2502
|
|
|
2503
|
-
Send a prompt to a team member or raw provider session, or answer a paused run.`});function fi(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=iW.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:oW(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function oW(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=aW(e,n);try{let o=lW(t,s),a=Gb(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=mW(o,1);a=Gb(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function aW(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function lW(t,e){let r=Vb(e,!1).formatToParts(t);return{year:
|
|
2503
|
+
Send a prompt to a team member or raw provider session, or answer a paused run.`});function fi(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=iW.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:oW(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function oW(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=aW(e,n);try{let o=lW(t,s),a=Gb(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=mW(o,1);a=Gb(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function aW(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function lW(t,e){let r=Vb(e,!1).formatToParts(t);return{year:dr(r,"year"),month:dr(r,"month"),day:dr(r,"day")}}function Gb(t,e,r,n,s,i){let o=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=cW(new Date(o),i);o=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(o)}function cW(t,e){let r=Vb(e,!0).formatToParts(t);return Date.UTC(dr(r,"year"),dr(r,"month")-1,dr(r,"day"),dr(r,"hour"),dr(r,"minute"),dr(r,"second"),0)-t.getTime()}function Vb(t,e){let r=e?uW:dW,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function dr(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function mW(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var iW,dW,uW,Um=E(()=>{"use strict";iW=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;dW=new Map,uW=new Map});var zb={};pe(zb,{runRecover:()=>pW});import{dirname as Kb,resolve as Yb}from"node:path";async function pW(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Wm}
|
|
2504
2504
|
`),0;let n=J(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return S(e,`${n.error}
|
|
2505
2505
|
|
|
2506
2506
|
${Wm}`);if(n.positionals.length===0)return S(e,`recover requires a <teamfile>
|
|
2507
2507
|
|
|
2508
2508
|
${Wm}`);if(n.positionals.length>2)return S(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=rn(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return S(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(q(n,"--all")&&l!==void 0)return S(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await _W(e,o,l)}catch(p){if(p instanceof ve)return S(e,p.message);throw p}let d=r.now??new Date,u=q(n,"--dry-run"),m=[];for(let p of c)m.push(await hW(e,p,{now:d,dryRun:u}));let f={checked:m.length,recovered:m.filter(p=>p.action==="recovered").length,wouldRecover:m.filter(p=>p.action==="would_recover").length,skipped:m.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:m.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(q(n,"--json"))Y(e,{dryRun:u,now:d.toISOString(),summary:f,members:m});else{for(let p of m)e.stdout.write(gW(p));e.stdout.write(`Recover checked ${f.checked}: ${u?`${f.wouldRecover} would recover`:`${f.recovered} recovered`}, ${f.skipped} skipped, ${f.errors} error(s).
|
|
2509
|
-
`)}return f.errors>0?1:0}async function _W(t,e,r){return await O(t,n=>{let s=Ne(e,n);if(r!==void 0){let i=He(s,n);if(i.parseErrors.length>0)throw new ve(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=ja(i,r);return o?.teamfile!==void 0?qm(Yb(Kb(s),o.teamfile),n,new Set):[De(e,r,n)]}return qm(s,n,new Set)})}function qm(t,e,r){let n=Ne(t,e);if(r.has(n))return[];r.add(n);let s=He(n,e);if(s.parseErrors.length>0)throw new ve(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...qm(Yb(Kb(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(De(n,o.alias,e))}return i}async function hW(t,e,r){let n;try{let a=await Xe(e.sessionid,e.provider);if(a===null)return
|
|
2510
|
-
`}var fW,Wm,Zb=E(()=>{"use strict";Um();
|
|
2509
|
+
`)}return f.errors>0?1:0}async function _W(t,e,r){return await O(t,n=>{let s=Ne(e,n);if(r!==void 0){let i=He(s,n);if(i.parseErrors.length>0)throw new ve(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=ja(i,r);return o?.teamfile!==void 0?qm(Yb(Kb(s),o.teamfile),n,new Set):[De(e,r,n)]}return qm(s,n,new Set)})}function qm(t,e,r){let n=Ne(t,e);if(r.has(n))return[];r.add(n);let s=He(n,e);if(s.parseErrors.length>0)throw new ve(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...qm(Yb(Kb(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(De(n,o.alias,e))}return i}async function hW(t,e,r){let n;try{let a=await Xe(e.sessionid,e.provider);if(a===null)return qt(e,"session_not_found",null,"session detail not found");n=fi(a.messages)}catch(a){return qt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return qt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return qt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return qt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return qt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(i!==null)return qt(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return qt(e,"would_recover",n,null);let o=await il({teamfile:e.teamfile,alias:e.alias,prompt:fW,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?qt(e,"recovered",n,null):qt(e,o.status==="busy"?"busy":"send_error",n,o.message)}function qt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function gW(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
|
|
2510
|
+
`}var fW,Wm,Zb=E(()=>{"use strict";Um();cr();ar();lr();vt();Fm();$e();fW="Your session limit reset time has passed. Continue your work from the last actionable point.",Wm=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<alias> [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
|
|
2511
2511
|
`)});var pi,EZ,Bm=E(()=>{"use strict";pi=[{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}],EZ=pi.length});import{spawn as yW}from"node:child_process";async function eS(t,e,r){let n=wW.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return TW(n.name,s)}function TW(t,e){return t==="lmctl_chat"?vW(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function vW(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return ue()&&je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),bW(s,process.cwd())}function bW(t,e){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=yW("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=SW(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){ue()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2512
2512
|
`).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 SW(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Qb;let r=Number(e);return!Number.isFinite(r)||r<=0?Qb:r}function Hm(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:EW),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var EW,Qb,wW,Xm=E(()=>{"use strict";Bm();me();EW="http://127.0.0.1:8787",Qb=30*60*1e3,wW=new Map(pi.map(t=>[t.name,t]))});async function AW(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Jm({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:kW,capabilities:{tools:{listChanged:!1}},serverInfo:{name:IW,version:NW}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:pi.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 eS(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Jm(t){return`${JSON.stringify(t)}
|
|
2513
2513
|
`}async function tS(t,e){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(Jm({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await AW(l,t);c.kind==="response"?t.io.write(Jm(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=n.indexOf(`
|
|
@@ -2543,31 +2543,31 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
2543
2543
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
2544
2544
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
2545
2545
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
2546
|
-
`});var gS={};pe(gS,{runMail:()=>dq});import{hostname as YW}from"node:os";async function dq(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(rq),0;let[r,...n]=t,s=
|
|
2546
|
+
`});var gS={};pe(gS,{runMail:()=>dq});import{hostname as YW}from"node:os";async function dq(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(rq),0;let[r,...n]=t,s=Dr(n);try{switch(r){case"sent":return await uq(n,e);case"history":return await mq(n,e);case"seen":return await fq(n,e);case"pending":return await pq(n,e);case"read":return await hq(n,e);case"ack":return await gq(n,e);case"tree":return await yq(n,e);default:return ne(e,s,"invalid_command",`unknown mail command: ${r}`)}}catch(i){return i instanceof Ze?ne(e,s,i.errorKind,i.message):ne(e,s,"internal",i instanceof Error?i.message:String(i))}}async function uq(t,e){if(cn(t))return e.stdout.write(nq),0;let r=Dr(t),n=J(ll(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return ne(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=Km($(n,"--to"));if("error"in s)return ne(e,r,"invalid_arguments",s.error);let i=Oq($(n,"--since"));if("error"in i)return ne(e,r,"invalid_arguments",i.error);let o=$(n,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return ne(e,r,"invalid_arguments","--status must be queued or delivered");let a=Ym($(n,"--limit"));if("error"in a)return ne(e,r,"invalid_arguments",a.error);let l=hS($(n,"--cursor"),"sent");if("error"in l)return ne(e,r,"invalid_arguments",l.error);if(l.value!==null&&($(n,"--to")!==void 0||$(n,"--since")!==void 0||o!==void 0))return ne(e,r,"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?Je(pS(d,e,"mail sent")):Je(l.value.self),m=l.value===null?s.value:l.value.to===null?null:Je(l.value.to),f=l.value?.since??i.iso,p=l.value?.status??o??null,h=Eq(d,u,m,f,p??void 0,a.value,l.value?.seq??null),g=h.next_seq===null?null:_S({v:1,kind:"sent",seq:h.next_seq,self:u.value,to:m?.value??null,since:f,status:p});return{schema_version:an,schema:"event-log-v1",identity:u.value,filters:{to:m?.value??null,since:f,status:p},messages:h.messages,next_cursor:g}});if(q(n,"--json"))Y(e,c);else{e.stdout.write(`Messages sent from ${c.identity}
|
|
2547
2547
|
`);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}
|
|
2548
2548
|
`);c.messages.length===0&&e.stdout.write(`(none)
|
|
2549
|
-
`)}return 0}async function mq(t,e){if(cn(t))return e.stdout.write(aq),0;let r=
|
|
2549
|
+
`)}return 0}async function mq(t,e){if(cn(t))return e.stdout.write(aq),0;let r=Dr(t),n=J(t,[],["--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);let s=al(n.positionals,"history");if("error"in s)return ne(e,r,"invalid_id",s.error);let i=await O(e,a=>dS(a,s.value)),o={schema_version:an,schema:"event-log-v1",message_id:s.value,events:i};if(q(n,"--json"))Y(e,o);else{e.stdout.write(`History for ${s.value}
|
|
2550
2550
|
`);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
|
|
2551
|
-
`)}return 0}async function fq(t,e){if(cn(t))return e.stdout.write(lq),0;let r=
|
|
2551
|
+
`)}return 0}async function fq(t,e){if(cn(t))return e.stdout.write(lq),0;let r=Dr(t),n=J(t,[],["--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);let s=al(n.positionals,"seen");if("error"in s)return ne(e,r,"invalid_id",s.error);let i=await O(e,o=>Tq(o,s.value));return q(n,"--json")?Y(e,i):(e.stdout.write(`${s.value}
|
|
2552
2552
|
`),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
|
|
2553
2553
|
`),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
|
|
2554
2554
|
`),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
|
|
2555
|
-
`)),0}async function pq(t,e){if(cn(t))return e.stdout.write(sq),0;let r=
|
|
2555
|
+
`)),0}async function pq(t,e){if(cn(t))return e.stdout.write(sq),0;let r=Dr(t),n=J(ll(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return ne(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=Km($(n,"--receiver"));if("error"in s)return ne(e,r,"invalid_arguments",s.error);let i=Ym($(n,"--limit"));if("error"in i)return ne(e,r,"invalid_arguments",i.error);let o=await O(e,l=>{let c=s.value===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",d=s.value===null?[]:[s.value.teamfile,s.value.alias];return l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
2556
2556
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq
|
|
2557
2557
|
FROM message_pending ${c}
|
|
2558
2558
|
ORDER BY created_seq ASC LIMIT ?`).all(...d,i.value)}),a={schema_version:an,schema:"event-log-v1",filters:{receiver:s.value===null?null:`${s.value.teamfile}:${s.value.alias}`,limit:i.value},messages:o.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(q(n,"--json"))Y(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
|
|
2559
2559
|
`);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}
|
|
2560
2560
|
`)}return 0}function _q(t,e){let r=t.db.prepare(`SELECT event_type, payload FROM message_event
|
|
2561
2561
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2562
|
-
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ze("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:an,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function hq(t,e){if(cn(t))return e.stdout.write(iq),0;let r=
|
|
2562
|
+
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ze("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:an,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function hq(t,e){if(cn(t))return e.stdout.write(iq),0;let r=Dr(t),n=J(t,[],["--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);let s=al(n.positionals,"read");if("error"in s)return ne(e,r,"invalid_id",s.error);let i=await O(e,o=>_q(o,s.value));if(q(n,"--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}`})
|
|
2563
2563
|
`),e.stdout.write(`from: ${o}
|
|
2564
2564
|
`),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
|
|
2565
2565
|
`),e.stdout.write(`state: ${i.pending_state??"terminal"}
|
|
2566
2566
|
`),e.stdout.write(`---
|
|
2567
2567
|
${i.content}
|
|
2568
|
-
`)}return 0}async function gq(t,e){if(cn(t))return e.stdout.write(oq),0;let r=
|
|
2569
|
-
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=rs(e.env??process.env,l);if(!d.ok&&d.reason==="not-found")throw new Ze("self_identity",
|
|
2570
|
-
`),0}async function yq(t,e){if(cn(t))return e.stdout.write(cq),0;let r=
|
|
2568
|
+
`)}return 0}async function gq(t,e){if(cn(t))return e.stdout.write(oq),0;let r=Dr(t),n=J(ll(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);let s=al(n.positionals,"ack");if("error"in s)return ne(e,r,"invalid_id",s.error);let i=$(n,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
|
|
2569
|
+
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=rs(e.env??process.env,l);if(!d.ok&&d.reason==="not-found")throw new Ze("self_identity",Mr("mail ack"));let u=d.ok?d.identity:"operator",m=Up(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:YW(),terminalizePending:q(n,"--terminalize-pending")});return{ackedBy:u,ack:m}}),a={schema_version:an,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return q(n,"--json")?Y(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
|
|
2570
|
+
`),0}async function yq(t,e){if(cn(t))return e.stdout.write(cq),0;let r=Dr(t),n=J(ll(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(n.error!==void 0)return ne(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return ne(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=fS($(n,"--since"),zW);if("error"in s)return ne(e,r,"invalid_arguments",s.error);let i=Km($(n,"--root"));if("error"in i)return ne(e,r,"invalid_arguments",i.error);let o=Ym($(n,"--limit"));if("error"in o)return ne(e,r,"invalid_arguments",o.error);let a=hS($(n,"--cursor"),"tree");if("error"in a)return ne(e,r,"invalid_arguments",a.error);if(a.value!==null&&($(n,"--root")!==void 0||$(n,"--since")!==void 0))return ne(e,r,"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??Je(pS(c,e,"mail tree")):Je(a.value.root),u=a.value?.since??s.iso,m=a.value?.since_label??$(n,"--since")??"24h",f=xq(c,d,u,o.value,a.value?.seq??null),p=f.next_seq===null?null:_S({v:1,kind:"tree",seq:f.next_seq,root:d.value,since:u,since_label:m});return{schema_version:an,schema:"event-log-v1",root:{teamfile:d.teamfile,alias:d.alias},since:m,since_timestamp:u,sent:f.sent,next_cursor:p,orphan_policy:"Missing causal linkage is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"A killed invocation that never wrote request_message_id may produce an orphan root."}});if(q(n,"--json"))Y(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
|
|
2571
2571
|
`);for(let c of l.sent)mS(e,c,0);l.sent.length===0&&e.stdout.write(`(none)
|
|
2572
2572
|
`),e.stdout.write(`
|
|
2573
2573
|
Note: ${l.orphan_policy}
|
|
@@ -2614,7 +2614,7 @@ Note: ${l.orphan_policy}
|
|
|
2614
2614
|
SELECT invocation_id, request_message_id FROM invocation_state
|
|
2615
2615
|
WHERE request_message_id IS NOT NULL
|
|
2616
2616
|
`).all().map(u=>[u.invocation_id,u.request_message_id])),l=new Map;for(let u of o){if(u.receiver_teamfile===null||u.receiver_alias===null)throw new Ze("data_error",`${u.stream_id} ${u.event_type} is missing receiver identity`);let m=u.sender_teamfile===null||u.sender_alias===null?null:{teamfile:u.sender_teamfile,alias:u.sender_alias},f=Rq(u,a);l.set(u.stream_id,{seq:u.seq,message_id:u.stream_id,from:m,to:{teamfile:u.receiver_teamfile,alias:u.receiver_alias},message_type:u.event_type==="RESPONSE_CREATE"?"response":"request",at:u.ts,parent_message_id:f.message_id,parent_link:f.link,orphaned_to_root:f.message_id===null,children:[]})}for(let u of l.values()){if(u.parent_message_id===null)continue;let m=l.get(u.parent_message_id);if(m===void 0){u.orphaned_to_root=!0;continue}m.children.push(u)}let c=[...l.values()].filter(u=>u.from?.teamfile===e.teamfile&&u.from.alias===e.alias&&!Lq(u,l,e)&&(s===null||u.seq>s)),d=c.slice(0,n);return{sent:d.map(u=>uS(u,new Set)),next_seq:c.length>n?d.at(-1).seq:null}}function Rq(t,e){if(t.event_type==="RESPONSE_CREATE"){let i=on(t.payload.in_reply_to_message_id);return{message_id:i,link:i===null?null:"in_reply_to_message_id"}}let r=sn(t.payload.causation)?t.payload.causation:null,n=on(t.payload.invocation_id,r?.invocation_id),s=n===null?null:e.get(n)??null;return{message_id:s,link:s===null?null:"invocation_state.request_message_id"}}function Lq(t,e,r){let n=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(n.has(s))return!1;n.add(s);let i=e.get(s);if(i===void 0)return!1;if(i.from?.teamfile===r.teamfile&&i.from.alias===r.alias)return!0;s=i.parent_message_id}return!1}function uS(t,e){let{seq:r,children:n,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:n.map(o=>uS(o,i))}}function mS(t,e,r){let n=" ".repeat(r),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${n}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
|
|
2617
|
-
`);for(let i of e.children)mS(t,i,r+1)}function al(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return QW.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function Km(t){if(t===void 0)return{value:null};try{return{value:Je(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function ll(t,e){let r=new Set(e),n=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&r.has(o)?n.push(o,s.slice(i+1)):n.push(s)}return n}function Oq(t){return t===void 0?{iso:null}:fS(t,null)}function fS(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let r=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(r!==null){let s=Number(r[1]),i=r[2]==="m"?6e4:r[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function pS(t,e,r){let n=rs(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ze("self_identity",
|
|
2617
|
+
`);for(let i of e.children)mS(t,i,r+1)}function al(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return QW.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function Km(t){if(t===void 0)return{value:null};try{return{value:Je(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function ll(t,e){let r=new Set(e),n=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&r.has(o)?n.push(o,s.slice(i+1)):n.push(s)}return n}function Oq(t){return t===void 0?{iso:null}:fS(t,null)}function fS(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let r=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(r!==null){let s=Number(r[1]),i=r[2]==="m"?6e4:r[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function pS(t,e,r){let n=rs(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ze("self_identity",Mr(r)):new Ze("self_identity",Mm(r))}function cn(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function Dr(t){return t.includes("--json")}function ne(t,e,r,n){return e?(Y(t,{status:"error",errorKind:r,message:n}),1):S(t,n)}function Ym(t){if(t===void 0)return{value:ZW};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>lS?{error:`invalid --limit value: ${t}; expected 1..${lS}`}:{value:e}}function _S(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function hS(t,e){if(t===void 0)return{value:null};try{let r=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!sn(r)||r.v!==1||r.kind!==e||typeof r.seq!="number"||!Number.isSafeInteger(r.seq)||r.seq<1?{error:"invalid --cursor value"}:r.kind==="sent"?typeof r.self!="string"||!Vm(r.self)||!(r.to===null||typeof r.to=="string"&&Vm(r.to))||!(r.since===null||typeof r.since=="string"&&Number.isFinite(Date.parse(r.since)))||!(r.status===null||r.status==="queued"||r.status==="delivered")?{error:"invalid --cursor value"}:{value:r}:typeof r.root!="string"||!Vm(r.root)||typeof r.since!="string"||!Number.isFinite(Date.parse(r.since))||typeof r.since_label!="string"||r.since_label.length===0?{error:"invalid --cursor value"}:{value:r}}catch{return{error:"invalid --cursor value"}}}function Vm(t){try{return Je(t),!0}catch{return!1}}function $q(t){return eq.includes(t)}function Cq(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function sn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Mq(t,e){let r=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${r}(?:$|[^A-Za-z0-9_-])`).test(t)}function Dq(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function on(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function jq(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var zW,ZW,lS,an,QW,eq,tq,ln,rq,nq,sq,iq,oq,aq,lq,cq,Ze,yS=E(()=>{"use strict";Li();cr();$e();rl();ui();zW=24*60*60*1e3,ZW=100,lS=1e3,an=1,QW=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,eq=["CREATE","RESPONSE_CREATE"],tq=["DELIVERED","RESPONSE_DELIVERED"],ln=`schema_version is the output-contract version consumers must switch on.
|
|
2618
2618
|
schema identifies the backing event-log substrate; it is not a second output version.`,rq=`usage:
|
|
2619
2619
|
lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
|
|
2620
2620
|
lmctl mail history <message_id> [--json]
|
|
@@ -2788,8 +2788,8 @@ With --json, the stable external contract is:
|
|
|
2788
2788
|
"incomplete_capture_note":"..."}
|
|
2789
2789
|
${ln}
|
|
2790
2790
|
Default text output is human-readable and may change without notice.
|
|
2791
|
-
`,Ze=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as ES,mkdirSync as Pq,readdirSync as Fq,readFileSync as wS,writeFileSync as Uq}from"node:fs";import{join as ss}from"node:path";import{fileURLToPath as Wq}from"node:url";function Bq(t){try{return qq.some(e=>ES(ss(t,e)))}catch{return!1}}function Hq(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function TS(t,e){t.durable_memory_mode!=="db"?Xq(t):Jq(t,e)}function vS(t){let e=Bq(t),r;try{r=Fq(cl).filter(n=>n.endsWith(".template")).sort()}catch(n){return M({event:"bootstrap_templates_unreadable",path:cl,error_message:n instanceof Error?n.message:String(n)}),[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function Xq(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),M({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=ss(e,"durable-memory");try{Pq(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),M({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=vS(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=ss(r,o);if(!ES(a))try{let l=wS(ss(cl,i),"utf8");Uq(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),M({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function Jq(t,e){let r=t.local_path??"",n=vS(r),s=[];for(let i of n){let o=ss(cl,i),a;try{a=wS(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=Hq(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 cl,qq,bS=E(()=>{"use strict";me();cl=ss(Wq(import.meta.url),"../../config/durable_memory_templates"),qq=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as Gq}from"node:crypto";import{existsSync as Vq,mkdirSync as Kq,writeFileSync as Yq}from"node:fs";import{dirname as zq,join as is}from"node:path";function zm(t){return typeof t=="string"&&t.startsWith(SS)}function nB(t){if(!zm(t))throw new St(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(SS.length),r=e.indexOf("/");if(r<=0)throw new St(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!tB.has(n))throw new St(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new St(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new St(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function sB(t,e,r){if(t==="workflow")return Yo(e,r);let n=t==="mcp"?is("templates","mcp",`${e}.json`):is("templates","skills",e,"SKILL.md");for(let s of Zd(r)){let i=is(s,n);if(Vq(i))return i}return null}function iB(t,e,r){let n=is(zd(r),Qq,t);return t==="skill"?is(n,e,"SKILL.md"):is(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function oB(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function kS(t,e){let{kind:r,name:n,ref:s}=nB(t),i=sB(r,n,e);if(i!==null)return i;let o=`${Zq}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(eB)})}catch(d){throw new St(`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 St(`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=rB.exec(s);if(d!==null){let u=Gq("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new St(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!oB(r,l))throw new St(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=iB(r,n,e);return Kq(zq(c),{recursive:!0}),Yq(c,l,"utf8"),c}var SS,Zq,Qq,eB,tB,St,rB,IS=E(()=>{"use strict";Qd();SS="lmctl://",Zq="https://lmctl.com/templates/",Qq=".cache",eB=8e3,tB=new Set(["workflow","mcp","skill"]),St=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},rB=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as aB}from"node:child_process";import{cpSync as NS,existsSync as lB,mkdirSync as cB,mkdtempSync as dB,readFileSync as uQ,statSync as uB,writeFileSync as AS}from"node:fs";import{homedir as mB,tmpdir as fB}from"node:os";import{basename as xS,join as
|
|
2792
|
-
`)};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(_B.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=dB(
|
|
2791
|
+
`,Ze=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as ES,mkdirSync as Pq,readdirSync as Fq,readFileSync as wS,writeFileSync as Uq}from"node:fs";import{join as ss}from"node:path";import{fileURLToPath as Wq}from"node:url";function Bq(t){try{return qq.some(e=>ES(ss(t,e)))}catch{return!1}}function Hq(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function TS(t,e){t.durable_memory_mode!=="db"?Xq(t):Jq(t,e)}function vS(t){let e=Bq(t),r;try{r=Fq(cl).filter(n=>n.endsWith(".template")).sort()}catch(n){return M({event:"bootstrap_templates_unreadable",path:cl,error_message:n instanceof Error?n.message:String(n)}),[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function Xq(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),M({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=ss(e,"durable-memory");try{Pq(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),M({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=vS(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=ss(r,o);if(!ES(a))try{let l=wS(ss(cl,i),"utf8");Uq(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),M({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function Jq(t,e){let r=t.local_path??"",n=vS(r),s=[];for(let i of n){let o=ss(cl,i),a;try{a=wS(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=Hq(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 cl,qq,bS=E(()=>{"use strict";me();cl=ss(Wq(import.meta.url),"../../config/durable_memory_templates"),qq=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as Gq}from"node:crypto";import{existsSync as Vq,mkdirSync as Kq,writeFileSync as Yq}from"node:fs";import{dirname as zq,join as is}from"node:path";function zm(t){return typeof t=="string"&&t.startsWith(SS)}function nB(t){if(!zm(t))throw new St(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(SS.length),r=e.indexOf("/");if(r<=0)throw new St(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!tB.has(n))throw new St(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new St(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new St(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function sB(t,e,r){if(t==="workflow")return Yo(e,r);let n=t==="mcp"?is("templates","mcp",`${e}.json`):is("templates","skills",e,"SKILL.md");for(let s of Zd(r)){let i=is(s,n);if(Vq(i))return i}return null}function iB(t,e,r){let n=is(zd(r),Qq,t);return t==="skill"?is(n,e,"SKILL.md"):is(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function oB(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function kS(t,e){let{kind:r,name:n,ref:s}=nB(t),i=sB(r,n,e);if(i!==null)return i;let o=`${Zq}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(eB)})}catch(d){throw new St(`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 St(`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=rB.exec(s);if(d!==null){let u=Gq("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new St(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!oB(r,l))throw new St(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=iB(r,n,e);return Kq(zq(c),{recursive:!0}),Yq(c,l,"utf8"),c}var SS,Zq,Qq,eB,tB,St,rB,IS=E(()=>{"use strict";Qd();SS="lmctl://",Zq="https://lmctl.com/templates/",Qq=".cache",eB=8e3,tB=new Set(["workflow","mcp","skill"]),St=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},rB=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as aB}from"node:child_process";import{cpSync as NS,existsSync as lB,mkdirSync as cB,mkdtempSync as dB,readFileSync as uQ,statSync as uB,writeFileSync as AS}from"node:fs";import{homedir as mB,tmpdir as fB}from"node:os";import{basename as xS,join as ur}from"node:path";function Zm(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Qm(t,e,r){if(Array.isArray(t)){for(let n of t)Qm(n,e,r);return}if(Zm(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Qm(n,e,r)}}function gB(t,e){let r={mcp:[],skills:[]},n=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!Zm(a)||!Array.isArray(a.steps)))for(let l of a.steps)Zm(l)&&l.members!==void 0&&Qm(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(hB(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function yB(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function EB(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(pB)})}catch(s){throw new jr(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new jr(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>RS)throw new jr(e,`fetched ${t} exceeds ${RS} bytes`);return n}function wB(t,e,r,n){let s=aB(t,e,{cwd:r,env:yr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new jr(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new jr(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function TB(t){if(typeof t!="string")return t.name;let e=xS(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?xS(t.replace(/\/skill\.md$/i,"")):e}async function LS(t,e,r){let n=TB(t),s=ur(e,n);if(cB(s,{recursive:!0}),typeof t!="string")return AS(ur(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(zm(t)&&(t=await kS(t)),$S.test(t))return AS(ur(s,"SKILL.md"),await EB(t,r),"utf8"),{name:n,dir:s};if(!lB(t))throw new jr(r,`skill path not found: ${t}`);return uB(t).isDirectory()?(NS(t,s,{recursive:!0}),{name:n,dir:s}):(NS(t,ur(s,"SKILL.md")),{name:n,dir:s})}async function CS(t){let{dal:e,member:r,stderr:n}=t,s=gB(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ke(r),o=r.sessiondir||t.baseDir||yB(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
2792
|
+
`)};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(_B.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=dB(ur(fB(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!$S.test(c)?c:(await LS(c,l,r.alias)).dir;wB(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(OS[i]!==void 0){let l=OS[i]();for(let c of s.skills)await LS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var jr,$S,pB,RS,_B,hB,dl,OS,MS=E(()=>{"use strict";it();IS();ft();di();jr=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},$S=/^https?:\/\//i,pB=8e3,RS=1e6,_B=new Set(["opencode"]),hB=t=>JSON.stringify(t),dl=()=>process.env.HOME??mB();OS={claude:()=>ur(dl(),".claude","skills"),qwen:()=>ur(dl(),".qwen","skills"),codex:()=>ur(dl(),".codex","skills"),copilot:()=>ur(dl(),".copilot","skills")}});var ef,DS=E(()=>{"use strict";ef=`---
|
|
2793
2793
|
|
|
2794
2794
|
# Durable memory \u2014 how to use it
|
|
2795
2795
|
|
|
@@ -2807,7 +2807,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
2807
2807
|
`)}${s.length>0?`
|
|
2808
2808
|
`:""}`),0}function xB(t,e,r){let n=J(t,[]);if(n.error!==void 0)return S(e,n.error);let[s]=n.positionals;if(s===void 0)return S(e,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return S(e,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(q(n,"--json"))Y(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
|
|
2809
2809
|
`);for(let a of o)e.stdout.write(`- ${a.alias} ${Ke(a)} ${a.sessionid??"(unseeded)"}
|
|
2810
|
-
`)}return 0}function RB(t,e,r){let n=J(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return S(e,n.error);let[s]=n.positionals;if(s===void 0)return S(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return S(e,`team not found: ${s}`);let o=$(n,"--alias"),a=$(n,"--provider");if(o===void 0||a===void 0)return S(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:$(n,"--model")??null,role:$(n,"--role")??"agent",sessiondir:$(n,"--sessiondir")??bB(
|
|
2810
|
+
`)}return 0}function RB(t,e,r){let n=J(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return S(e,n.error);let[s]=n.positionals;if(s===void 0)return S(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return S(e,`team not found: ${s}`);let o=$(n,"--alias"),a=$(n,"--provider");if(o===void 0||a===void 0)return S(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:$(n,"--model")??null,role:$(n,"--role")??"agent",sessiondir:$(n,"--sessiondir")??bB(mr(),"sessions",i.name,o)});return q(n,"--json")?Y(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
|
|
2811
2811
|
`),0}async function jS(t,e,r,n){let s=J(t,["--alias"]);if(s.error!==void 0)return S(e,s.error);let[i]=s.positionals;if(i===void 0)return S(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return S(e,`team not found: ${i}`);let a=$(s,"--alias");if(n&&a===void 0)return S(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return S(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=LB(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return S(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return S(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=r.listProjects().filter(f=>f.team_id===o.id),d=new Set;for(let f of c){if(d.has(f.workflow_name))continue;d.add(f.workflow_name);let p=r.getWorkflowByName(f.workflow_name);if(p===null)continue;let h=OE(f.workflow_name,p.definition);if(h.status==="FAIL")return S(e,`cannot seed team \`${o.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of c)TS(f,r);let u=[],m=!1;for(let f of l){let p=await mo({member:f,dal:r}),h=r.updateTeamMemberSession(f.id,p.sessionid);if(h!==null){let g=h.role_prompt??"",_=g.length>0?`${g}
|
|
2812
2812
|
|
|
2813
2813
|
${ef}`:ef;r.setMemberPromptSnapshot(f.id,_),u.push(h);let y=Ua(Ke(h),p.sessionid);y!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
|
|
@@ -2815,7 +2815,7 @@ ${ef}`:ef;r.setMemberPromptSnapshot(f.id,_),u.push(h);let y=Ua(Ke(h),p.sessionid
|
|
|
2815
2815
|
`);try{await CS({dal:r,member:h,stderr:e.stderr})}catch(T){m=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
2816
2816
|
`)}}}return q(s,"--json")?Y(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2817
2817
|
`),m?1:0}function LB(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function OB(t,e,r){let n=J(t,["--interpreter","--of"]);if(n.error!==void 0)return S(e,n.error);let[s]=n.positionals;if(s===void 0)return S(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return S(e,`team not found: ${s}`);let o=$(n,"--interpreter"),a=$(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return S(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return S(e,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return S(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2818
|
-
`),0}var SB,FS=E(()=>{"use strict";Fe();ud();bS();it();
|
|
2818
|
+
`),0}var SB,FS=E(()=>{"use strict";Fe();ud();bS();it();cr();MS();oa();$e();DS();SB=`usage: lmctl team create <name>
|
|
2819
2819
|
lmctl team list [--json]
|
|
2820
2820
|
lmctl team show <name> [--json]
|
|
2821
2821
|
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
@@ -2828,7 +2828,7 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
|
2828
2828
|
refresh to create/update native provider sessions for team members.
|
|
2829
2829
|
team refresh rejects Lead members (alias matching is case-insensitive).
|
|
2830
2830
|
`});var JS={};pe(JS,{applyMaxBytes:()=>ul,renderMessage:()=>HS,runTail:()=>jB});async function jB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${DB}
|
|
2831
|
-
`),0;let r=J(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return S(e,r.error);let n=$(r,"--lines"),s=$(r,"--max-bytes");if(n!==void 0&&s!==void 0)return S(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let f=Number.parseInt(n,10);if(!Number.isFinite(f)||f<1||String(f)!==n)return S(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:f}}else{let f=s===void 0?CB:Number.parseInt(s,10);if(!Number.isFinite(f)||f<0||s!==void 0&&String(f)!==s)return S(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:f}}let o=q(r,"--watch"),a=$(r,"--watch-interval"),l=a===void 0?MB:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return S(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return S(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=$(r,"--run");if(c!==void 0){if(r.positionals.length>0)return S(e,"--run is mutually exclusive with positional [target] [alias]");if($(r,"--session")!==void 0)return S(e,"--run is mutually exclusive with --session");if($(r,"--provider")!==void 0)return S(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(c,10);if(!Number.isFinite(f)||f<=0||String(f)!==c)return S(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(e,async p=>PB(e,p,f,i,o,l))}catch(p){return Be(e,p)}}let d
|
|
2831
|
+
`),0;let r=J(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return S(e,r.error);let n=$(r,"--lines"),s=$(r,"--max-bytes");if(n!==void 0&&s!==void 0)return S(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let f=Number.parseInt(n,10);if(!Number.isFinite(f)||f<1||String(f)!==n)return S(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:f}}else{let f=s===void 0?CB:Number.parseInt(s,10);if(!Number.isFinite(f)||f<0||s!==void 0&&String(f)!==s)return S(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:f}}let o=q(r,"--watch"),a=$(r,"--watch-interval"),l=a===void 0?MB:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return S(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return S(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=$(r,"--run");if(c!==void 0){if(r.positionals.length>0)return S(e,"--run is mutually exclusive with positional [target] [alias]");if($(r,"--session")!==void 0)return S(e,"--run is mutually exclusive with --session");if($(r,"--provider")!==void 0)return S(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(c,10);if(!Number.isFinite(f)||f<=0||String(f)!==c)return S(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(e,async p=>PB(e,p,f,i,o,l))}catch(p){return Be(e,p)}}let d=$r($B,{target:r.positionals[0],alias:r.positionals[1],flags:{session:$(r,"--session"),provider:$(r,"--provider")}});if(d.mode==="error")return S(e,d.message);if(d.mode==="managed")return S(e,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let f;try{f=await O(e,g=>Ne(d.teamfile,g))}catch(g){return S(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=nt(f)}catch(g){return S(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Ut(p);if(h===void 0)return S(e,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(e,_=>De(d.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ve?S(e,g.message):Be(e,g)}}else try{let f=await O(e,p=>De(d.teamfile,d.alias,p));u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ve?S(e,f.message):Be(e,f)}else{let f=d.sessionid,p=d.provider;if(p===void 0){let h=await Vn(f);if(h.length===0)return S(e,`tail: session "${f}" not found in any provider store`);if(h.length>1)return S(e,`tail: session "${f}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:f}}let m=await US(e,u.provider,u.sessionId,i,-1);return m<0?1:o?await new Promise(f=>{let p=async()=>{try{let _=await US(e,u.provider,u.sessionId,i,m);_>=0&&(m=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
2832
2832
|
`)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),f(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function US(t,e,r,n,s){let i;try{i=await Xe(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
2833
2833
|
`),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
2834
2834
|
`),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${HS(o[c])}
|
|
@@ -2840,7 +2840,7 @@ ${o.map(a=>` ${a}`).join(`
|
|
|
2840
2840
|
`)}`}async function PB(t,e,r,n,s,i){if(e.getRun(r)===null)return S(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${BS(u)}
|
|
2841
2841
|
`).join("");t.stdout.write(n.kind==="bytes"?ul(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let h=e.listSessionEvents(r,d),g="";for(let _ of h)g+=`${BS(_)}
|
|
2842
2842
|
`,d=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?ul(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
2843
|
-
`)}},i*1e3),p=()=>{clearInterval(f),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ul(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(WS,"utf8");if(n>=e)return qS(t,e);let s=e-n,i=qS(t,s);return`${WS}${i}`}function qS(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function BS(t){let e=XS(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function XS(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var $B,CB,MB,DB,WS,GS=E(()=>{"use strict";
|
|
2843
|
+
`)}},i*1e3),p=()=>{clearInterval(f),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ul(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(WS,"utf8");if(n>=e)return qS(t,e);let s=e-n,i=qS(t,s);return`${WS}${i}`}function qS(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function BS(t){let e=XS(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function XS(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var $B,CB,MB,DB,WS,GS=E(()=>{"use strict";cr();$e();vt();ar();lr();$B={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},CB=4096,MB=2,DB=`usage: lmctl tail [target] [alias]
|
|
2844
2844
|
lmctl tail --session <id> [--provider <name>]
|
|
2845
2845
|
lmctl tail --run <id>
|
|
2846
2846
|
[--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
|
|
@@ -2849,7 +2849,7 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2849
2849
|
A bare <teamfile> with no alias tails that team's Lead member.
|
|
2850
2850
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;WS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2851
2851
|
`});var tk={};pe(tk,{runInfo:()=>BB});import{execFileSync as tf}from"node:child_process";import{dirname as VS,resolve as FB}from"node:path";function qB(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function BB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${WB}
|
|
2852
|
-
`),0;let r=J(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return S(e,r.error);if(r.positionals.length>2)return S(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=q(r,"--json"),s=$(r,"--run");if(s!==void 0){if(r.positionals.length>0)return S(e,"--run is mutually exclusive with positional [target] [alias]");if($(r,"--provider")!==void 0)return S(e,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return S(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>XB(e,u,d,n))}catch(u){return Be(e,u)}}let i
|
|
2852
|
+
`),0;let r=J(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return S(e,r.error);if(r.positionals.length>2)return S(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=q(r,"--json"),s=$(r,"--run");if(s!==void 0){if(r.positionals.length>0)return S(e,"--run is mutually exclusive with positional [target] [alias]");if($(r,"--provider")!==void 0)return S(e,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return S(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>XB(e,u,d,n))}catch(u){return Be(e,u)}}let i=$r(UB,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:$(r,"--provider")}});if(i.mode==="error")return S(e,i.message);if(i.mode==="managed")return S(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await O(e,u=>Ne(i.teamfile,u))}catch(u){return S(e,`health: ${u instanceof Error?u.message:String(u)}`)}return JB(e,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await O(e,u=>De(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 ve?S(e,d.message):Be(e,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await Vn(a);if(d.length===0)return S(e,`health: session "${a}" not found in any provider store`);if(d.length>1)return S(e,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return HB(e,o,a,l,n,c)}async function HB(t,e,r,n,s,i){let o;try{o=await Xe(r,e)}catch(d){return S(t,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return S(t,`health: session not found: ${r} (provider=${e})`);let a=fi(o.messages),l=i===void 0?null:await GB(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}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(Y(t,c),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2853
2853
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
2854
2854
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
2855
2855
|
`),l!==null&&t.stdout.write(` Liveness: ${rf(l.liveness)}
|
|
@@ -2890,7 +2890,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
2890
2890
|
small. Re-read after the next turn before concluding a compaction failed or gating on the value.
|
|
2891
2891
|
`),y.length>0){t.stdout.write(`Session limits:
|
|
2892
2892
|
`);for(let T of y)t.stdout.write(` ${T.reportPath}: LIMITED resets_at=${zS(T.sessionLimit)}
|
|
2893
|
-
`)}return 0}function KS(t,e,r,n){let s=Ne(t,e);if(r.has(s))return[];r.add(s);let i=He(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(...KS(FB(VS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function GB(t,e,r){let n=await YS(t,[{teamfile:e.teamfile,alias:e.alias}]),s=ZS(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:r.lastInputTokens??null,liveness:n.get(nf(e.teamfile,e.alias))??sf(),...i!==null?{activitySinceLastCommit:{messageCount:QS(r,i.since),tokens:null},cumulativeTokens:ek(r)??"n/a"}:{}}}async function YS(t,e){try{let r=await O(t,n=>e.map(s=>{let i=
|
|
2893
|
+
`)}return 0}function KS(t,e,r,n){let s=Ne(t,e);if(r.has(s))return[];r.add(s);let i=He(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(...KS(FB(VS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function GB(t,e,r){let n=await YS(t,[{teamfile:e.teamfile,alias:e.alias}]),s=ZS(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:r.lastInputTokens??null,liveness:n.get(nf(e.teamfile,e.alias))??sf(),...i!==null?{activitySinceLastCommit:{messageCount:QS(r,i.since),tokens:null},cumulativeTokens:ek(r)??"n/a"}:{}}}async function YS(t,e){try{let r=await O(t,n=>e.map(s=>{let i=ir(n,s.teamfile,s.alias);return[nf(s.teamfile,s.alias),VB(i)]}));return new Map(r)}catch{return new Map}}function nf(t,e){return`${t}\0${e.toLowerCase()}`}function VB(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}}:{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}:{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}:sf()}function sf(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function rf(t){return t.state==="idle"?"idle":`busy (${t.reason})`}function zS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function kt(t){return t==null?"unknown":String(t)}function KB(t){return t==="n/a"?t:kt(t)}function YB(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function ZS(t){let e=VS(t),r;try{tf("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=tf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.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:zB(e)}}function zB(t){let e;try{e=tf("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function QS(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function ek(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var UB,WB,rk=E(()=>{"use strict";cr();$e();vt();lr();en();Qt();Um();UB={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},WB=`usage: lmctl health [target] [alias]
|
|
2894
2894
|
lmctl health <teamfile> # team rollup
|
|
2895
2895
|
lmctl health <sessionid> [--provider <name>]
|
|
2896
2896
|
lmctl health --run <id> # run state, step rollup, and token totals
|
|
@@ -2904,16 +2904,16 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
2904
2904
|
`)}return 0}async function rH(t,e,r,n){let s=Rn(e,{limit:r});if(n==="json")return Y(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
|
|
2905
2905
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2906
2906
|
`);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);t.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
|
|
2907
|
-
`)}return 0}function nH(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var ZB,QB,nk,ik=E(()=>{"use strict";
|
|
2907
|
+
`)}return 0}function nH(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var ZB,QB,nk,ik=E(()=>{"use strict";Mt();$e();Qt();ZB=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2908
2908
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2909
2909
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2910
2910
|
|
|
2911
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,QB=50,nk=500});import{existsSync as hi,readFileSync as ok}from"node:fs";import{homedir as sH}from"node:os";import{dirname as ak,resolve as os}from"node:path";import{fileURLToPath as iH}from"node:url";function cf(t,e={}){let r=[],n=lH(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=pH(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(fl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${hH(o)}`)}return r}function lH(t){if(!t&&_i)return _i;let e=new Map,r,n=t??cH();if(!hi(n))return r=`${n} not found`,t||af(e),t||(_i=e),t||(fl=r),e;let s;try{s=ok(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||af(e),t||(_i=e),t||(fl=r),e}for(let[i,o]of Object.entries(oH)){let a=mH(s,o),l=fH(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&af(e),t||(_i=e),t||(fl=r),e}function cH(){return dH(ak(iH(import.meta.url)))}function dH(t){let e=uH(t);if(e){let n=os(e,"durable-memory","model_selection.md");if(hi(n))return n}let r=[os(t,"..","..","durable-memory","model_selection.md"),os(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(hi(n))return n;return r[r.length-1]}function uH(t){let e=os(t);for(;;){if(hi(os(e,"package.json")))return e;let r=ak(e);if(r===e)return null;e=r}}function af(t){for(let[e,r]of Object.entries(aH))t.set(e,r)}function mH(t,e){let n=new RegExp(`^## ${gH(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function fH(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function pH(t){let e=t??os(sH(),".config","opencode","opencode.json");if(!hi(e))return{available:!0,models:[]};let r;try{r=JSON.parse(ok(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:_H(r)}}function _H(t){if(!lf(t))return[];let e=ml(t.provider)??ml(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!lf(s))continue;let i=ml(s.models)??ml(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function ml(t){return lf(t)?t:null}function lf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hH(t){return t.length>0?t.join(", "):"(none)"}function gH(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var oH,aH,_i,fl,lk=E(()=>{"use strict";oH={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},aH={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","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)"]},_i=null});import{homedir as yH}from"node:os";import{basename as EH}from"node:path";function pl(t,e){let r=new Set;return{text:t.replace(TH,(s,i)=>{let o=i.trim(),a=wH[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function _l(t){return{workdir:t.workdir,teamfile:t.teamfile,date:vH(t.date)}}function vH(t){return t.toISOString().slice(0,10)}var wH,TH,df=E(()=>{"use strict";wH={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=EH(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>yH(),date:t=>t.date},TH=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ei={};pe(Ei,{GEMINI_PROVIDER_NOTICE:()=>mk,_setLintOpenCodeConfigProbeForTests:()=>LH,_setLintSessiondirFsOpsForTests:()=>RH,_setTeamfileSeedForTests:()=>xH,buildRootTeamRegistrationRow:()=>yk,registerRootTeam:()=>Ek,runHire:()=>UH,runLint:()=>FH,runRefresh:()=>WH,runSeed:()=>hk,sha256Text:()=>gk});import{createHash as bH}from"node:crypto";import{accessSync as SH,constants as ck,existsSync as kH,readFileSync as yl,realpathSync as ff,statSync as IH,writeFileSync as gl}from"node:fs";import{dirname as
|
|
2912
|
-
`),2;let r=t[0],n;try{n=await O(e,c=>Ne(r,c))}catch(c){return Pe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=nt(n)}catch(c){return Pe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Ju(s,
|
|
2911
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,QB=50,nk=500});import{existsSync as hi,readFileSync as ok}from"node:fs";import{homedir as sH}from"node:os";import{dirname as ak,resolve as os}from"node:path";import{fileURLToPath as iH}from"node:url";function cf(t,e={}){let r=[],n=lH(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=pH(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(fl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${hH(o)}`)}return r}function lH(t){if(!t&&_i)return _i;let e=new Map,r,n=t??cH();if(!hi(n))return r=`${n} not found`,t||af(e),t||(_i=e),t||(fl=r),e;let s;try{s=ok(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||af(e),t||(_i=e),t||(fl=r),e}for(let[i,o]of Object.entries(oH)){let a=mH(s,o),l=fH(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&af(e),t||(_i=e),t||(fl=r),e}function cH(){return dH(ak(iH(import.meta.url)))}function dH(t){let e=uH(t);if(e){let n=os(e,"durable-memory","model_selection.md");if(hi(n))return n}let r=[os(t,"..","..","durable-memory","model_selection.md"),os(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(hi(n))return n;return r[r.length-1]}function uH(t){let e=os(t);for(;;){if(hi(os(e,"package.json")))return e;let r=ak(e);if(r===e)return null;e=r}}function af(t){for(let[e,r]of Object.entries(aH))t.set(e,r)}function mH(t,e){let n=new RegExp(`^## ${gH(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function fH(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function pH(t){let e=t??os(sH(),".config","opencode","opencode.json");if(!hi(e))return{available:!0,models:[]};let r;try{r=JSON.parse(ok(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:_H(r)}}function _H(t){if(!lf(t))return[];let e=ml(t.provider)??ml(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!lf(s))continue;let i=ml(s.models)??ml(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function ml(t){return lf(t)?t:null}function lf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hH(t){return t.length>0?t.join(", "):"(none)"}function gH(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var oH,aH,_i,fl,lk=E(()=>{"use strict";oH={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},aH={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","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)"]},_i=null});import{homedir as yH}from"node:os";import{basename as EH}from"node:path";function pl(t,e){let r=new Set;return{text:t.replace(TH,(s,i)=>{let o=i.trim(),a=wH[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function _l(t){return{workdir:t.workdir,teamfile:t.teamfile,date:vH(t.date)}}function vH(t){return t.toISOString().slice(0,10)}var wH,TH,df=E(()=>{"use strict";wH={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=EH(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>yH(),date:t=>t.date},TH=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ei={};pe(Ei,{GEMINI_PROVIDER_NOTICE:()=>mk,_setLintOpenCodeConfigProbeForTests:()=>LH,_setLintSessiondirFsOpsForTests:()=>RH,_setTeamfileSeedForTests:()=>xH,buildRootTeamRegistrationRow:()=>yk,registerRootTeam:()=>Ek,runHire:()=>UH,runLint:()=>FH,runRefresh:()=>WH,runSeed:()=>hk,sha256Text:()=>gk});import{createHash as bH}from"node:crypto";import{accessSync as SH,constants as ck,existsSync as kH,readFileSync as yl,realpathSync as ff,statSync as IH,writeFileSync as gl}from"node:fs";import{dirname as Pr,resolve as uk}from"node:path";function xH(t){fk=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Mt(),id)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function RH(t){dn=t===null?pf:{...pf,...t}}function LH(t){pk=t??Ec}async function OH(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await pk({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function $H(t,e){let r=Pr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=uk(o);if(n.has(a))continue;let l=CH(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function CH(t){try{if(dn.existsSync(t)){if(!dn.statSync(t).isDirectory())return"ENOTDIR";dn.accessSync(t,ck.W_OK);return}let e=jH(t);if(e===void 0)return;if(!dn.statSync(e).isDirectory())return"ENOTDIR";dn.accessSync(e,ck.W_OK);return}catch(e){return PH(e)??"permission check failed"}}function MH(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||_k(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function DH(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!_k(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=wk(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function _k(t,e){return dk(t)===dk(e)}function dk(t){let e=uk(t);try{return ff(e)}catch{return e}}function jH(t){let e=t;for(;;){try{if(dn.existsSync(e))return e}catch{return}let r=Pr(e);if(r===e)return;e=r}}function PH(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 FH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(NH),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2912
|
+
`),2;let r=t[0],n;try{n=await O(e,c=>Ne(r,c))}catch(c){return Pe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=nt(n)}catch(c){return Pe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Ju(s,Pr(n)),o=cf(s.members),a=yl(n,"utf8"),l=pl(a,_l({workdir:Pr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(..._c(s.members,Pr(n))),o.push(...$H(s.members,n)),o.push(...MH(s.members,Pr(n))),o.push(...await OH(s.members,Pr(n),e.env));for(let c of i)e.stderr.write(`error: ${c.field}: ${c.message}
|
|
2913
2913
|
`);for(let c of s.members)hf([c],e),c.session!==void 0&&c.session.length<gi&&o.push(`${c.alias}: sessionid is shorter than ${gi} chars; run lmctl seed to refresh it`);for(let c of o)e.stderr.write(`warning: ${c}
|
|
2914
2914
|
`);return i.length>0?1:(e.stdout.write(`ok
|
|
2915
2915
|
`),0)}async function hk(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(AH),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2916
|
-
`),2;let r=t[0],n;try{n=await O(e,_=>Ne(r,_))}catch(_){return Pe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=ff(n)}catch(_){return Pe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=
|
|
2916
|
+
`),2;let r=t[0],n;try{n=await O(e,_=>Ne(r,_))}catch(_){return Pe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=ff(n)}catch(_){return Pe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Pr(n),o;try{o=nt(n)}catch(_){return Pe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=yl(n,"utf8").split(`
|
|
2917
2917
|
`),c=HH(l),d=DH(o.members,l,c,i),u=Ju(o,i);if(u.length>0){hf(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
|
|
2918
2918
|
`);return 1}try{es(e,o,n)}catch{}hf(o.members,e);for(let _ of cf(o.members))e.stderr.write(`warning: ${_}
|
|
2919
2919
|
`);for(let _ of _c(o.members,i))e.stderr.write(`warning: ${_}
|
|
@@ -2951,7 +2951,7 @@ ${t}`:`${r}
|
|
|
2951
2951
|
`),1}function mf(t,e,r){return t.stderr.write(`error: ${e}
|
|
2952
2952
|
${r}`),2}function hf(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
2953
2953
|
`),r.provider==="gemini"&&e.stderr.write(`${mk.replace("%s",r.alias)}
|
|
2954
|
-
`)}var gi,NH,AH,hl,uf,mk,pf,fk,dn,pk,wi=E(()=>{"use strict";
|
|
2954
|
+
`)}var gi,NH,AH,hl,uf,mk,pf,fk,dn,pk,wi=E(()=>{"use strict";ar();lk();Xi();ft();wc();$e();vt();lr();df();di();gi=5,NH=`usage: lmctl lint <teamfile.lmctl>
|
|
2955
2955
|
|
|
2956
2956
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
2957
2957
|
For opencode members with model=, lint also asks the local ACP provider to
|
|
@@ -2973,7 +2973,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2973
2973
|
re-seed.
|
|
2974
2974
|
A member cannot refresh its own running session; run the refresh from a
|
|
2975
2975
|
different member session or a plain operator shell.
|
|
2976
|
-
`,mk='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',pf={existsSync:kH,statSync:IH,accessSync:SH},fk=async t=>{let{seed:e}=await Promise.resolve().then(()=>(
|
|
2976
|
+
`,mk='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',pf={existsSync:kH,statSync:IH,accessSync:SH},fk=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Mt(),id)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},dn=pf,pk=Ec});var Nk={};pe(Nk,{runClone:()=>s2});import{existsSync as gf,mkdirSync as zH,readFileSync as ZH,readdirSync as QH,statSync as kk,writeFileSync as e2}from"node:fs";import{basename as vk,dirname as t2,extname as r2,join as Ik,resolve as bk}from"node:path";async function s2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(n2),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2977
2977
|
`),2;let[r,n]=t,s,i=r;try{if(/^http:\/\//i.test(r))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(r))s=await o2(r);else{let c=bk(r);if(!gf(c))throw new Error(`source not found: ${r}`);let u=kk(c).isDirectory()?a2(c):c;s=ZH(u,"utf8"),i=u}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2978
2978
|
`),1}let o=bk(n),a=l2(o,i,n);if(gf(a))return e.stderr.write(`error: ${a} already exists.
|
|
2979
2979
|
`),1;let l=d2(c2(s));return zH(t2(a),{recursive:!0}),e2(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
@@ -3029,7 +3029,7 @@ Examples:
|
|
|
3029
3029
|
|
|
3030
3030
|
# Same shape, codex for the Lead and Reviewer2
|
|
3031
3031
|
lmctl plan ./backend --provider codex
|
|
3032
|
-
`});import{execFileSync as T2}from"node:child_process";import{resolve as $k}from"node:path";function v2(t){return t.filter(e=>e.state!=="retired")}function Ck(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?S(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=T2("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return S(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=$k(s),o=e.listProjects().find(a=>$k(a.local_path)===i);return o===void 0?S(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function Mk(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?S(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?S(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Dk(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?S(t,`member not found: ${n}`):i}let s=v2(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?S(t,`team ${r.name} has no active agent member`):s}var jk=E(()=>{"use strict";$e()});var Uk={};pe(Uk,{SIZE_WARN_EST_TOKENS:()=>Ti,estimateTokens:()=>Fk,runTerminal:()=>I2});import{spawn as b2}from"node:child_process";import{statSync as S2}from"node:fs";async function I2(t,e){if(t.includes("--help")||t.includes("-h"))return $2(e);let r=J(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return S(e,r.error);let n=$(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return S(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return S(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"?q(r,o):$(r,o)!==void 0)return S(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=$(r,"--alias"),l=Ow(o,s,a);return"err"in l?S(e,l.err):yf(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 Be(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?q(r,l):$(r,l)!==void 0)return S(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return S(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a
|
|
3032
|
+
`});import{execFileSync as T2}from"node:child_process";import{resolve as $k}from"node:path";function v2(t){return t.filter(e=>e.state!=="retired")}function Ck(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?S(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=T2("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return S(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=$k(s),o=e.listProjects().find(a=>$k(a.local_path)===i);return o===void 0?S(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function Mk(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?S(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?S(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Dk(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?S(t,`member not found: ${n}`):i}let s=v2(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?S(t,`team ${r.name} has no active agent member`):s}var jk=E(()=>{"use strict";$e()});var Uk={};pe(Uk,{SIZE_WARN_EST_TOKENS:()=>Ti,estimateTokens:()=>Fk,runTerminal:()=>I2});import{spawn as b2}from"node:child_process";import{statSync as S2}from"node:fs";async function I2(t,e){if(t.includes("--help")||t.includes("-h"))return $2(e);let r=J(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return S(e,r.error);let n=$(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return S(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return S(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"?q(r,o):$(r,o)!==void 0)return S(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=$(r,"--alias"),l=Ow(o,s,a);return"err"in l?S(e,l.err):yf(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 Be(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?q(r,l):$(r,l)!==void 0)return S(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return S(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=$r(k2,{target:i,alias:o,flags:{}});return a.mode==="error"?S(e,a.message):a.mode!=="ai-team"?S(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?S(e,"terminal: alias required for the teamfile target"):await O(e,l=>N2(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let i=R2(e,s,r);if(typeof i=="number")return i;let o=$(r,"--alias");return q(r,"--size")?O2(e,s,i,o,q(r,"--json")):L2(e,s,i,o)})}catch(s){return Be(e,s)}}async function N2(t,e,r,n){let s;try{s=De(e,r,n)}catch(d){return d instanceof ve?S(t,d.message):Be(t,d)}let i=Lr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Or()});if(!i.acquired)return S(t,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=Rb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=A2(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Lb()),a.unref?.();try{es(t,nt(s.teamfile),s.teamfile)}catch{}return c=await yf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),x2(n,l,c)}}function A2(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 x2(t,e,r){if(e!==null)try{t.finishTrackedInvocation(e,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function yf(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!Fa(r))return S(t,`no resume incantation for provider "${r}"`);if(!PT.test(n))return S(t,"refusing to resume: malformed sessionid");let o=zu(r,n,{isLead:e.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${d}
|
|
3033
3033
|
`),Ce({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return S(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=b2(a,l,{stdio:"inherit",cwd:s,env:We(process.env,s,n,"terminal")});d.on("error",u=>{c(S(t,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function R2(t,e,r){let n=$(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?S(t,`team not found: ${n}`):o}let s=Ck(t,e,$(r,"--project"));return typeof s=="number"?s:Mk(t,e,s,void 0)}async function L2(t,e,r,n){let s=Dk(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?S(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):yf(t,{provider:Ke(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function Fk(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=S2(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function O2(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return S(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Ke(a),d=a.model??null,u=null;Fa(c)&&(u=await Xe(l,c));let m=Fk(u),f=m.est>Ti;o.push({alias:a.alias,provider:c,sessionid:l,messages:m.messages,bytes:m.bytes,est_tokens:m.est,estimate:!0,over_guide:f,model:d,resume_incantation:f?Ua(c,l,d!==null?{model:d}:{}):null})}if(s)return Y(t,{estimate:!0,legend:Pk,guide_tokens:Ti,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
3034
3034
|
`),t.stdout.write(`${Pk}
|
|
3035
3035
|
`);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)
|
|
@@ -3069,17 +3069,17 @@ Examples:
|
|
|
3069
3069
|
tokens it surfaces the resume incantation so YOU can
|
|
3070
3070
|
open & self-compact. Nothing is ever changed
|
|
3071
3071
|
automatically; ${Ti} is a guide, not a gate.
|
|
3072
|
-
`),0}var k2,Ti,Pk,Wk=E(()=>{"use strict";it();
|
|
3073
|
-
`)}return 0}function B2(t,e){let r=J(t,["--docroot"]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ve(n))return S(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=It(n);if(Ge(s))return S(e,`workspace already exists: ${n} (${s})`);let i=$(r,"--docroot")??bi(n);
|
|
3074
|
-
`),0}function H2(t,e){let r=J(t,[]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace use <name>");if(!Ve(n))return S(e,`invalid workspace name: ${n}`);if(n!==
|
|
3072
|
+
`),0}var k2,Ti,Pk,Wk=E(()=>{"use strict";it();cr();$e();jk();vt();ar();ft();di();en();Ca();Cm();Sa();me();k2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Ti=2e5,Pk="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Ef(t,e){let r=C2[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var C2,qk=E(()=>{"use strict";C2={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Kk={};pe(Kk,{initWorkspace:()=>Gk,runWorkspace:()=>W2,setWorkspaceProvider:()=>Vk});import{copyFileSync as M2,cpSync as D2,existsSync as Ge,mkdirSync as Fr,readdirSync as Tf,renameSync as j2,rmSync as El,statSync as wl,writeFileSync as P2}from"node:fs";import{spawnSync as F2}from"node:child_process";import{homedir as Bk}from"node:os";import{dirname as vf,join as vi}from"node:path";async function W2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(U2),0;switch(r){case"list":return q2(n,e);case"create":return B2(n,e);case"use":return H2(n,e);case"show":return X2(n,e);case"delete":return J2(n,e);case"migrate":return G2(n,e);case"init":return Gk(n,e);case"set-provider":return Vk(n,e);default:return S(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Xk(){let t=us(),e=[],r=new Set,n=pr.default,s=Ge(pn()),i=Ge(It(n));if((s||i||t===null||t===n)&&(e.push({name:n,db_path:i?Ht(n):pn(),active:t===null||t===n,legacy:!i&&s}),r.add(n)),Ge(fr())){let o;try{o=Tf(fr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!Ve(a))continue;let l=!1;try{l=wl(It(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Ht(a),active:t===a,legacy:!1}),r.add(a))}}return e}function q2(t,e){let r=J(t,[]);if(r.error!==void 0)return S(e,r.error);if(r.positionals.length!==0)return S(e,"usage: lmctl workspace list");let n=Xk();if(q(r,"--json"))return Y(e,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";e.stdout.write(`${i} ${s.name} ${s.db_path}${o}
|
|
3073
|
+
`)}return 0}function B2(t,e){let r=J(t,["--docroot"]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ve(n))return S(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=It(n);if(Ge(s))return S(e,`workspace already exists: ${n} (${s})`);let i=$(r,"--docroot")??bi(n);Fr(s,{recursive:!0}),Fr(i,{recursive:!0});let o=Ht(n);Fr(vf(o),{recursive:!0});let a=xe({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return q(r,"--json")?Y(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
3074
|
+
`),0}function H2(t,e){let r=J(t,[]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace use <name>");if(!Ve(n))return S(e,`invalid workspace name: ${n}`);if(n!==pr.default&&!Ge(It(n)))return S(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=ds();return Fr(vf(s),{recursive:!0}),P2(s,`${n}
|
|
3075
3075
|
`),q(r,"--json")?Y(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
3076
3076
|
`),0}function X2(t,e){let r=J(t,[]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace show <name>");if(!Ve(n))return S(e,`invalid workspace name: ${n}`);let s=Xk().find(d=>d.name===n);if(s===void 0)return S(e,`workspace not found: ${n}`);let i=0;try{i=Ge(s.db_path)?wl(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Ge(s.db_path)){let d=xe({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return q(r,"--json")?Y(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
3077
|
-
`),0}function J2(t,e){let r=J(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ve(n))return S(e,`invalid workspace name: ${n}`);if(!q(r,"--confirm"))return S(e,`refusing to delete workspace ${n} without --confirm`);if(n===
|
|
3077
|
+
`),0}function J2(t,e){let r=J(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return S(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return S(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ve(n))return S(e,`invalid workspace name: ${n}`);if(!q(r,"--confirm"))return S(e,`refusing to delete workspace ${n} without --confirm`);if(n===pr.default&&!q(r,"--force"))return S(e,"refusing to delete the default workspace without --force");if(us()===n&&!q(r,"--force"))return S(e,`refusing to delete the active workspace (${n}) without --force`);let i=It(n);return Ge(i)?(El(i,{recursive:!0,force:!0}),q(r,"--json")?Y(e,{deleted:n,dir:i}):e.stdout.write(`deleted workspace ${n}
|
|
3078
3078
|
`),0):S(e,`workspace not found: ${n}`)}function wf(t,e,r){try{j2(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
|
|
3079
|
-
`),wl(t).isDirectory()?D2(t,e,{recursive:!0}):M2(t,e),!Ge(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);El(t,{recursive:!0,force:!0})}function G2(t,e){let r=J(t,[],["--json"]);if(r.error!==void 0)return S(e,r.error);let n=q(r,"--json"),s=Si(),i=
|
|
3079
|
+
`),wl(t).isDirectory()?D2(t,e,{recursive:!0}):M2(t,e),!Ge(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);El(t,{recursive:!0,force:!0})}function G2(t,e){let r=J(t,[],["--json"]);if(r.error!==void 0)return S(e,r.error);let n=q(r,"--json"),s=Si(),i=fr(),o=[],a=(m,f)=>{if(n)Y(e,{migrated:m,reason:f??null,actions:o});else{for(let p of o)e.stdout.write(`${p}
|
|
3080
3080
|
`);e.stdout.write(m?`migration complete
|
|
3081
3081
|
`:`${f??"nothing to migrate"}
|
|
3082
|
-
`)}return 0};if(!Ge(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Tf(s).sort()}catch{l=[]}let c=l.filter(m=>{try{return wl(vi(s,m)).isDirectory()}catch{return!1}});if(c.length===0)El(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Ge(i))wf(s,i,e),o.push(`renamed ${s} -> ${i}`);else{let m=c.filter(f=>Ge(vi(i,f)));if(m.length>0)return S(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${m.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);
|
|
3082
|
+
`)}return 0};if(!Ge(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Tf(s).sort()}catch{l=[]}let c=l.filter(m=>{try{return wl(vi(s,m)).isDirectory()}catch{return!1}});if(c.length===0)El(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Ge(i))wf(s,i,e),o.push(`renamed ${s} -> ${i}`);else{let m=c.filter(f=>Ge(vi(i,f)));if(m.length>0)return S(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${m.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Fr(i,{recursive:!0});for(let f of c)wf(vi(s,f),vi(i,f),e),o.push(`moved ${f} -> workspaces/${f}`);try{Tf(s).length===0&&(El(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=xl(),u=ds();return Ge(d)&&(Ge(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(wf(d,u,e),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Jk(t,e){return F2(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Y2(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function Hk(t){return t==="~"?Bk():t.startsWith("~/")?vi(Bk(),t.slice(2)):t}async function Gk(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${as.join(", ")}.`].join(`
|
|
3083
3083
|
`)+`
|
|
3084
3084
|
`),0;let s=J(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return S(e,s.error);if(s.positionals.length!==0)return S(e,n);let i=r.spawn??Jk,a=as.map(A=>Ef(A,i)).filter(A=>A.status==="ok"||A.status==="unverified").map(A=>A.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${as.join("|")} first
|
|
3085
3085
|
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??Y2,d=r.promptLine!==void 0||l,u=A=>(e.stderr.write(`error: ${A} is required in non-interactive mode (no TTY); pass it explicitly
|
|
@@ -3088,7 +3088,7 @@ Examples:
|
|
|
3088
3088
|
`)}}let p=It(m);if(Ge(p))return e.stderr.write(`error: workspace already exists: ${m} (${p}) \u2014 refusing to overwrite
|
|
3089
3089
|
`),2;let h,g=$(s,"--basedir"),_=bi(m);if(g!==void 0)h=Hk(g);else{if(!d)return u("--basedir");let A=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=A.length===0?_:Hk(A)}let y={};for(let A of["provider1","provider2","provider3"]){let X=$(s,`--${A}`),ge=V2[A],U=a.includes(ge)?ge:a[0];if(X!==void 0){if(!a.includes(X))return e.stderr.write(`error: --${A} ${X} is not an available provider (available: ${a.join(", ")})
|
|
3090
3090
|
`),2;y[A]=X;continue}if(!d)return u(`--${A}`);for(;;){let j=(await c(`${A} (${K2[A]}) [${U}]: `)).trim(),x=j.length===0?U:j;if(a.includes(x)){y[A]=x;break}e.stderr.write(`not an available provider: ${x} (available: ${a.join(", ")})
|
|
3091
|
-
`)}}
|
|
3091
|
+
`)}}Fr(p,{recursive:!0}),Fr(h,{recursive:!0});let T=Ht(m);Fr(vf(T),{recursive:!0});let v=xe({path:T});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",y.provider1),v.setConfig("workspace.provider2",y.provider2),v.setConfig("workspace.provider3",y.provider3)}finally{v.close()}let I={name:m,dir:p,db_path:T,basedir:h,providers:{...y}};return q(s,"--json")?Y(e,I):(e.stdout.write(`created workspace ${m} at ${p}
|
|
3092
3092
|
`),e.stdout.write(` basedir: ${h}
|
|
3093
3093
|
`),e.stdout.write(` provider1=${y.provider1} provider2=${y.provider2} provider3=${y.provider3}
|
|
3094
3094
|
`),e.stdout.write(`activate it with: lmctl workspace use ${m}
|
|
@@ -3097,7 +3097,7 @@ Examples:
|
|
|
3097
3097
|
`),0;let s=J(t,[]);if(s.error!==void 0)return S(e,s.error);let[i,o,...a]=s.positionals;if(i===void 0||o===void 0||a.length!==0)return S(e,n);let l=/^provider[123]$/.test(i)?i:/^[123]$/.test(i)?`provider${i}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${i} (expected provider1, provider2, or provider3)
|
|
3098
3098
|
`),2;let c=r.spawn??Jk,d=as.map(p=>Ef(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(d.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${as.join("|")} first
|
|
3099
3099
|
`),2;if(!d.includes(o))return e.stderr.write(`error: ${o} is not an available provider (available: ${d.join(", ")})
|
|
3100
|
-
`),2;let u=e.dal===void 0,m=e.dal??xe({path:ee()});try{m.setConfig(`workspace.${l}`,o)}finally{u&&m.close()}let f=Nt()??
|
|
3100
|
+
`),2;let u=e.dal===void 0,m=e.dal??xe({path:ee()});try{m.setConfig(`workspace.${l}`,o)}finally{u&&m.close()}let f=Nt()??pr.default;return e.stdout.write(`workspace.${l} = ${o} (workspace: ${f})
|
|
3101
3101
|
`),0}var U2,as,V2,K2,Yk=E(()=>{"use strict";it();qk();$e();Fe();U2=`usage: lmctl workspace list [--json]
|
|
3102
3102
|
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
3103
3103
|
lmctl workspace use <name> [--json]
|
|
@@ -3128,12 +3128,12 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
3128
3128
|
`:`# source=${m}
|
|
3129
3129
|
# tail_lines=${u.tail_lines}
|
|
3130
3130
|
`;await s("intents/recent.log",`${f}${u.tail}${u.tail.length>0?`
|
|
3131
|
-
`:""}`)}if(await s("README.md",nX(t)),t.sanitized)for(let u of n){let m=await tX(u.absPath);try{Jf(u.bundlePath,m.toString("utf8"))}catch(f){throw await rI(e,{recursive:!0,force:!0}),f instanceof
|
|
3131
|
+
`:""}`)}if(await s("README.md",nX(t)),t.sanitized)for(let u of n){let m=await tX(u.absPath);try{Jf(u.bundlePath,m.toString("utf8"))}catch(f){throw await rI(e,{recursive:!0,force:!0}),f instanceof Ur,f}}let o=await Zk(n),a=Qk({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 Sf(nI(t.outputPath),{recursive:!0});let l=eI("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=eI("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await rI(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:d}}function nX(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(`
|
|
3132
3132
|
`)}var iI=E(()=>{"use strict";bf();ki()});import{spawnSync as sX}from"node:child_process";import{stat as iX}from"node:fs/promises";async function oI(t){try{if(!(await iX(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 oX(t);case"hq":return aX(t)}}function oX(t){let r=sX("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function aX(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 aI=E(()=>{"use strict"});var cI={};pe(cI,{parseDiagnoseArgs:()=>lI,runDiagnose:()=>dX});import{tmpdir as lX}from"node:os";import{join as cX}from"node:path";async function dX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${fX()}
|
|
3133
3133
|
`),0;let r=lI(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
3134
3134
|
`),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
|
|
3135
3135
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
3136
|
-
`),2;let n=zk(),s=r.outputPath??mX(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async o=>{let a=await Vf({dal:o,include:r.include,dbPath:ee(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await sI({ticketId:n,data:a,outputPath:s,lmctlNextVersion:At(),sanitized:!r.noSanitize})}catch(u){if(u instanceof
|
|
3136
|
+
`),2;let n=zk(),s=r.outputPath??mX(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async o=>{let a=await Vf({dal:o,include:r.include,dbPath:ee(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await sI({ticketId:n,data:a,outputPath:s,lmctlNextVersion:At(),sanitized:!r.noSanitize})}catch(u){if(u instanceof Ur)return e.stderr.write(`sanitization failed: ${u.message}
|
|
3137
3137
|
`),2;throw u}let c=await oI({mode:i,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),d={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(d,null,2)}
|
|
3138
3138
|
`):(e.stdout.write(`ticket: ${n}
|
|
3139
3139
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
@@ -3150,7 +3150,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
3150
3150
|
`),2;let n=r[0];try{return await O(e,s=>(e.stdout.write(mI(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
3151
3151
|
`),1}}function If(){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(`
|
|
3152
3152
|
`)}var uI,Nf,Af,gI=E(()=>{"use strict";Qu();$e();uI=["Coder","Reviewer1","Polisher"],Nf=3e4,Af=new Set(["attention_needed","paused","escalation"])});var UI={};pe(UI,{appendIntent:()=>LI,resolveIntentLogPath:()=>RI,runStatus:()=>AX});import{appendFileSync as gX,existsSync as yX,mkdirSync as EX}from"node:fs";import{homedir as wX,hostname as yI}from"node:os";import{basename as TX,dirname as xI,isAbsolute as vX,join as bX,resolve as SX}from"node:path";function RI(){return process.env.LMCTL_INTENT_LOG??bX(wX(),".lmctl","recent-intents.log")}function LI(t){try{let e=RI();EX(xI(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});gX(e,`${r}
|
|
3153
|
-
`)}catch{}}async function AX(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(kX),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return S(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=J(t,["--since"],["--json"]);if(n.error!==void 0)return S(e,n.error);if(n.positionals.length>0)return S(e,`unknown argument: ${n.positionals[0]}`);let s=q(n,"--json"),i=iJ($(n,"--since"));if("error"in i)return S(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>bI(l,o));Y(e,a)}else{let a=await O(e,async l=>XX(await bI(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return LI({verb:"status",args:t}),0}catch(o){return S(e,o instanceof Error?o.message:String(o))}}async function bI(t,e){let r=rs(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(
|
|
3153
|
+
`)}catch{}}async function AX(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(kX),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return S(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=J(t,["--since"],["--json"]);if(n.error!==void 0)return S(e,n.error);if(n.positionals.length>0)return S(e,`unknown argument: ${n.positionals[0]}`);let s=q(n,"--json"),i=iJ($(n,"--since"));if("error"in i)return S(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>bI(l,o));Y(e,a)}else{let a=await O(e,async l=>XX(await bI(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return LI({verb:"status",args:t}),0}catch(o){return S(e,o instanceof Error?o.message:String(o))}}async function bI(t,e){let r=rs(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(Mr("status"));return await RX(t)}return await xX(t,r.identity)}async function xX(t,e){let r=Je(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(Mr("status"));let s=He(n.teamfile_path,t),i=Rf(vl(t,{from:r.value})),o=Rf(vl(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=CX([...xf(t,{from:r.value}),...xf(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...OI(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>OX(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>Lf(l,t)),to_me:o.map(l=>Lf(l,t))},transcript_harvest:await CI(a),mailbox:{outbound:bl(MX(t,r.teamfile,r.alias),"outbound"),inbound_pending:bl(DX(t,r.teamfile,r.alias),"inbound")},waiting_on:jX(t,r.teamfile,r.alias).map(l=>$I(l,t))}}function OI(){return{workspace:Nt(),db_path:ee()}}async function RX(t){let e=t.listRootTeams();return{scope:"workspace",identity:null,...OI(),teams:e.map(r=>LX(t,r)),activity:Rf(vl(t)).map(r=>Lf(r,t)),transcript_harvest:await CI(xf(t)),mailbox:{pending_outbound:bl(SI(t,"sender"),"outbound"),pending_inbound:bl(SI(t,"receiver"),"inbound")},waiting_on:PX(t).map(r=>$I(r,t))}}function LX(t,e){if(!yX(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let r=0;try{r=He(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function OX(t,e,r){let n=r.teamfile===void 0?null:Ne(vX(r.teamfile)?r.teamfile:SX(xI(e),r.teamfile),t),s=ir(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?$X(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function $X(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
|
|
3154
3154
|
SELECT * FROM tracked_invocation
|
|
3155
3155
|
WHERE kind = 'chat'
|
|
3156
3156
|
AND status = 'running'
|
|
@@ -3227,11 +3227,11 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
3227
3227
|
ELSE delivered_at
|
|
3228
3228
|
END ASC,
|
|
3229
3229
|
id ASC
|
|
3230
|
-
`).all()}function Rf(t){return t.filter(e=>Ra(e)!=="dead")}function $I(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:FI(t.payload),receiver_availability:FX(
|
|
3230
|
+
`).all()}function Rf(t){return t.filter(e=>Ra(e)!=="dead")}function $I(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:FI(t.payload),receiver_availability:FX(ir(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function FX(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${st(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===yI()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let e=t.terminalInvocation,r=e.holder_host===null?"unknown host":e.holder_host===yI()?"this host":e.holder_host,n=e.holder_pid===null?"":` holder pid ${e.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${e.id}${n} alive on ${r})`}}async function CI(t){let e=[];for(let r of t)e.push(await UX(r));return e}async function UX(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,r={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return un(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return un(r,"missing-request-payload",null,null);let n=WX(t.meta);if(n.provider===null||n.sessionid===null)return un(r,"missing-session-metadata",n.provider,n.sessionid);if(!qX(n.provider))return un(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await Xe(n.sessionid,n.provider)}catch{return un(r,"read-error",n.provider,n.sessionid)}if(s===null)return un(r,"session-not-found",n.provider,n.sessionid);let i=BX(t.request_payload,s.messages);return i.state!=="completed"?un(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:PI(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function un(t,e,r,n){return{...t,state:"unreconciled",reason:e,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function WX(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 qX(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function BX(t,e){let r=e.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===t);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of e.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
|
|
3231
3231
|
|
|
3232
3232
|
`),assistantTimestamp:HX(s[s.length-1]?.timestamp)}}function HX(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function Lf(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:Ra(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:AI(t.result_summary),error:AI(t.error)};return r.mailbox_delivery=QX(r,e),r}function bl(t,e){let r=new Map;for(let n of t){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=e==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function XX(t,e){return t.scope==="self"?JX(t,e):GX(t,e)}function JX(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),DI(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),jI(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Of(r,$f(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Of(r,$f(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),kl(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),kl(r,t.mailbox.inbound_pending),r.push(""),r.push(MI(t)),r.join(`
|
|
3233
3233
|
`)}function GX(t,e){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),DI(r,t.waiting_on,"workspace"),r.push(""),r.push("transcript harvest:"),jI(r,t.transcript_harvest,"workspace"),r.push(""),r.push("recent activity:"),Of(r,$f(t.activity,e.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),kl(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),kl(r,t.mailbox.pending_inbound),r.push(""),r.push(MI(t)),r.join(`
|
|
3234
|
-
`)}function MI(t){return ms(t.workspace,t.db_path)}function Of(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(NI).sort(zX),s=n.length===0?e:e.filter(i=>!NI(i));for(let i of n.slice(0,EI))II(t,i,r);Sl(t,n.length,EI,"more open delegations");for(let i of s.slice(0,Tl))II(t,i,r);Sl(t,s.length,Tl,"older")}function DI(t,e,r){if(e.length===0){t.push(" none");return}let n=VX(e,IX);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${st(s.sender)} -> ${st(s.receiver)}`:st(s.receiver);t.push(` ${i} - ${s.state} ${sJ(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}YX(t,e,n)}function jI(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Tl)){let s=r==="workspace"?` from ${st(n.from_identity)} -> ${st(n.target)}`:` -> ${st(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}Sl(t,e.length,Tl,"more transcript harvest rows")}function VX(t,e){let r=[...t].sort(kI);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=KX(n);a>=0&&(n[a]=o)}return n.sort(kI)}function KX(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function YX(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function kI(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function $f(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function II(t,e,r){let n=nJ(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${PI(i)}"`;t.push(` #${e.id} ${ZX(e)} ${e.kind}${n} ${s}${o}`)}function NI(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function zX(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function ZX(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function QX(t,e){let r=eJ(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function eJ(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=Je(t.from_identity),n=Je(t.target)}catch{return null}for(let s of tJ(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&rJ(i,t))return i}return null}function tJ(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function rJ(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function nJ(t,e){if(e==="from-me")return t.target===null?"":` -> ${st(t.target)}`;if(e==="to-me")return` from ${st(t.from_identity)}`;let r=t.target===null?"":` -> ${st(t.target)}`;return` from ${st(t.from_identity)}${r}`}function Sl(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function kl(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,wI)){let n=r.sender??"operator";t.push(` ${st(n)} -> ${st(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Sl(t,e.length,wI,"more lanes")}function AI(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function PI(t){let e=t.replace(/\s+/g," ").trim();return e.length<=TI?e:`${e.slice(0,TI-3)}...`}function FI(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=vI?e:`${e.slice(0,vI-3)}...`}function sJ(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function st(t){if(t==="operator")return t;try{let e=Je(t);return`${TX(e.teamfile)}:${e.alias}`}catch{return t}}function iJ(t){if(t===void 0)return{iso:new Date(Date.now()-NX).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var kX,Tl,EI,wI,IX,NX,TI,vI,WI=E(()=>{"use strict";en();$e();rl();Fe();ui();
|
|
3234
|
+
`)}function MI(t){return ms(t.workspace,t.db_path)}function Of(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(NI).sort(zX),s=n.length===0?e:e.filter(i=>!NI(i));for(let i of n.slice(0,EI))II(t,i,r);Sl(t,n.length,EI,"more open delegations");for(let i of s.slice(0,Tl))II(t,i,r);Sl(t,s.length,Tl,"older")}function DI(t,e,r){if(e.length===0){t.push(" none");return}let n=VX(e,IX);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${st(s.sender)} -> ${st(s.receiver)}`:st(s.receiver);t.push(` ${i} - ${s.state} ${sJ(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}YX(t,e,n)}function jI(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Tl)){let s=r==="workspace"?` from ${st(n.from_identity)} -> ${st(n.target)}`:` -> ${st(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}Sl(t,e.length,Tl,"more transcript harvest rows")}function VX(t,e){let r=[...t].sort(kI);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=KX(n);a>=0&&(n[a]=o)}return n.sort(kI)}function KX(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function YX(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function kI(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function $f(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function II(t,e,r){let n=nJ(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${PI(i)}"`;t.push(` #${e.id} ${ZX(e)} ${e.kind}${n} ${s}${o}`)}function NI(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function zX(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function ZX(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function QX(t,e){let r=eJ(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function eJ(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=Je(t.from_identity),n=Je(t.target)}catch{return null}for(let s of tJ(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&rJ(i,t))return i}return null}function tJ(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function rJ(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function nJ(t,e){if(e==="from-me")return t.target===null?"":` -> ${st(t.target)}`;if(e==="to-me")return` from ${st(t.from_identity)}`;let r=t.target===null?"":` -> ${st(t.target)}`;return` from ${st(t.from_identity)}${r}`}function Sl(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function kl(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,wI)){let n=r.sender??"operator";t.push(` ${st(n)} -> ${st(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Sl(t,e.length,wI,"more lanes")}function AI(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function PI(t){let e=t.replace(/\s+/g," ").trim();return e.length<=TI?e:`${e.slice(0,TI-3)}...`}function FI(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=vI?e:`${e.slice(0,vI-3)}...`}function sJ(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function st(t){if(t==="operator")return t;try{let e=Je(t);return`${TX(e.teamfile)}:${e.alias}`}catch{return t}}function iJ(t){if(t===void 0)return{iso:new Date(Date.now()-NX).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var kX,Tl,EI,wI,IX,NX,TI,vI,WI=E(()=>{"use strict";en();$e();rl();Fe();ui();lr();cr();kX=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
3235
3235
|
|
|
3236
3236
|
Show this member's team, busy/idle roster, recent tracked activity, and mailbox
|
|
3237
3237
|
state. From a plain operator shell, show a workspace-level team/activity summary.
|