@lmctl-ai/lmctl 0.1.231 → 0.1.233
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 +132 -130
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{for(var r in e)JN(t,r,{get:e[r],enumerable:!0})};var ap={};he(ap,{defaultDbPath:()=>ip,describeStateLocation:()=>hs,isSlowWslMount:()=>op,lmctlNextHome:()=>Oi,resolveDbPath:()=>ne,warnIfSlowDbPath:()=>Wl});import{platform as np}from"node:os";import{homedir as GN}from"node:os";import{join as sp}from"node:path";function Oi(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:sp(GN(),KN)}function ip(){return sp(Oi(),VN)}function ne(t){return t!==void 0&&t.length>0?t:process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?process.env.LMCTL_DB:ip()}function hs(t){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function op(t,e=np()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Wl(t,e=process.stderr,r=np()){op(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
2
|
`)}var KN,VN,ze=w(()=>{"use strict";KN=".lmctl",VN="state.db"});function QN(t){for(let e of ZN)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 eA(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function nA(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 gs(t){let e=t;for(let{re:r,replacement:n}of zN)e=e.replace(r,n);return e=e.replace(tA,r=>!nA(r)||QN(r)?r:lp),e=e.replace(rA,r=>eA(r)?r:lp),e}function ys(t){return t.split(`
|
|
3
3
|
`).map(e=>gs(e)).join(`
|
|
4
|
-
`)}function cp(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:pt}:{key:t,value:gs(e)}}function Er(t){if(typeof t=="string")return gs(t);if(Array.isArray(t))return t.map(e=>Er(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?pt:Er(n):e[r]=Er(n)}return e}return t}function up(t,e){for(let{name:r,re:n}of sA){let s=e.match(n);if(s!==null&&!s[0].includes(pt))throw new
|
|
4
|
+
`)}function cp(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:pt}:{key:t,value:gs(e)}}function Er(t){if(typeof t=="string")return gs(t);if(Array.isArray(t))return t.map(e=>Er(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?pt:Er(n):e[r]=Er(n)}return e}return t}function up(t,e){for(let{name:r,re:n}of sA){let s=e.match(n);if(s!==null&&!s[0].includes(pt))throw new Jr(t,r)}}var pt,YN,lp,dp,zN,ZN,tA,rA,sA,Jr,Ci=w(()=>{"use strict";pt="[REDACTED]",YN="[REDACTED_EMAIL]",lp="[REDACTED_IP]",dp="[USER]",zN=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${pt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${pt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${pt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:pt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:pt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:pt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:pt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${pt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${dp}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${dp}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:YN}],ZN=["127.","10.","192.168.","0.0.0.0"];tA=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,rA=/\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;sA=[{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"'`]+/}],Jr=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 ql}from"node:child_process";import{readFileSync as iA}from"node:fs";import{readFile as Hl,stat as fp}from"node:fs/promises";import{homedir as oA}from"node:os";import{join as aA}from"node:path";import{fileURLToPath as lA}from"node:url";function Rt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(iA(lA(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function mp(t){let e=new Set(t.include??$i),r={};return e.has("serve")&&(r.serve=await cA(t)),e.has("db")&&(r.db=uA(t)),e.has("runs")&&(r.runs=fA(t)),e.has("jobs")&&(r.jobs=mA(t)),e.has("attentions")&&(r.attentions=pA(t)),e.has("env")&&(r.env=await _A(t)),e.has("intents")&&(r.intents=await gA(t)),r}async function cA(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let c=(await Hl(e,"utf8")).trim(),u=Number.parseInt(c,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,d=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await Hl(r,"utf8")).split(`
|
|
5
5
|
`),f=u.slice(Math.max(0,u.length-n));d=f.length,a=ys(f.join(`
|
|
6
6
|
`))}catch(c){l=`serve log unreadable: ${c instanceof Error?c.message:String(c)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:d,log_tail:a,log_note:l}}function uA(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
|
|
7
7
|
`)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function fA(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 ${Bl} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${Bl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${Bl} FROM run
|
|
@@ -975,7 +975,7 @@ var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
975
975
|
AND started_at = ?
|
|
976
976
|
AND last_heartbeat_at IS ?
|
|
977
977
|
`)}}function Lt(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(Pp,"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")}${Pp}`}var Pp,Up=w(()=>{"use strict";Pp=`
|
|
978
|
-
...[truncated]`});function
|
|
978
|
+
...[truncated]`});function Gr(t){return[...t].sort((e,r)=>e.created_at.localeCompare(r.created_at)||e.id-r.id).at(-1)??null}function qp(t){return{insertMailboxMessage:t.prepare(`
|
|
979
979
|
INSERT INTO agent_mailbox (
|
|
980
980
|
receiver_teamfile, receiver_alias, sender_teamfile, sender_alias,
|
|
981
981
|
root_teamfile, payload, created_at, remote_transport, remote_message_id,
|
|
@@ -1106,16 +1106,16 @@ var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1106
1106
|
AND delivering_at IS NULL
|
|
1107
1107
|
ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
|
|
1108
1108
|
`),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function ws(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(Wp,"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")}${Wp}`}var Wp,Pi=w(()=>{"use strict";Wp=`
|
|
1109
|
-
...[truncated]`});function Ss(t,e){return JSON.stringify([t,e])}function Bp(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 Ts,vs,Hp=w(()=>{"use strict";Ts="terminal_lock",vs="member"});import{readFileSync as Xp}from"node:fs";function
|
|
1109
|
+
...[truncated]`});function Ss(t,e){return JSON.stringify([t,e])}function Bp(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 Ts,vs,Hp=w(()=>{"use strict";Ts="terminal_lock",vs="member"});import{readFileSync as Xp}from"node:fs";function Fe(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 Ql(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=ix();if(e===null)return null;try{let r=Xp(`/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 ix(){try{let t=Xp("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function ox(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function Jp(t,e){if(!Fe(t))return"gone";if(!ox(e))return"unverified";let r=Ql(t);return r===null?"unverified":r===e?"same":"different"}var wr=w(()=>{"use strict"});import{createHash as ax}from"node:crypto";function lx(t,e,r){return ax("sha256").update(`${t}\0${e}\0${r}`).digest("hex")}function Ie(t,e,r){let n=lx(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
|
|
1110
1110
|
VALUES (?, ?, ?, ?, ?)
|
|
1111
|
-
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(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 Fi=w(()=>{"use strict"});import{hostname as yn}from"node:os";function En(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return ed;let r=Number(e);return!Number.isFinite(r)||r<=0?ed:Math.max(1,Math.trunc(r))}function
|
|
1111
|
+
ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(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 Fi=w(()=>{"use strict"});import{hostname as yn}from"node:os";function En(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return ed;let r=Number(e);return!Number.isFinite(r)||r<=0?ed:Math.max(1,Math.trunc(r))}function Tr(t,e={}){let r=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(n=>{n||clearInterval(r)}).catch(n=>e.onError?.(n))},e.intervalMs??ed);return r.unref?.(),r}function Ot(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let d=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,leaseId:a.lease_id,previous:i,reclaimReason:d}}if(!Ui(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid},reclaim_reason:"dead-pid"});return l.acquired?{acquired:!0,lease:l.current??s,leaseId:l.lease_id,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function wn(t){return t.status!=="running"?null:t.holder_host===yn()&&t.holder_pid!==null&&t.holder_pid>0?Fe(t.holder_pid)?"live":"dead":"unknown"}function _t(t,e,r){let n,s=t.getTerminalLock(e,r);if(s!==null){if(dx(s))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:s};n??={source:"terminal-lock",holder_pid:s.holder_pid,holder_host:s.holder_host,reason:s.holder_host===yn()?"dead-pid":"stale"}}let i=cx(t,e,r);if(i!==null){if(ux(i))return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:i};n??={source:"terminal-invocation",holder_pid:i.holder_pid,holder_host:i.holder_host,reason:i.holder_pid!==null&&(i.holder_host===null||i.holder_host===yn())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,r);if(o!==null){let a=new Date(Date.now()-Tn()).toISOString();if(!Ui(o,a))return{busy:!0,reason:"in-flight",inFlight:o};n??={source:"in-flight",holder_pid:o.holder_pid,holder_host:o.holder_pid===null?null:yn(),reason:o.holder_pid===null?"stale":"dead-pid"}}return n===void 0?{busy:!1}:{busy:!1,reclaimable:n}}function dx(t){if(t.holder_host===yn())return Fe(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=mx():!1}function cx(t,e,r){return t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
|
|
1112
1112
|
FROM tracked_invocation
|
|
1113
1113
|
WHERE target_teamfile = ?
|
|
1114
1114
|
AND target_alias = ?
|
|
1115
1115
|
AND status = 'running'
|
|
1116
1116
|
AND launch_source = 'terminal'
|
|
1117
1117
|
ORDER BY started_at DESC, id DESC
|
|
1118
|
-
LIMIT 1`,e,r)[0]??null}function ux(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===yn())?
|
|
1118
|
+
LIMIT 1`,e,r)[0]??null}function ux(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===yn())?Fe(t.holder_pid):fx(t)}function fx(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=Tn():!1}function Ui(t,e){return t.holder_pid===null?t.started_at<e:!Fe(t.holder_pid)}function Tn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Gp;let r=Number(e);return!Number.isFinite(r)||r<=0?Gp:r}function mx(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return Kp;let r=Number(e);return!Number.isFinite(r)||r<=0?Kp:r}var Gp,Kp,ed,ht=w(()=>{"use strict";wr();Gp=8*60*60*1e3,Kp=12e4,ed=3e4});import{randomUUID as Yp}from"node:crypto";import{hostname as px}from"node:os";function Qt(t,e){return{teamfile:t,alias:e}}function Wi(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 qi(t,e){return t===null?null:Qt(t,e??"")}function Me(t){return`msg_mbx_${t}`}function er(t){return`msg_tcl_${t}`}function Kr(t){return`inv_${t}`}function Sn(t,e,r){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
|
|
1119
1119
|
holder_pid, holder_host, started_at, terminal_lock_id,
|
|
1120
1120
|
terminal_invocation_id, currently_handling_message_id,
|
|
1121
1121
|
currently_handling_since, last_seq
|
|
@@ -1132,7 +1132,7 @@ var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1132
1132
|
SET currently_handling_message_id = NULL,
|
|
1133
1133
|
currently_handling_since = NULL
|
|
1134
1134
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1135
|
-
AND currently_handling_message_id = ?`).run(e,r,n).changes===1}function gx(t,e){let r=e??new Date(Date.now()-Tn()).toISOString();return Ui({holder_pid:t.holder_pid,started_at:t.started_at??""},r)}function yx(t,e,r){return e==="force"||e==="session-idle"?e:r?"force":t.holder_pid!==null&&!
|
|
1135
|
+
AND currently_handling_message_id = ?`).run(e,r,n).changes===1}function gx(t,e){let r=e??new Date(Date.now()-Tn()).toISOString();return Ui({holder_pid:t.holder_pid,started_at:t.started_at??""},r)}function yx(t,e,r){return e==="force"||e==="session-idle"?e:r?"force":t.holder_pid!==null&&!Fe(t.holder_pid)?"dead-pid":"stale"}function Ex(t){return{sender:qi(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function vn(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
|
|
1136
1136
|
FROM message_pending WHERE message_id = ?`).get(e)??null}function tr(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function td(t,e={},r={}){return{message_id:Me(t.id),message_type:t.message_type,sender:t.sender_teamfile===null?null:Wi(t.sender_teamfile,t.sender_alias??"",r),receiver:Wi(t.receiver_teamfile,t.receiver_alias,e),root_teamfile:t.root_teamfile,legacy:{table:"agent_mailbox",id:t.id}}}function rd(t,e,r={},n={},s=[]){let i=Me(e.id),o=e.message_type==="response",a=o&&e.request_mailbox_id!==null?wx(t,e.request_mailbox_id):{},l={provider:a.provider??r.provider,sessionId:a.sessionId??r.sessionId},d=e.request_mailbox_id===null?null:Me(e.request_mailbox_id),c=td(e,l,n);Ie(t,{stream_id:i,event_type:o?"RESPONSE_CREATE":"CREATE",observedLastSeq:0,ts:e.created_at,payload:{...c,content:e.payload,...o?{}:zp(t,e.sender_teamfile,e.sender_alias),...o?{in_reply_to_message_id:d,...s.length>0?{batched_request_message_ids:s}:{}}:{}}},()=>{}),Ie(t,{stream_id:i,event_type:o?"RESPONSE_ENQUEUE":"ENQUEUE",observedLastSeq:0,ts:e.created_at,payload:{...c,...o?{in_reply_to_message_id:d}:{}}},u=>{t.prepare(`INSERT INTO message_pending
|
|
1137
1137
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
1138
1138
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
@@ -1206,14 +1206,14 @@ var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1206
1206
|
AND json_extract(payload, '$.acked_by') = ?
|
|
1207
1207
|
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?(Vp(t,e.messageId,e.ackedBy,e.ts),"removed"):vn(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=vn(t,e.messageId),a=n?"not-pending":"record-only",l=Ie(t,{stream_id:e.messageId,event_type:"MESSAGE_ACKNOWLEDGED",intentKey:`MESSAGE_ACKNOWLEDGED:${e.ackedBy}`,observedLastSeq:i,...e.ts!==void 0?{ts:e.ts}:{},payload:{acked_by:e.ackedBy,acked_at:e.ts??new Date().toISOString(),...e.note!==void 0?{note:e.note}:{},pid:e.holderPid??null,host:e.holderHost??null}},()=>{if(!n)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(a="removed",Vp(t,e.messageId,e.ackedBy,e.ts)):o!==null&&(a="claimed")});if(!l.appended){let d=vn(t,e.messageId);a=n?d===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}function Vp(t,e,r,n){let s=/^msg_mbx_(\d+)$/.exec(e);s!==null&&t.prepare(`UPDATE agent_mailbox
|
|
1208
1208
|
SET delivered_at = ?, receipt = ?
|
|
1209
|
-
WHERE id = ? AND delivered_at IS NULL`).run(n??new Date().toISOString(),`[acknowledged by ${r}]`,Number(s[1]))}var _x,kn=w(()=>{"use strict";Fi();ht();
|
|
1209
|
+
WHERE id = ? AND delivered_at IS NULL`).run(n??new Date().toISOString(),`[acknowledged by ${r}]`,Number(s[1]))}var _x,kn=w(()=>{"use strict";Fi();ht();wr();_x=60*60*1e3});function l_(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function od(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function d_(t,e){let r=Kr(e.id),n=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;Ie(t,{stream_id:r,event_type:vx,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:r,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:n,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
|
|
1210
1210
|
(invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
|
|
1211
1211
|
root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
|
|
1212
1212
|
status, started_at, last_heartbeat_at, last_seq)
|
|
1213
1213
|
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),od(e)&&n_(t,i,{invocationId:r,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Xi(t,e){let r=Kr(e.id),n=l_(t,r);return n===null?!1:(Ie(t,{stream_id:r,event_type:Sx,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
|
|
1214
1214
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1215
1215
|
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}`);od(e)&&i_(t,s,r)}),!0)}function c_(t,e,r,n){let s=Kr(e.id),i=l_(t,s);return i===null?!1:(Ie(t,{stream_id:s,event_type:bx,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 u_(t,e,r){let n=Kr(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(r,n),od(e)&&s_(t,n,r)}function f_(t,e,r){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(r,Kr(e))}function m_(t,e,r){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(r,Kr(e))}var vx,Sx,bx,p_=w(()=>{"use strict";Fi();kn();vx="INVOCATION_START",Sx="INVOCATION_FINISH",bx="INVOCATION_NOTIFY_CLAIM"});function In(t){return typeof t=="string"&&kx.has(t)}function g_(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: ${Ji[0]}`,` STANCE: ${Ji[1]}`,` STANCE: ${Ji[2]}`,` STANCE: ${__}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
1216
|
-
`)}var __,Ji,kx,Is,h_,ad,Gi,Ns=w(()=>{"use strict";__="other",Ji=["not_enough_information","dont_know","other_work"],kx=new Set([__,...Ji]),Is="@abort",h_="invalid_decision",ad="escalation_aborted",Gi="workflow_escalation"});import{randomUUID as y_}from"node:crypto";import{hostname as As}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function
|
|
1216
|
+
`)}var __,Ji,kx,Is,h_,ad,Gi,Ns=w(()=>{"use strict";__="other",Ji=["not_enough_information","dont_know","other_work"],kx=new Set([__,...Ji]),Is="@abort",h_="invalid_decision",ad="escalation_aborted",Gi="workflow_escalation"});import{randomUUID as y_}from"node:crypto";import{hostname as As}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function Be(t){return new ld(ji({dbPath:t.path}))}function E_(t,e,r){let n=w_(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let d=r(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return w_(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let c of o(l))a(c)}finally{i.pop()}s.add(l)}};a(t)}function w_(t){let e=Ix(t),r=e===null?null:Nx(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))Ki(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function Ix(t){try{let e=JSON.parse(t);return Ki(e)?e:null}catch{return null}}function Nx(t,e){let r=t[e];return Ki(r)?r:null}function Ki(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ax(t){try{let e=JSON.parse(t);return!Ki(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 xx(t,e){return t===null?!0:t.holder_host===As()?!Fe(t.holder_pid):t.last_heartbeat<e}function Rx(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===As()&&Lx(t.delivery_holder_pid)){let n=Fe(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 vr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);D({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 Lx(t){return Number.isInteger(t)&&(t??0)>0}function Ox(t){return{...qp(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1217
1217
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1218
1218
|
VALUES (?, ?, ?, ?, ?)
|
|
1219
1219
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1620,11 +1620,11 @@ var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1620
1620
|
response = NULL
|
|
1621
1621
|
WHERE id = ?
|
|
1622
1622
|
AND status = 'running'
|
|
1623
|
-
`),...Fp(t),...Dp(t)}}function Cx(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ld,dt=w(()=>{"use strict";Zl();jp();Up();Pi();Hp();Gr();pe();kn();p_();Ns();ld=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Ox(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,c=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!c)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>Cx("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!==Gi)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let c=JSON.parse(i.payload);c.step!==void 0&&typeof c.step.id=="string"&&c.step.id.length>0&&(o=c.step.id),Array.isArray(c.declared_outcomes)&&(a=c.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Is&&!a.includes(n))return{resumed:!1,reason:h_};let d={};if(l.pending_escalation_decision!==null)try{let c=JSON.parse(l.pending_escalation_decision);c!==null&&typeof c=="object"&&!Array.isArray(c)&&(d=c)}catch{d={}}return d[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale"),d=e_(this.db,o,s,l,n.stale_before??null,n.force===!0);a={acquired:!0,current:o,lease_id:d}}else a={acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n),i=Jr(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:Me(i.id)};for(let a of s)bs(this.db,a,"",M(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){E_(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,M()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,M());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){E_(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,M());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,M())}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,M());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,M()),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,M(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(M(),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,M());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,M());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,M(),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,M());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",M());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,M());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=M(),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,M(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,M(),e)??null}closeIssue(e,r,n){let s=M(),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,M(),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,M(),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=M();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,M(),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,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=y_(),s=M();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=M(),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,M())}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??M(),e.dedupe_key??null,e.concurrency_key??null,M());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=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=M(),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:M();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,M()),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,M()),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??M(),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,M());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=M(),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,M(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(M(),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 nd(this.db,n,e),Hi(this.db,n,e),n})()}beginTeamChatLog(e){return this.db.transaction(()=>{let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return nd(this.db,n,e),n})()}finishTeamChatLog(e,r){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Hi(this.db,e,r)})()}setCurrentlyHandlingMessage(e,r,n){this.db.transaction(()=>{bn(this.db,e,r,n)})()}clearCurrentlyHandlingMessage(e,r,n){return this.db.transaction(()=>Bi(this.db,e,r,n))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??M(),n=e.holder_host??As(),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,Lt(e.command),r,e.holder_pid??null,n,s,Lt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return d_(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??M();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Lt(r.result_summary),Lt(r.error),r.team_chat_log_id??null,Lt(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Xi(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??M();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Lt(n.result_summary),Lt(n.error),n.team_chat_log_id??null,Lt(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 Xi(this.db,o),o})()}heartbeatTrackedInvocation(e,r=M()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return u_(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(f_(this.db,e,r),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,r){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(r,e).changes!==1?null:(m_(this.db,e,er(r)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,r,n){return this.db.transaction(()=>{let s=M();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Lt(n),e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Xi(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,n),o})()}terminalizeLinkedChatMessage(e,r){let n=this.stmts.getTeamChatLogById.get(e);n===void 0||n.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",r,e).changes!==1||Hi(this.db,e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,message:n.message,response:null,origin:n.origin,status:"error",error_detail:r,truncated:n.truncated,created_at:M()})}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=M()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return c_(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,ws(e.payload),e.created_at??M(),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 rd(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=ws(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of s){let c=this.getMailboxMessage(d),u=this.stmts.markMailboxMessageDelivered.run(n,i,d);a+=u.changes,u.changes===1&&c!==null&&o.push(c)}let l=new Map;for(let d of o){if(d.message_type!=="request")continue;let c=`${d.receiver_teamfile}\0${d.receiver_alias}`,u=l.get(c);(u===void 0||Jr([u,d])?.id===d.id)&&l.set(c,d)}for(let d of o){let c=l.get(`${d.receiver_teamfile}\0${d.receiver_alias}`)??null;bs(this.db,d,i,n,null,d.message_type==="request"&&c!==null?{action:"clear",messageId:Me(c.id)}:null)}this.db.exec("COMMIT");for(let d of o)Tr("mailbox_delivery_delivered",d,{transition:d.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=ws(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}a+=1,i.push(c)}let l=Jr(i),d=l===null?null:{action:"clear",messageId:Me(l.id)};for(let c of i)bs(this.db,c,s,n,null,d);this.db.exec("COMMIT");for(let c of i)Tr("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let c of o)Tr("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=ws(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let d=[...i].sort((p,h)=>p.created_at.localeCompare(h.created_at)||p.id-h.id),c=Jr(i),u=null;if(c!==null&&c.sender_teamfile!==null&&c.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:Me(u.id),m=c===null?null:{action:"clear",messageId:Me(c.id)};for(let p of i)bs(this.db,p,s,n,c!==null&&p.id!==c.id?f:null,m);u!==null&&rd(this.db,u,{},{},d.map(p=>Me(p.id))),this.db.exec("COMMIT");for(let p of i)Tr("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let p of o)Tr("mailbox_delivery_finalize_skipped",p,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=As()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let c=this.getMailboxMessage(l);c!==null&&(Zp(this.db,c,r,n,s),o.push(c))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)Tr("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&&(sd(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)Tr("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&&sd(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=Rx(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)Tr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}heartbeatAgentInflight(e,r,n=M()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:t_(this.db,s,r,n)})()}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&ks(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&&ks(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,r){this.db.exec("BEGIN IMMEDIATE");try{let n=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(n===null||n.sender_teamfile!==e.sender_teamfile||n.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1624
|
-
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==r)return this.db.exec("COMMIT"),!1;if(n.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&ks(this.db,n,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(ks(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Ts,Ss(e,r),vs);return n===void 0?null:Bp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&id(this.db,n,!0),this.stmts.upsertRuntimeState.run(Ts,Ss(e.teamfile,e.alias),vs,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&r_(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(Ts,Ss(e,r),vs,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(Ts,Ss(e,r),vs);return i.changes===1&&id(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:Ax(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=M()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!xx(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:y_(),holder_pid:process.pid,holder_host:As(),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,M(),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,M())}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,M());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,M(),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??M(),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,M());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,M()).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,M()),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,M());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(M(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=M();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??M());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,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});import{realpathSync as $x}from"node:fs";import{resolve as Mx}from"node:path";function dd(t){let e=Mx(t);try{return $x(e)}catch{return e}}var T_=w(()=>{"use strict"});import{platform as v_}from"node:os";function Ct(t){let e=new xs;for(let r of t)e.registerAdapter(r);return e}var xs,cd=w(()=>{"use strict";T_();xs=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=dd(e.workspace);i=i.filter(a=>dd(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=v_()==="darwin"||v_()==="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 S_}from"node:fs";import{createInterface as b_}from"node:readline";import{stat as Dx}from"node:fs/promises";import{homedir as jx}from"node:os";function k_(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*Be(t){let e=S_(t,{encoding:"utf-8"}),r=b_({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(!s)continue;let i=k_(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Xe(t,e){let r=[],n=S_(t,{encoding:"utf-8"}),s=b_({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=k_(o);if(a!==void 0&&r.push(a),r.length>=e)break}}finally{s.close(),n.destroy()}return r}async function Oe(t){let e=await Dx(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function fe(t){return t.replace(/\\n/g,`
|
|
1625
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function X(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function $t(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ve,rr=w(()=>{"use strict";ve=jx()});import{readdir as Vi,stat as I_,unlink as Px}from"node:fs/promises";import{join as Nn,basename as N_}from"node:path";function Fx(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Ux(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return fe(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function A_(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of
|
|
1626
|
-
`),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else i.start&&(u.start=i.start),i.resume&&(u.resume=i.resume),i.agent&&(u.agent=i.agent),i.profile_flag!==void 0&&(u.profile_flag=i.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?r.providers?.[s.provider]??{}:r.global??{};if(i.min!==void 0){let f=R_(i.min);f!==null&&(u.min=f)}if(i.max!==void 0){let f=R_(i.max);f!==null&&(u.max=f)}s.provider?(r.providers||(r.providers={}),r.providers[s.provider]=u):r.global=u}i={}}for(let u of n){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=Vx(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=Kx(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let d={tools:e};(r.global||r.providers)&&(d.compact=r);let c=a.site_name;return c!==void 0&&c.length>0&&(d.site_name=c),d}function O_(t){return t.site_name??null}function Zx(t,e,r){if(!r)return"";let n=t.tools[e]??ud[e],s=n?.profiles?.[r]?.flags??ud[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 C_(t,e){return!!t.tools[e]}function $_(t,e,r,n,s){let i=t.tools[e]??ud[e],o;if(i?.agent){let l=zi(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Jx[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(c=>c.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let c=d.map(zi).join(" ");o=`printf '%s\\n' ${zi(n)} | ${c}`}else o=d.map(zi).join(" ")}let a=Zx(t,e,s);return a&&(o+=" "+a),o}var ud,Jx,fd=w(()=>{"use strict";ud={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}}},Jx={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]}}});function M_(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 D_=w(()=>{"use strict"});var Qx,ge,Zi,gt=w(()=>{"use strict";Qx="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${Qx}`,Zi=`send this exact lmctl seed instruction: "${ge}"`});function
|
|
1627
|
-
`: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:Zi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&C_(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,i,o,a="",l,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),c(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},c=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,d(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&d(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(c(),{...p,status:"ok"})).catch(p=>{throw c(),o==="external"?new md("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=$_(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=M_(r.env),d=j_(s,{shell:!0,cwd:r.cwd,env:Je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),c=!1,u=!1,f=setTimeout(()=>{u=!0,d.kill()},l),m="",p="";if(d.stdout?.on("data",h=>{let _=h.toString();m+=_,r.onDelta?.(_)}),d.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),d.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>d.kill(),{once:!0})}d.on("exit",h=>{if(c)return;c=!0,clearTimeout(f);let _=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:_}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),d.on("error",h=>{c||(c=!0,clearTimeout(f),a(h))})})}}});function eo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new sr(t,r,e)}var ct,Se,nr,Qi,sr,An=w(()=>{"use strict";ct=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Se=class extends ct{},nr=class extends ct{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Qi=class extends ct{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},sr=class extends ct{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as _d from"node:child_process";function sR(t){if(typeof _d.spawnSync=="function")try{_d.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function P_(t){return t.exitCode!==null||t.signalCode!==null}function pd(t,e){return P_(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function et(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??sR;if(P_(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await pd(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 pd(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await pd(t,nR)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nR,Ls=w(()=>{"use strict";nR=1e3});function F_(t){le()&&Pe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function
|
|
1623
|
+
`),...Fp(t),...Dp(t)}}function Cx(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ld,dt=w(()=>{"use strict";Zl();jp();Up();Pi();Hp();wr();pe();kn();p_();Ns();ld=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Ox(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,c=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!c)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>Cx("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!==Gi)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let c=JSON.parse(i.payload);c.step!==void 0&&typeof c.step.id=="string"&&c.step.id.length>0&&(o=c.step.id),Array.isArray(c.declared_outcomes)&&(a=c.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Is&&!a.includes(n))return{resumed:!1,reason:h_};let d={};if(l.pending_escalation_decision!==null)try{let c=JSON.parse(l.pending_escalation_decision);c!==null&&typeof c=="object"&&!Array.isArray(c)&&(d=c)}catch{d={}}return d[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale"),d=e_(this.db,o,s,l,n.stale_before??null,n.force===!0);a={acquired:!0,current:o,lease_id:d}}else a={acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n),i=Gr(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:Me(i.id)};for(let a of s)bs(this.db,a,"",M(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){E_(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,M()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,M());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){E_(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,M());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,M())}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,M());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,M()),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,M(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(M(),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,M());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,M());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,M(),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,M());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",M());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,M());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=M(),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,M(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,M(),e)??null}closeIssue(e,r,n){let s=M(),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,M(),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,M(),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=M();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,M(),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,M(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=y_(),s=M();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=M(),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,M())}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??M(),e.dedupe_key??null,e.concurrency_key??null,M());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=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=M(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=M(),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:M();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,M()),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,M()),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??M(),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,M());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=M(),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,M(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(M(),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 nd(this.db,n,e),Hi(this.db,n,e),n})()}beginTeamChatLog(e){return this.db.transaction(()=>{let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),n=Number(r.lastInsertRowid);return nd(this.db,n,e),n})()}finishTeamChatLog(e,r){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Hi(this.db,e,r)})()}setCurrentlyHandlingMessage(e,r,n){this.db.transaction(()=>{bn(this.db,e,r,n)})()}clearCurrentlyHandlingMessage(e,r,n){return this.db.transaction(()=>Bi(this.db,e,r,n))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??M(),n=e.holder_host??As(),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,Lt(e.command),r,e.holder_pid??null,n,s,Lt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return d_(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??M();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Lt(r.result_summary),Lt(r.error),r.team_chat_log_id??null,Lt(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Xi(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??M();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Lt(n.result_summary),Lt(n.error),n.team_chat_log_id??null,Lt(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 Xi(this.db,o),o})()}heartbeatTrackedInvocation(e,r=M()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return u_(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(f_(this.db,e,r),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,r){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(r,e).changes!==1?null:(m_(this.db,e,er(r)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,r,n){return this.db.transaction(()=>{let s=M();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Lt(n),e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Xi(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,n),o})()}terminalizeLinkedChatMessage(e,r){let n=this.stmts.getTeamChatLogById.get(e);n===void 0||n.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",r,e).changes!==1||Hi(this.db,e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,message:n.message,response:null,origin:n.origin,status:"error",error_detail:r,truncated:n.truncated,created_at:M()})}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=M()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return c_(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,ws(e.payload),e.created_at??M(),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 rd(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=ws(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of s){let c=this.getMailboxMessage(d),u=this.stmts.markMailboxMessageDelivered.run(n,i,d);a+=u.changes,u.changes===1&&c!==null&&o.push(c)}let l=new Map;for(let d of o){if(d.message_type!=="request")continue;let c=`${d.receiver_teamfile}\0${d.receiver_alias}`,u=l.get(c);(u===void 0||Gr([u,d])?.id===d.id)&&l.set(c,d)}for(let d of o){let c=l.get(`${d.receiver_teamfile}\0${d.receiver_alias}`)??null;bs(this.db,d,i,n,null,d.message_type==="request"&&c!==null?{action:"clear",messageId:Me(c.id)}:null)}this.db.exec("COMMIT");for(let d of o)vr("mailbox_delivery_delivered",d,{transition:d.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=ws(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}a+=1,i.push(c)}let l=Gr(i),d=l===null?null:{action:"clear",messageId:Me(l.id)};for(let c of i)bs(this.db,c,s,n,null,d);this.db.exec("COMMIT");for(let c of i)vr("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let c of o)vr("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=ws(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let d=[...i].sort((p,h)=>p.created_at.localeCompare(h.created_at)||p.id-h.id),c=Gr(i),u=null;if(c!==null&&c.sender_teamfile!==null&&c.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:Me(u.id),m=c===null?null:{action:"clear",messageId:Me(c.id)};for(let p of i)bs(this.db,p,s,n,c!==null&&p.id!==c.id?f:null,m);u!==null&&rd(this.db,u,{},{},d.map(p=>Me(p.id))),this.db.exec("COMMIT");for(let p of i)vr("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let p of o)vr("mailbox_delivery_finalize_skipped",p,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=As()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let c=this.getMailboxMessage(l);c!==null&&(Zp(this.db,c,r,n,s),o.push(c))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)vr("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&&(sd(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)vr("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&&sd(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=Rx(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)vr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}heartbeatAgentInflight(e,r,n=M()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:t_(this.db,s,r,n)})()}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&ks(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&&ks(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,r){this.db.exec("BEGIN IMMEDIATE");try{let n=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(n===null||n.sender_teamfile!==e.sender_teamfile||n.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1624
|
+
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==r)return this.db.exec("COMMIT"),!1;if(n.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&ks(this.db,n,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(ks(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Ts,Ss(e,r),vs);return n===void 0?null:Bp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&id(this.db,n,!0),this.stmts.upsertRuntimeState.run(Ts,Ss(e.teamfile,e.alias),vs,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&r_(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(Ts,Ss(e,r),vs,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(Ts,Ss(e,r),vs);return i.changes===1&&id(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:Ax(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=M()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!xx(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:y_(),holder_pid:process.pid,holder_host:As(),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,M(),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,M())}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,M());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,M(),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??M(),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,M());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,M()).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,M()),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,M());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(M(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=M();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??M());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,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});import{realpathSync as $x}from"node:fs";import{resolve as Mx}from"node:path";function dd(t){let e=Mx(t);try{return $x(e)}catch{return e}}var T_=w(()=>{"use strict"});import{platform as v_}from"node:os";function Ct(t){let e=new xs;for(let r of t)e.registerAdapter(r);return e}var xs,cd=w(()=>{"use strict";T_();xs=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=dd(e.workspace);i=i.filter(a=>dd(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=v_()==="darwin"||v_()==="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 S_}from"node:fs";import{createInterface as b_}from"node:readline";import{stat as Dx}from"node:fs/promises";import{homedir as jx}from"node:os";function k_(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*He(t){let e=S_(t,{encoding:"utf-8"}),r=b_({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(!s)continue;let i=k_(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Xe(t,e){let r=[],n=S_(t,{encoding:"utf-8"}),s=b_({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=k_(o);if(a!==void 0&&r.push(a),r.length>=e)break}}finally{s.close(),n.destroy()}return r}async function Oe(t){let e=await Dx(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function fe(t){return t.replace(/\\n/g,`
|
|
1625
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function X(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function $t(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ve,rr=w(()=>{"use strict";ve=jx()});import{readdir as Vi,stat as I_,unlink as Px}from"node:fs/promises";import{join as Nn,basename as N_}from"node:path";function Fx(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Ux(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return fe(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function A_(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of He(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let d=l.message.content;if(typeof d=="string"){if(d.includes("<command-name>")||d.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let d=l.message.content;if(Array.isArray(d))for(let u of d)u.type==="text"&&e++;let c=l.message.usage;if(c){let u=c.input_tokens||0,f=c.cache_creation_input_tokens||0,m=c.cache_read_input_tokens||0,p=c.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let h=u+f+m;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function Wx(t){let e=qx(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function qx(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var Yi,x_=w(()=>{"use strict";rr();Yi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Nn(ve,".claude"),this.projectsDir=Nn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Vi(this.projectsDir)}catch{return e}for(let n of r){let s=Nn(this.projectsDir,n);if(!(await I_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Vi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=N_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let d=Nn(s,a);try{let c=await this.extractSummary(d,l);c&&e.push(c)}catch{}}}return e}async extractSummary(e,r){let n=await Xe(e,50),s=await Oe(e),i="",o,a,l,d,c,u;for(let m of n)if(!Fx(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;d||(d=X(p.trim(),80)),c=X(p.trim(),80)}}if(!i)return null;let f=await A_(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:d,lastUserMessage:c,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Oe(r),s=[],i="",o,a,l,d,c,u,f,m=e,p;for await(let _ of He(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!d&&_.gitBranch&&(d=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:Ux(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),y=_.message.content;if(typeof y=="string"){if(y.includes("<command-name>")||y.includes("<local-command-"))continue;c||(c=X(y.trim(),80)),u=X(y.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:fe(y.trim())})}else if(Array.isArray(y)){for(let E of y)if(E.type==="tool_result"){let v=typeof E.content=="string"?fe(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:g,content:v,toolCallId:E.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.stop_reason===null||_.message.stop_reason==="tool_use"?p="in_progress":typeof _.message.stop_reason=="string"&&(p="complete"),_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),y=_.message.content;if(Array.isArray(y))for(let E of y)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:g,content:fe(E.text),model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):E.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:E.name||"unknown tool",toolName:E.name,toolInput:JSON.stringify(E.input,null,2),toolInputData:E.input,toolCallId:E.id,model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:g,content:E.thinking})}}if(!i)return null;Wx(s);let h=await A_(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:d,turnStatus:p,firstUserMessage:c,lastUserMessage:u,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Px(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Vi(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Nn(this.projectsDir,o);if(!(await I_(a).catch(()=>null))?.isDirectory())continue;let d;try{d=await Vi(a)}catch{continue}for(let c of d){if(!c.endsWith(".jsonl"))continue;let u=N_(c,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Nn(a,c),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Xe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as Bx,writeFileSync as cV,mkdirSync as uV}from"node:fs";import{join as Hx,dirname as mV}from"node:path";import{homedir as Xx}from"node:os";function Gx(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Kx(t){let e=t.indexOf("=");if(e===-1)return null;let r=t.slice(0,e).trim(),n=Gx(t.slice(e+1).trim());return r?{key:r,value:n}:null}function Vx(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function zi(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Yx(){return Hx(Xx(),".lmctl","config.toml")}function L_(t){let e=t??Yx(),r;try{r=Bx(e,"utf-8")}catch{return{tools:{}}}return zx(r)}function R_(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let r=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!r)return null;let n=parseFloat(r[1]);if(!Number.isFinite(n))return null;switch(r[2]){case"K":case"k":return Math.round(n*1e3);case"M":case"m":return Math.round(n*1e6);default:return Math.round(n)}}function zx(t){let e={},r={},n=t.split(`
|
|
1626
|
+
`),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else i.start&&(u.start=i.start),i.resume&&(u.resume=i.resume),i.agent&&(u.agent=i.agent),i.profile_flag!==void 0&&(u.profile_flag=i.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?r.providers?.[s.provider]??{}:r.global??{};if(i.min!==void 0){let f=R_(i.min);f!==null&&(u.min=f)}if(i.max!==void 0){let f=R_(i.max);f!==null&&(u.max=f)}s.provider?(r.providers||(r.providers={}),r.providers[s.provider]=u):r.global=u}i={}}for(let u of n){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=Vx(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=Kx(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let d={tools:e};(r.global||r.providers)&&(d.compact=r);let c=a.site_name;return c!==void 0&&c.length>0&&(d.site_name=c),d}function O_(t){return t.site_name??null}function Zx(t,e,r){if(!r)return"";let n=t.tools[e]??ud[e],s=n?.profiles?.[r]?.flags??ud[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 C_(t,e){return!!t.tools[e]}function $_(t,e,r,n,s){let i=t.tools[e]??ud[e],o;if(i?.agent){let l=zi(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Jx[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(c=>c.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let c=d.map(zi).join(" ");o=`printf '%s\\n' ${zi(n)} | ${c}`}else o=d.map(zi).join(" ")}let a=Zx(t,e,s);return a&&(o+=" "+a),o}var ud,Jx,fd=w(()=>{"use strict";ud={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}}},Jx={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]}}});function M_(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 D_=w(()=>{"use strict"});var Qx,ge,Zi,gt=w(()=>{"use strict";Qx="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${Qx}`,Zi=`send this exact lmctl seed instruction: "${ge}"`});function Sr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function tR(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Rs]:e}}function Je(t,e,r,n="chat"){return{...tR(Sr(t,e),r),[eR]:n}}var Rs,eR,yt=w(()=>{"use strict";Rs="LMCTL_SELF_SESSIONID",eR="LMCTL_LAUNCH_SOURCE"});import{spawn as j_}from"node:child_process";import{mkdirSync as rR}from"node:fs";var md,xe,Mt=w(()=>{"use strict";fd();D_();gt();yt();md=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},xe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===ge?r:n)}seed(e,r){return rR(e,{recursive:!0}),new Promise(n=>{let s;try{s=j_(this.binary,this.seedArgsFor(r),{cwd:e,env:Sr(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}
|
|
1627
|
+
`: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:Zi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&C_(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,i,o,a="",l,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),c(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},c=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,d(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&d(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(c(),{...p,status:"ok"})).catch(p=>{throw c(),o==="external"?new md("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=$_(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=M_(r.env),d=j_(s,{shell:!0,cwd:r.cwd,env:Je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),c=!1,u=!1,f=setTimeout(()=>{u=!0,d.kill()},l),m="",p="";if(d.stdout?.on("data",h=>{let _=h.toString();m+=_,r.onDelta?.(_)}),d.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),d.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>d.kill(),{once:!0})}d.on("exit",h=>{if(c)return;c=!0,clearTimeout(f);let _=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:_}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),d.on("error",h=>{c||(c=!0,clearTimeout(f),a(h))})})}}});function eo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new sr(t,r,e)}var ct,Se,nr,Qi,sr,An=w(()=>{"use strict";ct=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},Se=class extends ct{},nr=class extends ct{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},Qi=class extends ct{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},sr=class extends ct{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as _d from"node:child_process";function sR(t){if(typeof _d.spawnSync=="function")try{_d.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function P_(t){return t.exitCode!==null||t.signalCode!==null}function pd(t,e){return P_(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function et(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??sR;if(P_(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await pd(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 pd(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await pd(t,nR)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nR,Ls=w(()=>{"use strict";nR=1e3});function F_(t){le()&&Pe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function br(t,e){let r=oR[t];if(r)return r[e]??r.yolo}function lR(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 Et(t,e,r="yolo"){if(aR.has(t)){F_(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${r==="plan"?"plan":"auto"})`:"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?br(t,"plan"):iR[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 D({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new Se(s)}if(!lR(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 D({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new Se(i)}F_(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var iR,oR,aR,xn=w(()=>{"use strict";An();pe();iR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},oR={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"]}};aR=new Set(["codex","opencode","kimi"])});function U_(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(`
|
|
1628
1628
|
|
|
1629
1629
|
--- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1630
1630
|
|
|
@@ -1632,15 +1632,15 @@ var JN=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
|
|
|
1632
1632
|
One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
|
|
1633
1633
|
${e}
|
|
1634
1634
|
|
|
1635
|
-
${r}`:r}function q_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||_R[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=
|
|
1635
|
+
${r}`:r}function q_(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||_R[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=br(s,a)??gR[s]??["--dangerously-skip-permissions"];o.push(...l);try{Et(s,o,a)}catch(F){return n(F)}if(e.cwd&&!cR(e.cwd))return D({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new Se(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=dR(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)});d.stdin?.on("error",F=>{Ze(`stream-json: stdin pipe error, ignored (exit handler reports): ${F.message}`)});let c=!1;if(e.signal){if(e.signal.aborted)return c=!0,D({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,D({event:"transport_abort",provider:s}),et(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u="",f=!1,m=!1,p=!1,h=0,_=!1,g=hd({onEvent:F=>{h=Date.now(),_=F.type!=="result",e.onEvent?.(F)},onText:e.onText});function y(){if(m)return;m=!0;let F=e.holdOpen;if(F===void 0){d.stdin?.end();return}let $=Date.now();v(F,$).catch(()=>{E(F,{startedMs:$,held:!1,reason:"check-error"})})}function E(F,$){if(!p){p=!0;try{F.onRelease?.({elapsedMs:Date.now()-$.startedMs,held:$.held,reason:$.reason})}catch{}}d.stdin?.end()}async function v(F,$){let R=F.pollMs??uR,A=F.maxHoldMs??fR,Y=F.settleMs??mR,B=!1,k=null,I=C=>E(F,{startedMs:$,held:B,reason:C});for(;;){if(c)return I("aborted");if(f)return I("child-exited");let C=A-(Date.now()-$);if(C<=0)return I("max-hold");let W;try{W=await pR(F.hasOutstandingWork(),C,e.signal)}catch{return I("check-error")}if(W===yd)return I(c||e.signal?.aborted===!0?"aborted":"max-hold");if(W)k=null;else{if(!B||Y<=0)return I("cleared");k===null&&(k=Date.now(),Ze(`stream-json: dispatched work cleared \u2014 settling ${Y}ms before closing stdin`));let j=Math.max(k,h);if(!_&&Date.now()-j>=Y)return I("cleared")}if(B||(B=!0,F.onHold?.(),Ze(`stream-json: deferring stdin close \u2014 outstanding dispatched work (poll ${R}ms)`)),Date.now()-$>=A)return D({event:"transport_hold_open_max_wait",provider:e.tool||"claude",elapsed_ms:Date.now()-$}),I("max-hold");let U=Math.max(0,Math.min(R,A-(Date.now()-$)));await new Promise(j=>setTimeout(j,U).unref?.())}}function b(F){let $=g.sawResult();g.processLine(F),!$&&g.sawResult()&&y()}d.stdout?.on("data",F=>{u+=F.toString();let $=u.split(`
|
|
1636
1636
|
`);u=$.pop()||"";for(let R of $)b(R)});let x="";d.stderr?.on("data",F=>{x+=F.toString()}),d.on("error",F=>{D({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:F.message}),n(new Se(`Failed to spawn ${i}: ${F.message}`,{cause:F}))}),d.on("exit",F=>{if(f=!0,c)return;u.trim()&&b(u);let $=g.finalize();$?(Ze(`stream-json: result ${$.result.slice(0,80)}${$.result.length>80?"...":""} (${$.durationMs}ms)`),r({...$,exitCode:F})):(D({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:F,stderr_tail:x.slice(0,500)}),n(new Error(hR({tool:s,exitCode:F,stderr:x}))))});let H=JSON.stringify({type:"user",message:{role:"user",content:t}});d.stdin?.write(H+`
|
|
1637
|
-
`),Ze(`stream-json: prompt sent (${t.length} chars)`)})}var uR,fR,mR,yd,_R,gR,B_=w(()=>{"use strict";An();Ls();xn();pe();yt();gd();gd();uR=2e3,fR=8*60*60*1e3,mR=5e3,yd=Symbol("check-timed-out");_R={claude:"claude",qwen:"qwen"};gR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function to(t={}){return[]}var Ed=w(()=>{"use strict"});function wd(t){return t==="plan"?"read-only":"danger-full-access"}function H_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Td(){return{agentItems:new Map,resultText:""}}function ro(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let d=typeof i?.threadId=="string"?i.threadId:void 0,c=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:d,turnId:c,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function vd(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function X_(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 Sd(){return{pendingCodexError:null}}function bd(t,e){let r=X_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function kd(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 Id=w(()=>{"use strict"});import{spawn as yR}from"node:child_process";import{createInterface as ER}from"node:readline";import{existsSync as wR,readFileSync as TR}from"node:fs";import{fileURLToPath as vR}from"node:url";function bR(){return H_(SR)}function
|
|
1637
|
+
`),Ze(`stream-json: prompt sent (${t.length} chars)`)})}var uR,fR,mR,yd,_R,gR,B_=w(()=>{"use strict";An();Ls();xn();pe();yt();gd();gd();uR=2e3,fR=8*60*60*1e3,mR=5e3,yd=Symbol("check-timed-out");_R={claude:"claude",qwen:"qwen"};gR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function to(t={}){return[]}var Ed=w(()=>{"use strict"});function wd(t){return t==="plan"?"read-only":"danger-full-access"}function H_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Td(){return{agentItems:new Map,resultText:""}}function ro(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let d=typeof i?.threadId=="string"?i.threadId:void 0,c=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:d,turnId:c,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function vd(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function X_(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 Sd(){return{pendingCodexError:null}}function bd(t,e){let r=X_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function kd(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 Id=w(()=>{"use strict"});import{spawn as yR}from"node:child_process";import{createInterface as ER}from"node:readline";import{existsSync as wR,readFileSync as TR}from"node:fs";import{fileURLToPath as vR}from"node:url";function bR(){return H_(SR)}function kr(t,e){Ze(`[codex:${t}] ${JSON.stringify(e)}`)}function kR(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
|
|
1638
1638
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1639
1639
|
${e}
|
|
1640
1640
|
|
|
1641
1641
|
${r}`:r}function J_(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?to():[];i.push(...a),le()&&$e(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",d=wd(l);try{Et("codex",i,l)}catch($){return n($)}if(e.cwd&&!wR(e.cwd))return D({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new Se(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=yR(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,D({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,D({event:"transport_abort",provider:"codex"}),et(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=ER({input:c.stdout}),m=new Map,p=1,h=e.threadId||"",_="",g=!1,y=!1,E=Date.now(),v=Td(),b=Sd();function x($,R={}){return new Promise((A,Y)=>{let B=p++;m.set(B,{resolve:A,reject:Y});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:$,params:R});c.stdin?.write(k+`
|
|
1642
1642
|
`)})}function H($,R={}){let A=JSON.stringify({jsonrpc:"2.0",method:$,params:R});c.stdin?.write(A+`
|
|
1643
|
-
`)}f.on("line",$=>{let R;try{R=JSON.parse($)}catch{return}if(typeof R.id=="number"&&m.has(R.id)){let B=m.get(R.id);if(m.delete(R.id),R.error){let k=R.error,I=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(R.error);B.reject(eo(`codex app-server error: ${I}`,k))}else B.resolve(R);e.onEvent?.(R);return}let A=R.method;if(!A){e.onEvent?.(R);return}if(A==="thread/started"){let k=R.params?.thread;k?.id&&(h=k.id)}let Y=le()?B=>{
|
|
1643
|
+
`)}f.on("line",$=>{let R;try{R=JSON.parse($)}catch{return}if(typeof R.id=="number"&&m.has(R.id)){let B=m.get(R.id);if(m.delete(R.id),R.error){let k=R.error,I=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(R.error);B.reject(eo(`codex app-server error: ${I}`,k))}else B.resolve(R);e.onEvent?.(R);return}let A=R.method;if(!A){e.onEvent?.(R);return}if(A==="thread/started"){let k=R.params?.thread;k?.id&&(h=k.id)}let Y=le()?B=>{kr("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=R.params,k=B?.turn;k?.id&&(_=k.id),ro(R,v,e.onDelta,Y),le()&&kr("turn/started",{params:B??null})}if(le()&&(A==="item/started"||A==="item/completed")){let B=R.params;B?.item?.type==="agentMessage"&&kr(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=R.params;le()&&kr("agentMessage/delta",{params:B??null})}ro(R,v,e.onDelta,Y)}if(A==="turn/completed"){let B=R.params;if(le())for(let[I,C]of v.agentItems.entries())C.buffer&&kr("turn/completed/unflushed-item",{itemId:I,phase:C.phase,bufferLen:C.buffer.length});vd(v),le()&&kr("turn/completed",{params:B??null});let k=kd(R,b);k.shouldReject?(le()&&kr("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,g=!0,c.stdin?.end(),n(k.turnError)):(g=!0,c.stdin?.end())}if(A==="error"){let B=bd(R,b);if(le()){let k=R.params,I=k?.error,C=typeof I?.message=="string"?I.message:"(no message)";kr(B.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:B.willRetry,params:k??null})}}e.onEvent?.(R)});let F="";c.stderr?.on("data",$=>{F+=$.toString()}),c.on("error",$=>{D({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:$.message}),n(new Se(`Failed to spawn codex app-server: ${$.message}`,{cause:$}))}),c.on("exit",$=>{if(!u&&!y){if(g){r({result:v.resultText,threadId:h,turnId:_,durationMs:Date.now()-E,exitCode:$});return}if(b.pendingCodexError){n(b.pendingCodexError);return}D({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:$,stderr_tail:F.slice(0,500)}),n(new Error(kR({exitCode:$,stderr:F})))}}),(async()=>{try{if(await x("initialize",bR()),H("initialized",{}),e.threadId)try{let $=x("thread/resume",{threadId:e.threadId,sandbox:d,approvalPolicy:"never",...e.model?{model:e.model}:{}}),R=new Promise((A,Y)=>setTimeout(()=>Y(new Error("resume timeout")),5e3));await Promise.race([$,R]),h=e.threadId}catch($){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1644
1644
|
`),D({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:$ instanceof Error?$.message:String($)});let A=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let R=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(h=R.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch($){et(c).catch(()=>{}),n($ instanceof Error?$:new Error(String($)))}})()})}var SR,G_=w(()=>{"use strict";pe();pe();An();Ls();xn();Ed();pe();yt();Id();Id();SR=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(TR(vR(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Y_,mkdirSync as IR,readFileSync as z_,writeFileSync as K_}from"node:fs";import{join as Os,resolve as NR}from"node:path";function Z_(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 Nd(t,e,r={existsSync:Y_,readFileSync:z_}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=NR(e,s.sessiondir??e);for(let o of AR(i)){let a=xR(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Z_(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 AR(t){return[Os(t,".opencode","opencode.jsonc"),Os(t,"opencode.jsonc"),Os(t,"opencode.json")]}function xR(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(RR(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function RR(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]!==`
|
|
1645
1645
|
`;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function no(t,e={}){let r=Os(t,".opencode"),n=Os(r,"opencode.json");if(!Y_(n)){IR(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return K_(n,o+`
|
|
1646
1646
|
`,"utf-8"),!0}let s;try{s=JSON.parse(z_(n,"utf-8"))}catch{return console.log(V_.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(V_.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),Z_(s.permission)||D({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&&K_(n,JSON.stringify(s,null,2)+`
|
|
@@ -1653,26 +1653,26 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1653
1653
|
`)}function sh(t,e){let r=PR({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,d)=>{let c=WR++;n.set(c,{resolve:l,reject:d});let u=JSON.stringify({jsonrpc:"2.0",id:c,method:o,params:a});Pe({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:c,params:a}),t.stdin?.write(`${u}
|
|
1654
1654
|
`)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
|
|
1655
1655
|
`)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Pe({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let d=n.get(a.id);if(n.delete(a.id),a.error){let c=a.error,u=typeof c?.message=="string"&&c.message.length>0?c.message:JSON.stringify(a.error);d.reject(eo(`ACP RPC error: ${u}`,c))}else d.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){D({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let d=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Pe({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${d}
|
|
1656
|
-
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Se("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ld(t){let e;try{e=nh(t.binaryPath??Rd.opencode.binary,Rd.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Je(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=sh(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(c,u=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(c);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(c))}},a=c=>{o({status:"unavailable",reason:"spawn",error:c.message},!1)},l=(c,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(c)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let c=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=Rn(c);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(c){o({status:"unavailable",reason:"handshake",error:c instanceof Error?c.message:String(c)})}})()})}function ih(t,e){let r=Rd[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{no(e.cwd)}catch(y){D({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=
|
|
1656
|
+
`);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Se("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ld(t){let e;try{e=nh(t.binaryPath??Rd.opencode.binary,Rd.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Je(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=sh(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(c,u=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(c);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(c))}},a=c=>{o({status:"unavailable",reason:"spawn",error:c.message},!1)},l=(c,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(c)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let c=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=Rn(c);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(c){o({status:"unavailable",reason:"handshake",error:c instanceof Error?c.message:String(c)})}})()})}function ih(t,e){let r=Rd[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{no(e.cwd)}catch(y){D({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=br("gemini","plan"),E=br("gemini","yolo");a=a.filter(v=>!(E??[]).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.
|
|
1657
1657
|
`),D({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{Et(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.
|
|
1658
1658
|
`),D({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!jR(e.cwd))return D({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new Se(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=nh(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Je(e.env,e.cwd,e.sessionId)}),c=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,D({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(d).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,D({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-c}),et(d).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=e.sessionId||"",m=Ad({tool:e.tool,onDelta:e.onDelta});m.setSessionId(f);let p=sh(d,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:h,sendNotification:_}=p,g="";d.stderr?.on("data",y=>{g+=y.toString()}),d.on("error",y=>{p.close(y),D({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-c}),s(new Se(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),d.on("exit",y=>{if(p.close(new Se(`ACP process exited with code ${String(y)}`)),u)return;let E=m.finalize();if(E!==null)n({result:E.result,sessionId:E.sessionId,durationMs:Date.now()-c,stopReason:E.stopReason,exitCode:y});else{let v=UR(e.tool,g);D({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:v.slice(0,500),elapsed_ms:Date.now()-c}),s(new Error(FR({tool:e.tool,exitCode:y,stderr:v})))}}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),_("notifications/initialized"),e.sessionId)try{let v=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});f=Rn(v,e.sessionId),m.setSessionId(f)}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
|
|
1659
1659
|
`),D({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:v instanceof Error?v.message:String(v)});let b=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=Rn(b),m.setSessionId(f)}else{let v=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=Rn(v),m.setSessionId(f)}if(e.tool==="kimi"){let v=o==="plan"?"plan":"auto";try{await h("session/set_config_option",{sessionId:f,configId:"mode",value:v}),Ze(`acp: set_config_option(mode=${v}) ok`)}catch(b){let x=b instanceof Error?b.message:String(b);throw D({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:v,error_message:x}),new Error(`Cannot set Kimi ACP permission mode to ${v}: ${x}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await h("session/set_config_option",{sessionId:f,configId:"model",value:e.model}),Ze(`acp: set_config_option(model=${e.model}) ok`)}catch(v){let b=v instanceof Error?v.message:String(v);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${b}
|
|
1660
1660
|
`),D({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:b})}if(e.effort&&e.tool==="opencode"){let v="effort";try{await h("session/set_config_option",{sessionId:f,configId:v,value:e.effort}),Ze(`acp: set_config_option(${v}=${e.effort}) ok`)}catch(b){let x=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${x}
|
|
1661
1661
|
`),D({event:"acp_config_option_failed",provider:e.tool,config_id:v,value:e.effort,error_message:x})}}m.beginTurn(),Ze(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:f,prompt:[{type:"text",text:t}]}),E=m.completeTurn(y);Ze(`acp: result received (${E.result.length} chars, stopReason=${E.stopReason})`),d.stdin?.end()}catch(y){et(d).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Rd,WR,Od=w(()=>{"use strict";pe();An();Ls();xn();so();pe();yt();xd();xd();Rd={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},WR=1});function we(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function oh(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=qR){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function BR(){let t=new Map;return(e,r)=>{HR(e,oh(t,r))}}function HR(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,d=[];s!==void 0&&d.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&d.push(`HTTP ${o}`),l!==void 0&&d.push(`retry in ${Math.round(l/1e3)}s`),a&&d.push(we(a,60));let c=d.length>0?d.join(", "):n;e({kind:"api_retry",summary:c});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(we(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:we(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,d=i.input,c="";d&&(typeof d.command=="string"?c=d.command:typeof d.file_path=="string"?c=d.file_path:typeof d.path=="string"?c=d.path:typeof d.pattern=="string"?c=d.pattern:typeof d.url=="string"?c=d.url:c=we(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:we(c),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:we(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",d=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,c,u=i.content;if(typeof u=="string")c=`${u.split(`
|
|
1662
1662
|
`).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(c=`${f.split(`
|
|
1663
|
-
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:c,id:d,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function io(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?BR():void 0,s=await q_(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?i=>n(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function XR(){let t=new Map;return(e,r)=>{JR(e,oh(t,r))}}function JR(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:we(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:we(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",d=s.rawInput;d&&(typeof d.command=="string"?l=d.command:typeof d.file_path=="string"?l=d.file_path:typeof d.path=="string"?l=d.path:l=we(JSON.stringify(d))),e({kind:"tool_use",tool:o,summary:we(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,d=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",c=d?`running\u2026 ${we(d,80)}`:"running\u2026";e({kind:"other",summary:c,id:a})}return}e({kind:"other",summary:i})}}async function
|
|
1663
|
+
`).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:c,id:d,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function io(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?BR():void 0,s=await q_(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?i=>n(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function XR(){let t=new Map;return(e,r)=>{JR(e,oh(t,r))}}function JR(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:we(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:we(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",d=s.rawInput;d&&(typeof d.command=="string"?l=d.command:typeof d.file_path=="string"?l=d.file_path:typeof d.path=="string"?l=d.path:l=we(JSON.stringify(d))),e({kind:"tool_use",tool:o,summary:we(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,d=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",c=d?`running\u2026 ${we(d,80)}`:"running\u2026";e({kind:"other",summary:c,id:a})}return}e({kind:"other",summary:i})}}async function Ir(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Pe({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?XR():void 0,s=await ih(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 GR(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${we(o,120)}`}:{kind:"other",summary:`codex error: ${we(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,d=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:we(d||"(command)"),id:a});else{let c=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof c=="number"?`exit ${c}`:u||"done",p=[];typeof c=="number"?p.push(`exit ${c}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,d=Array.isArray(l)?l.map(c=>c.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:we(d||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",d=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${d}`,summary:"",id:a});else{let c=s.status||"done";e({kind:"tool_result",summary:c,status:c,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:we(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:we(s)}:{kind:"text",summary:we(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:we(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
|
|
1664
1664
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${we(o,60)}`:we(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
|
|
1665
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${we(o,60)}`:we(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function ah(t,e){let r=await J_(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=>GR(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var qR,
|
|
1666
|
-
`);try{return JSON.stringify(t)}catch{return String(t)}}function QR(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function e0(t,e){if(e===void 0)return;let r={input:e};if(t!=="apply_patch"||typeof e!="string")return r;let n=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return n.length>0&&(r.path=n[0].path,r.paths=n.map(s=>s.path),r.kinds=n.map(s=>s.kind)),r}async function ch(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of
|
|
1667
|
-
`);E.trim()&&$s(s,p,{role:"thinking",timestamp:g,content:fe(E)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let y=_.payload.message||_.payload.text;y&&$s(s,p,{role:"thinking",timestamp:g,content:fe(y)})}}if(!i)return null;let h=await ch(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:d,lastUserMessage:c,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await VR(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Xe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function jd(t){return new Dd(t)}var Dd,Pd=w(()=>{"use strict";uh();Mt();
|
|
1665
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${we(o,60)}`:we(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function ah(t,e){let r=await J_(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=>GR(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var qR,Nr=w(()=>{"use strict";B_();G_();Od();pe();qR=256});function $d(t){return new Cd(t)}var Cd,Md=w(()=>{"use strict";x_();Mt();Nr();gt();Cd=class extends xe{constructor(e){super({provider:new Yi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:io})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as KR,stat as lh,unlink as VR}from"node:fs/promises";import{join as Cs,basename as YR}from"node:path";function zR(t,e,r){return`${t}|${e.toISOString()}|${r}`}function $s(t,e,r){let n=zR(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function dh(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function ZR(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 Ln(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 Ln(r)}).filter(r=>r.length>0).join(`
|
|
1666
|
+
`);try{return JSON.stringify(t)}catch{return String(t)}}function QR(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function e0(t,e){if(e===void 0)return;let r={input:e};if(t!=="apply_patch"||typeof e!="string")return r;let n=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return n.length>0&&(r.path=n[0].path,r.paths=n.map(s=>s.path),r.kinds=n.map(s=>s.kind)),r}async function ch(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of He(t)){if(l.type==="response_item"&&l.payload){let d=l.payload;if(d.type==="message"&&d.role==="user"&&d.content)for(let c of d.content)c.type==="input_text"&&typeof c.text=="string"&&c.text&&e++;else if(d.type==="message"&&d.role==="assistant"&&d.content)for(let c of d.content)c.type==="output_text"&&typeof c.text=="string"&&c.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let d=l.payload.info.total_token_usage;r=d.input_tokens??r,n=d.cached_input_tokens??d.cache_read_input_tokens??n,s=d.output_tokens??s,i=d.reasoning_output_tokens??i;let c=ZR(l.payload.info.last_token_usage);c&&(o=c),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var oo,uh=w(()=>{"use strict";rr();oo=class{name="codex";codexDirs;constructor(e={}){let r=[Cs(ve,".codex"),Cs(ve,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Cs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Cs(r,"sessions");try{await lh(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 KR(e)}catch{return r}for(let s of n){let i=Cs(e,s),o=await lh(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=YR(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Xe(e,30),n=await Oe(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,d,c,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(d||(d=X(h.trim(),80)),c=X(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(d||(d=X(h.text.trim(),80)),c=X(h.text.trim(),80))}}if(!i)return null;let m=await ch(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:dh(u,f),firstUserMessage:d,lastUserMessage:c,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Oe(r),s=[],i="",o,a,l,d,c,u=e,f,m,p=new Set;for await(let _ of He(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=dh(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let y=_.payload;if(y.type==="message"){if(y.role==="user"&&y.content){for(let E of y.content)if(E.type==="input_text"&&typeof E.text=="string"&&E.text){let v=E.text.trim();d||(d=X(v,80)),c=X(v,80),$s(s,p,{role:"user",timestamp:g,content:fe(v)})}continue}if(y.role==="assistant"&&y.content){for(let E of y.content)E.type==="output_text"&&typeof E.text=="string"&&E.text&&$s(s,p,{role:"assistant",timestamp:g,content:fe(E.text),model:a});continue}if(y.role!=="user"&&y.role!=="assistant"&&y.content){for(let E of y.content)(E.type==="input_text"||E.type==="output_text")&&typeof E.text=="string"&&E.text&&$s(s,p,{role:"system",timestamp:g,content:fe(E.text.trim())});continue}}if(y.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.arguments!==void 0?fe(Ln(y.arguments)):void 0,toolInputData:QR(y.arguments),toolCallId:y.call_id});continue}if(y.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(Ln(y.output)),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.input!==void 0?fe(Ln(y.input)):void 0,toolInputData:e0(y.name,y.input),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(Ln(y.output)),toolCallId:y.call_id});continue}if(y.type==="reasoning"&&y.summary){let E=y.summary.map(v=>Ln(v.text)).join(`
|
|
1667
|
+
`);E.trim()&&$s(s,p,{role:"thinking",timestamp:g,content:fe(E)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let y=_.payload.message||_.payload.text;y&&$s(s,p,{role:"thinking",timestamp:g,content:fe(y)})}}if(!i)return null;let h=await ch(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:d,lastUserMessage:c,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await VR(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Xe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function jd(t){return new Dd(t)}var Dd,Pd=w(()=>{"use strict";uh();Mt();Nr();gt();Dd=class extends xe{constructor(e){super({provider:new oo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${ge}
|
|
1668
1668
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:ah})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Ms(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 ao(t){let e=Ms(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(`
|
|
1669
1669
|
`).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let d=l;if("$set"in d&&d.$set&&typeof d.$set=="object"){Object.assign(s,d.$set);continue}if(typeof d.id=="string"||typeof d.type=="string"){let c=d;if(typeof c.id=="string"){let u=o.get(c.id);u?t0(u,c):(i.push(c),o.set(c.id,c))}else i.push(c)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function t0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&fh(t.tokens)&&fh(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function fh(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function mh(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(`
|
|
1670
1670
|
`)+`
|
|
1671
1671
|
`}var Fd=w(()=>{"use strict"});import{createHash as r0}from"node:crypto";import{readdir as Ds,readFile as ph,stat as lo,unlink as n0}from"node:fs/promises";import{join as rt,basename as s0,dirname as i0}from"node:path";import{cwd as o0}from"node:process";function _h(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function hh(t){return t==="user"}function Ud(t){return t==="gemini"||t==="assistant"}function Vr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function a0(t){return`${t.sessionId}\0${t.cwd}`}function l0(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 co(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function gh(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!Ud(a.type)||!a.tokens)continue;let l=co(a.tokens.input),d=co(a.tokens.cached),c=Math.max(l-d,0),u=co(a.tokens.output),f=co(a.tokens.thoughts);e+=l,r+=d,n+=u,s+=f,i=l,o={inputTokens:c,cachedInputTokens:d,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function d0(t){return r0("sha256").update(t).digest("hex")}function js(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=i0(r);if(n===r)break;r=n}}var uo,yh=w(()=>{"use strict";rr();Fd();pe();uo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||rt(ve,".gemini");this.geminiProjectsFile=rt(r,"projects.json"),this.geminiTmpDir=rt(r,"tmp");let n=e.claudeDir||rt(ve,".claude");this.claudeProjectsDir=rt(n,"projects");let s=[rt(ve,".codex"),rt(ve,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>rt(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let i=a0(s),o=r.get(i);r.set(i,o?l0(o,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Oe(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",d=await this.resolveWorkspace(l),c,u,f;for(let _ of o){let g=Vr(_.timestamp),y=_.type,E=fe(_h(_.content));if(hh(y)){let b=E.trim();b&&(c||(c=X(b,80)),u=X(b,80)),i.push({role:"user",timestamp:g,content:b||E});continue}if(Ud(y)){_.model&&(f=_.model);for(let b of _.thoughts||[]){let x=[b.subject,b.description].filter(Boolean).join(`
|
|
1672
|
-
`).trim();x&&i.push({role:"thinking",timestamp:Vr(b.timestamp,g),content:fe(x)})}i.push({role:"assistant",timestamp:g,content:E,model:_.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${v}${E}`.trim()})}let m=Vr(n.startTime,s.createdAt),p=Vr(n.lastUpdated,s.modifiedAt),h=gh(o);return{provider:"gemini",sessionId:a,cwd:d,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:c,lastUserMessage:u,messageCount:i.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Oe(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,d,c,u=0;for(let m of s)if(hh(m.type)){u++;let p=_h(m.content).trim();p&&(l||(l=X(fe(p),80)),d=X(fe(p),80))}else Ud(m.type)&&(u++,m.model&&(c=m.model));let f=gh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Vr(r.startTime,n.createdAt),modifiedAt:Vr(r.lastUpdated,n.modifiedAt),model:c,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await ph(e,"utf-8");if(Ms(r)==="unknown")return D({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 ao(r)}catch{return null}}extractSessionIdFromFilename(e){let r=s0(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 Ds(this.geminiTmpDir)}catch{return e}for(let n of r){let s=rt(this.geminiTmpDir,n,"chats");if(!(await lo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ds(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(rt(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await n0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let c=await Oe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Vr(i?.lastUpdated,c.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;js(e,o0());for(let n of this.extraWorkspacePaths)js(e,n);for(let n of await this.collectGeminiProjectPaths())js(e,n);for(let n of await this.collectCodexCwds())js(e,n);for(let n of await this.collectClaudeCwds())js(e,n);let r=new Map;for(let n of e)r.set(d0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await ph(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Xe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Ds(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=rt(this.claudeProjectsDir,n);if(!(await lo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ds(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=rt(s,a),c=(await Xe(l,1).catch(()=>[]))[0]?.cwd;c&&e.add(c)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await lo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Ds(e)}catch{return r}for(let i of s){let o=rt(e,i),a=await lo(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 c0,writeFileSync as u0,mkdirSync as f0}from"node:fs";import{join as m0,dirname as p0}from"node:path";import{randomUUID as _0}from"node:crypto";function qd(t){return new Wd(t)}var Wd,Bd=w(()=>{"use strict";yh();Mt();
|
|
1672
|
+
`).trim();x&&i.push({role:"thinking",timestamp:Vr(b.timestamp,g),content:fe(x)})}i.push({role:"assistant",timestamp:g,content:E,model:_.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${v}${E}`.trim()})}let m=Vr(n.startTime,s.createdAt),p=Vr(n.lastUpdated,s.modifiedAt),h=gh(o);return{provider:"gemini",sessionId:a,cwd:d,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:c,lastUserMessage:u,messageCount:i.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Oe(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,d,c,u=0;for(let m of s)if(hh(m.type)){u++;let p=_h(m.content).trim();p&&(l||(l=X(fe(p),80)),d=X(fe(p),80))}else Ud(m.type)&&(u++,m.model&&(c=m.model));let f=gh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Vr(r.startTime,n.createdAt),modifiedAt:Vr(r.lastUpdated,n.modifiedAt),model:c,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await ph(e,"utf-8");if(Ms(r)==="unknown")return D({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 ao(r)}catch{return null}}extractSessionIdFromFilename(e){let r=s0(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 Ds(this.geminiTmpDir)}catch{return e}for(let n of r){let s=rt(this.geminiTmpDir,n,"chats");if(!(await lo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ds(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(rt(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await n0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let c=await Oe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Vr(i?.lastUpdated,c.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;js(e,o0());for(let n of this.extraWorkspacePaths)js(e,n);for(let n of await this.collectGeminiProjectPaths())js(e,n);for(let n of await this.collectCodexCwds())js(e,n);for(let n of await this.collectClaudeCwds())js(e,n);let r=new Map;for(let n of e)r.set(d0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await ph(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Xe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Ds(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=rt(this.claudeProjectsDir,n);if(!(await lo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ds(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=rt(s,a),c=(await Xe(l,1).catch(()=>[]))[0]?.cwd;c&&e.add(c)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await lo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Ds(e)}catch{return r}for(let i of s){let o=rt(e,i),a=await lo(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 c0,writeFileSync as u0,mkdirSync as f0}from"node:fs";import{join as m0,dirname as p0}from"node:path";import{randomUUID as _0}from"node:crypto";function qd(t){return new Wd(t)}var Wd,Bd=w(()=>{"use strict";yh();Mt();Nr();gt();Fd();Wd=class extends xe{constructor(e){super({provider:new uo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Ir(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(`
|
|
1673
1673
|
`)}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:Zi,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=c0(n,"utf-8"),i=Ms(s),o=ao(s),a=_0();o.sessionId=a,o.kind="main";let l=p0(n),d=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),c=i==="jsonl"?".jsonl":".json",u=`session-${d}-${a.slice(0,8)}${c}`,f=m0(l,u);return f0(l,{recursive:!0}),u0(f,mh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Eh,readFile as h0,rm as g0,stat as On}from"node:fs/promises";import{basename as y0,join as wt}from"node:path";function E0(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},r=!1;for(let n of Object.values(t))n?.usage&&(r=!0,e.inputTokens+=n.usage.inputTokens??0,e.outputTokens+=n.usage.outputTokens??0,e.cacheReadTokens+=n.usage.cacheReadTokens??0,e.cacheWriteTokens+=n.usage.cacheWriteTokens??0,e.reasoningTokens+=n.usage.reasoningTokens??0);return r?e:null}function Hd(){return{shutdownTotals:null,assistantOutputSum:0}}function Th(t,e){if(e.type==="assistant.message"){let r=e.data?.outputTokens;typeof r=="number"&&(t.assistantOutputSum+=r,t.lastAssistantOutputTokens=r)}else if(e.type==="session.shutdown"){let r=E0(e.data?.modelMetrics);r&&(t.shutdownTotals=r)}}function wh(t){let e=t.shutdownTotals,r=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:r}}function w0(t){let e={};for(let r of t.split(`
|
|
1674
|
-
`)){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 Yr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function T0(t){let e=0,r=Hd();for await(let n of
|
|
1675
|
-
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(c===void 0)continue;let u=`copilot-shell:${c}:${n.toolCallId}`;r.set(c,u),n.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(n.toolName??""))continue;let s=n.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=r.get(i);if(o===void 0)continue;n.backgroundTaskId=o;let a=e.get(n.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function S0(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var fo,vh=w(()=>{"use strict";rr();fo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||wt(ve,".copilot");this.sessionStateDir=wt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Eh(this.sessionStateDir)}catch{return e}for(let n of r){let s=wt(this.sessionStateDir,n);if((await On(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=wt(r,"events.jsonl"),i=await On(s).catch(()=>null),o=i?s:wt(r,"workspace.yaml"),a=await Oe(i?s:r),l=[],d=n?.cwd||"(unknown workspace)",c,u,f,m,p,h,_=n?.id||y0(r)||e,g=Hd();if(i)for await(let y of
|
|
1674
|
+
`)){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 Yr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function T0(t){let e=0,r=Hd();for await(let n of He(t))(n.type==="user.message"||n.type==="assistant.message"&&(n.data?.content||"").trim())&&e++,Th(r,n);return{messageCount:e,tokens:r}}function v0(t){let e=S0(t),r=new Map;for(let n of t){if(n.role!=="tool_use"||n.toolCallId===void 0)continue;if(n.toolName==="bash"){let l=e.get(n.toolCallId),c=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
|
|
1675
|
+
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(c===void 0)continue;let u=`copilot-shell:${c}:${n.toolCallId}`;r.set(c,u),n.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(n.toolName??""))continue;let s=n.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=r.get(i);if(o===void 0)continue;n.backgroundTaskId=o;let a=e.get(n.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function S0(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var fo,vh=w(()=>{"use strict";rr();fo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||wt(ve,".copilot");this.sessionStateDir=wt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Eh(this.sessionStateDir)}catch{return e}for(let n of r){let s=wt(this.sessionStateDir,n);if((await On(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=wt(r,"events.jsonl"),i=await On(s).catch(()=>null),o=i?s:wt(r,"workspace.yaml"),a=await Oe(i?s:r),l=[],d=n?.cwd||"(unknown workspace)",c,u,f,m,p,h,_=n?.id||y0(r)||e,g=Hd();if(i)for await(let y of He(s)){let E=Yr(y.timestamp)||a.modifiedAt;if(Th(g,y),y.type==="session.start"&&y.data){y.data.sessionId&&(_=y.data.sessionId),y.data.copilotVersion&&(u=y.data.copilotVersion),y.data.startTime&&(h=Yr(y.data.startTime)),y.data.selectedModel&&(c=y.data.selectedModel),y.data.context&&(y.data.context.cwd&&(d=y.data.context.cwd),y.data.context.branch&&(f=y.data.context.branch));continue}if(y.type==="session.model_change"&&y.data?.newModel){c=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let v=y.data.content||"",b=v.trim();b&&(m||(m=X(b,80)),p=X(b,80)),l.push({role:"user",timestamp:E,content:fe(b||v)});continue}if(y.type==="assistant.message"&&y.data){let v=(y.data.content||"").trim();if(v&&l.push({role:"assistant",timestamp:E,content:fe(v),model:c}),y.data.toolRequests)for(let b of y.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolInputData:$t(b.arguments),toolCallId:b.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let v=y.data.result?.content||"",b=y.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:fe(v),toolDetailedContent:b?fe(b):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:E,content:fe(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let v=y.data?.message||"";v.trim()&&l.push({role:"system",timestamp:E,content:fe(v)});continue}}if(!m){let y=(n?.summary||"").trim();y&&(m=X(y,80))}return v0(l),{provider:"copilot",sessionId:_,cwd:d,createdAt:h??Yr(n?.created_at)??a.createdAt,modifiedAt:Yr(n?.updated_at)??a.modifiedAt,model:c,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...wh(g),messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=wt(e,"events.jsonl"),i=await On(s).catch(()=>null),o=i?s:wt(e,"workspace.yaml"),a=await Oe(i?s:e),l=i?await Xe(s,20):[],d=n?.id||r,c=n?.cwd||"(unknown workspace)",u,f,m,p,h;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(d=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=Yr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(c=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(u||(u=g.data.newModel)),g.type==="user.message"&&g.data){let y=(g.data.content||"").trim();y&&(p||(p=X(y,80)),h=X(y,80))}if(!p){let g=(n?.summary||"").trim();g&&(p=X(g,80))}let _=i?await T0(s):{messageCount:0,tokens:Hd()};return{provider:"copilot",sessionId:d,cwd:c,createdAt:m??Yr(n?.created_at)??a.createdAt,modifiedAt:Yr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:_.messageCount,filePath:o,...wh(_.tokens)}}async readWorkspaceYaml(e){let r=wt(e,"workspace.yaml");try{let n=await h0(r,"utf-8");return w0(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await g0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Eh(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=wt(this.sessionStateDir,e);if((await On(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=wt(this.sessionStateDir,s);(await On(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=wt(this.sessionStateDir,s);if(!(await On(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 Jd(t){return new Xd(t)}var Xd,Gd=w(()=>{"use strict";vh();Mt();Nr();pe();gt();Xd=class extends xe{constructor(e){super({provider:new fo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>Ir(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 Pe({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Sh,readdirSync as b0,statSync as bh}from"node:fs";import{join as Ar}from"node:path";import{createRequire as k0}from"node:module";function kh(){return Kd===null&&(Kd=k0(import.meta.url)("node:sqlite").DatabaseSync),Kd}function Ih(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Nh(t,e){if(!e)return;t.observed=!0;let r=e.input??0,n=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=r,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=n,t.totalReasoningOutputTokens+=s,r+n+s+i+o>0){let a=r+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:r,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:n,reasoningOutputTokens:s,totalTokens:a+n+s}}}function Ah(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function I0(){let t=process.env.XDG_DATA_HOME||Ar(ve,".local","share"),e=process.env.XDG_CONFIG_HOME||Ar(ve,".config");return[Ar(t,"opencode","opencode.db"),Ar(e,"opencode","opencode.db")]}function N0(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||Ar(ve,".local","share"),e=Ar(t,"lmplayer"),r=Ar(e,"opencode-local.db"),n=[r];try{let s=b0(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>Ar(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return bh(o).mtimeMs-bh(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function A0(t){return t==="lmplayer"?N0():I0()}var Kd,Cn,Vd=w(()=>{"use strict";rr();Kd=null;Cn=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=A0(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Sh(e))}openDb(e){return Sh(e)?new(kh())(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,
|
|
1676
1676
|
s.time_created, s.time_updated
|
|
1677
1677
|
FROM session s
|
|
1678
1678
|
ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),d=a.directory||l?.worktree||"(unknown)",c=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
@@ -1685,13 +1685,13 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1685
1685
|
FROM session s
|
|
1686
1686
|
WHERE s.id LIKE ?
|
|
1687
1687
|
ORDER BY s.time_updated DESC
|
|
1688
|
-
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function zd(){return new Yd}var Yd,Zd=w(()=>{"use strict";Vd();Mt();
|
|
1688
|
+
LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function zd(){return new Yd}var Yd,Zd=w(()=>{"use strict";Vd();Mt();Nr();gt();Yd=class extends xe{constructor(){super({provider:new Cn,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Ir(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??ge),r}}});import{appendFile as x0,mkdir as R0,readFile as xh,readdir as Rh,rm as L0,stat as Lh}from"node:fs/promises";import{basename as O0,dirname as C0,isAbsolute as Oh,join as zr,relative as $0,resolve as Qd}from"node:path";function ec(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function j0(t){return typeof t=="number"?new Date(t):ec(t)??new Date(0)}function P0(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
|
|
1689
1689
|
`).trim():""}function Ch(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function F0(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Ch(t)??""}function U0(t){let e=W0(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function W0(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var M0,D0,mo,$h=w(()=>{"use strict";rr();M0="1.4",D0="1.5",mo=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Qd(e?.kimiHome??process.env.KIMI_CODE_HOME??zr(ve,".kimi-code")),this.sessionsDir=zr(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let r of await this.sessionFiles())try{let n=await this.summary(r);n&&e.push(n)}catch{}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){let r=await this.findSession(e);if(!r)return null;let n=await this.summary(r);if(!n)return null;let s=await this.parseWire(r.wirePath);return{...n,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let r=await this.findSession(e);return r?(await L0(r.sessionDir,{recursive:!0,force:!0}),await R0(C0(this.indexPath()),{recursive:!0,mode:448}),await x0(this.indexPath(),`${JSON.stringify({sessionId:r.sessionId,deleted:!0})}
|
|
1690
|
-
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return zr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),r=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&r.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let n;try{n=await Rh(this.sessionsDir,{withFileTypes:!0})}catch{return[...r.values()]}for(let s of n){if(!s.isDirectory())continue;let i=zr(this.sessionsDir,s.name),o;try{o=await Rh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||r.has(a.name))continue;let l=zr(i,a.name);r.set(a.name,this.filesFor(a.name,l))}}return[...r.values()]}async readIndex(){let e;try{e=await xh(this.indexPath(),"utf-8")}catch{return new Map}let r=new Map;for(let n of e.split(/\r?\n/))if(n.trim())try{let s=JSON.parse(n);if(typeof s.sessionId!="string")continue;s.deleted===!0?r.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&r.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Qd(s.sessionDir),workDir:s.workDir})}catch{}return r}filesFor(e,r,n){return{sessionId:e,sessionDir:r,statePath:zr(r,"state.json"),wirePath:zr(r,"agents","main","wire.jsonl"),indexedWorkDir:n}}validSessionDir(e,r){if(!Oh(e)||O0(e)!==r)return!1;let n=$0(this.sessionsDir,Qd(e));return n!==""&&n!==".."&&!n.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Oh(n)}async findSession(e){let r=await this.sessionFiles(),n=r.find(i=>i.sessionId===e);if(n)return n;let s=r.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let r=JSON.parse(await xh(e,"utf-8"));return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async summary(e){let r=await this.readState(e.statePath);if(!r)return null;let n;try{n=await Lh(e.wirePath)}catch{return null}let s=await Lh(e.statePath).catch(()=>n),i=await this.parseWire(e.wirePath),o=ec(r.createdAt)??s.birthtime,a=ec(r.updatedAt)??(s.mtime>n.mtime?s.mtime:n.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:r.title,cwd:r.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(r.lastPrompt?X(r.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let r=[],n=!0,s,i,o,a=0,l=0,d=0,c=0,u=!1,f=0,m,p;for await(let h of
|
|
1690
|
+
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return zr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),r=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&r.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let n;try{n=await Rh(this.sessionsDir,{withFileTypes:!0})}catch{return[...r.values()]}for(let s of n){if(!s.isDirectory())continue;let i=zr(this.sessionsDir,s.name),o;try{o=await Rh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||r.has(a.name))continue;let l=zr(i,a.name);r.set(a.name,this.filesFor(a.name,l))}}return[...r.values()]}async readIndex(){let e;try{e=await xh(this.indexPath(),"utf-8")}catch{return new Map}let r=new Map;for(let n of e.split(/\r?\n/))if(n.trim())try{let s=JSON.parse(n);if(typeof s.sessionId!="string")continue;s.deleted===!0?r.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&r.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Qd(s.sessionDir),workDir:s.workDir})}catch{}return r}filesFor(e,r,n){return{sessionId:e,sessionDir:r,statePath:zr(r,"state.json"),wirePath:zr(r,"agents","main","wire.jsonl"),indexedWorkDir:n}}validSessionDir(e,r){if(!Oh(e)||O0(e)!==r)return!1;let n=$0(this.sessionsDir,Qd(e));return n!==""&&n!==".."&&!n.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Oh(n)}async findSession(e){let r=await this.sessionFiles(),n=r.find(i=>i.sessionId===e);if(n)return n;let s=r.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let r=JSON.parse(await xh(e,"utf-8"));return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async summary(e){let r=await this.readState(e.statePath);if(!r)return null;let n;try{n=await Lh(e.wirePath)}catch{return null}let s=await Lh(e.statePath).catch(()=>n),i=await this.parseWire(e.wirePath),o=ec(r.createdAt)??s.birthtime,a=ec(r.updatedAt)??(s.mtime>n.mtime?s.mtime:n.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:r.title,cwd:r.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(r.lastPrompt?X(r.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let r=[],n=!0,s,i,o,a=0,l=0,d=0,c=0,u=!1,f=0,m,p;for await(let h of He(e)){let _=j0(h.time??h.created_at);if(n&&(n=!1,h.type==="metadata"&&h.protocol_version!==M0)){let y=h.protocol_version===D0?"Kimi experimental v2 transcript format not supported by this lmctl version.":`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if(h.type==="config.update"&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),u||=h.usage!==void 0;let y=h.usage?.inputOther??0,E=h.usage?.inputCacheRead??0,v=h.usage?.inputCacheCreation??0,b=h.usage?.output??0;a+=y,l+=E,d+=v,c+=b,h.usageScope==="turn"&&(m=y+E+v,p={inputTokens:y,cachedInputTokens:E,cacheWriteInputTokens:v,outputTokens:b,totalTokens:m+b});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let y=P0(h.input);y&&(i??=X(y,80),o=X(y,80),r.push({role:"user",timestamp:_,content:y}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let g=h.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(r.push({role:"assistant",timestamp:_,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?r.push({role:"thinking",timestamp:_,content:g.part.think,model:s}):g.type==="tool.call"?r.push({role:"tool_use",timestamp:_,content:g.name??"tool",toolName:g.name,toolInput:Ch(g.args),toolInputData:$t(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&r.push({role:"tool_result",timestamp:_,content:F0(g.result),toolCallId:g.toolCallId,model:s})}return U0(r),{messages:r,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:u?a:void 0,totalCachedInputTokens:u?l:void 0,totalCacheWriteInputTokens:u?d:void 0,totalOutputTokens:u?c:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function rc(t){return new tc(t)}var tc,nc=w(()=>{"use strict";$h();Mt();Nr();gt();tc=class extends xe{constructor(e){super({provider:new mo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ge,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(r,n)=>Ir(r,{...n,acpTool:"kimi"})})}seedArgsFor(e){let r=[];return e?.model&&r.push("--model",e.model),r.push("-p",e?.prompt??ge,"--output-format","stream-json"),r}}});import{spawn as q0}from"node:child_process";import{mkdirSync as B0}from"node:fs";function ic(t){return new sc(t)}async function H0(t,e){let r=Date.now(),n=Mh({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});Et("lmplayer",n,e.permissionMode??"yolo");let s=await Dh(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Mh(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(...br("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function Dh(t,e,r){return new Promise((n,s)=>{let i;try{i=q0(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(_){s(_);return}let o="",a="",l="",d,c,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=_=>{let g=_.trim();if(!g)return;let y;try{y=JSON.parse(g)}catch{u.push(_),r.onText?.(_);return}if(!_o(y))return;let E=po(y,!1);d===void 0&&E!==void 0&&(d=E),c=po(y,!0)??c;let v=jh(y);v&&(u.push(v),r.onText?.(v))};i.stdout?.on("data",_=>{let g=_.toString("utf8");o+=g,l+=g;let y=l.indexOf(`
|
|
1691
1691
|
`);for(;y>=0;){let E=l.slice(0,y);l=l.slice(y+1),h(E),y=l.indexOf(`
|
|
1692
|
-
`)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{f||(f=!0,p(),l.length>0&&h(l),n({code:_,stdout:o,stderr:a,sessionId:d??c,text:u.join("")}))}),i.on("error",_=>{f||(f=!0,p(),s(_))})})}function jh(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(_o(r)){let n=jh(r);if(n)return n}}}function po(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(_o(r)){let n=po(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(_o(s)){let i=po(s,e);if(i!==void 0)return i}}}function _o(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var sc,oc=w(()=>{"use strict";Vd();Mt();gt();xn();yt();sc=class extends xe{constructor(e){super({provider:new Cn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:H0})}seedArgsFor(e){return Mh({prompt:e?.prompt??ge,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){B0(e,{recursive:!0});let n=this.seedArgsFor(r);Et("lmplayer",n);try{let s=await Dh(this.binary,n,{cwd:e,env:
|
|
1692
|
+
`)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{f||(f=!0,p(),l.length>0&&h(l),n({code:_,stdout:o,stderr:a,sessionId:d??c,text:u.join("")}))}),i.on("error",_=>{f||(f=!0,p(),s(_))})})}function jh(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(_o(r)){let n=jh(r);if(n)return n}}}function po(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(_o(r)){let n=po(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(_o(s)){let i=po(s,e);if(i!==void 0)return i}}}function _o(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var sc,oc=w(()=>{"use strict";Vd();Mt();gt();xn();yt();sc=class extends xe{constructor(e){super({provider:new Cn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:H0})}seedArgsFor(e){return Mh({prompt:e?.prompt??ge,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){B0(e,{recursive:!0});let n=this.seedArgsFor(r);Et("lmplayer",n);try{let s=await Dh(this.binary,n,{cwd:e,env:Sr(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as ho,readFile as X0,rm as J0}from"node:fs/promises";import{basename as Ph,join as xr}from"node:path";function G0(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Ps(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function K0(t,e){if(!e)return;t.observed=!0;let r=Ps(e.promptTokenCount),n=Ps(e.cachedContentTokenCount),s=Ps(e.candidatesTokenCount),i=Ps(e.thoughtsTokenCount);t.totalInputTokens+=r,t.totalCachedInputTokens+=n,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=r,t.lastTokenUsage={inputTokens:Math.max(r-n,0),cachedInputTokens:n,outputTokens:s,reasoningOutputTokens:i,totalTokens:Ps(e.totalTokenCount)||r+s}}function V0(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Fh(t){return t.type==="user"||t.message?.role==="user"}function Uh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Wh(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(`
|
|
1693
1693
|
`):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
|
|
1694
|
-
`):"":""}function qh(t){return t.model||t.message?.model}function Y0(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Hh(t).filter(r=>!r.thought&&r.type!=="thinking"&&typeof r.text=="string"&&r.text.length>0).length}function Fs(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function z0(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Fs(e.output??e.error??t)}return Fs(t)}function Hh(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Bh(t,e,r){let n=t.name||"tool";return{role:"tool_use",timestamp:e,content:n,toolName:n,toolInput:Fs(t.args,!0),toolInputData:$t(t.args),toolCallId:t.id,model:r}}var go,Xh=w(()=>{"use strict";rr();go=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Ar(ve,".qwen")}async discoverSessions(){let e=Ar(this.baseDir,"projects"),r;try{r=await ho(e)}catch{return[]}let n=[];for(let s of r){let i=Ar(e,s,"chats"),o;try{o=await ho(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=Ar(i,a);try{let c=await this.extractSummary(d,l);c&&n.push(c)}catch{}}}return n}async extractSummary(e,r){let n=await Xe(e,30);if(n.length===0)return null;let s=await Oe(e),i="(unknown)",o,a,l,d,c=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Fh(u)){let f=Wh(u).trim();f&&(l||(l=X(f,80)),d=X(f,80),c++)}if(Uh(u)){let f=qh(u);f&&(o=f),c+=Y0(u)}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Ph(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Oe(e),s="(unknown)",i,o,a,l,d,c,u=[],f=G0();for await(let m of Be(e)){if(K0(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(m.type==="tool_result"){let _=Hh(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:h,content:Fs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let y=g.functionResponse,E=z0(y.response),v=Fs(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:h,content:v??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(Fh(m)){let _=Wh(m);_.trim()&&(d||(d=X(_.trim(),80)),c=X(_.trim(),80)),u.push({role:"user",timestamp:h,content:_})}else if(Uh(m)){let _=qh(m);if(_&&(i=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&u.push(Bh(g.functionCall,h,_));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let y=g.thinking||g.text;y&&u.push({role:"thinking",timestamp:h,content:y})}else g.functionCall?u.push(Bh(g.functionCall,h,_)):g.text&&u.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:c,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...V0(f),messages:u}}async resolveSessionPath(e){let r=Ar(this.baseDir,"projects");try{let n=await ho(r),s=[];for(let i of n){let o=Ar(r,i,"chats",`${e}.jsonl`);try{return await X0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=Ar(r,i,"chats"),a;try{a=await ho(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Ph(l,".jsonl").startsWith(e)&&s.push(Ar(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 J0(r),!0}catch{return!1}}}});function lc(){return new ac}var ac,dc=w(()=>{"use strict";Xh();Mt();Ir();gt();ac=class extends xe{constructor(){super({provider:new go,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:io})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as Jh,readFile as Gh,rm as Kh,stat as Vh}from"node:fs/promises";import{basename as cc,join as Dt}from"node:path";import{fileURLToPath as Z0}from"node:url";async function Q0(t){let e=await Promise.all(t.map(r=>Oe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function eL(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Yh(t){return t.type==="USER_INPUT"}function zh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function tL(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Zh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Qh(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 rL(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function nL(t){for await(let e of Be(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=sL(s);if(i)return i}let n=iL(e.content);if(n)return n}return null}function sL(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 iL(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function oL(t,e){if(t.status!=="RUNNING"||!t.content)return;let r=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!r||r[1]!==e)&&!(t.step_index===void 0||Number(r[3])!==t.step_index))return r[2]}function aL(t,e){let r=new Set;for(let n of e){let s=lL(t,r,n);if(!s)continue;r.add(s);let i=n.event.step_index===void 0?void 0:`agy-step-${n.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=n.message.backgroundTaskId,n.message.toolName=s.name,n.message.toolCallId=i}}function lL(t,e,r){let n=r.message.backgroundTaskId===void 0?void 0:fL(r.event.content);if(n!==void 0)return eg(t.filter(i=>!e.has(i)&&mL(i)===n),r.event.step_index);let s=uL(r.event);if(s!==void 0)return eg(t.filter(i=>!e.has(i)&&dL(i.name,r.event.type)&&rg(cL(i))===s),r.event.step_index)}function eg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let r=t.map(n=>({call:n,distance:n.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-n.stepIndex)})).sort((n,s)=>n.distance-s.distance);return r[0].distance<r[1].distance?r[0].call:void 0}function dL(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function cL(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function uL(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),rg(e)}function rg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return Z0(e)}catch{return}}function fL(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function mL(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,r=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof r!="string"?void 0:`Timer: ${e}s, Prompt: ${r}`}}function tg(t){if(t.endsWith(".db"))return cc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var yo,ng=w(()=>{"use strict";rr();yo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Dt(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Dt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Dt(this.baseDir,"conversations"),r;try{r=await Jh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=cc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Dt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,r){return Dt(this.baseDir,"brain",e,".system_generated","logs",r?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let r of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Vh(r),r}catch{}return null}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await Q0([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,d,c=0;if(n){let u=await Xe(n,80);for(let f of u){let m=Qh(f.content);if(m&&(a=m),Yh(f)){let p=Zh(f.content).trim();p&&(l||(l=X(p,80)),d=X(p,80)),c++}else zh(f)&&f.content&&c++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=tg(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage,c=[],u=[];if(i)for await(let f of Be(i)){let m=eL(f.created_at,s.modifiedAt),p=Qh(f.content);if(p&&(a=p),Yh(f)){let h=Zh(f.content),_=h.trim();_&&(l||(l=X(_,80)),d=X(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=rL(h.args),y=$t(h.args),E={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:y};o.push(E),c.push({name:_,stepIndex:f.step_index,input:y,message:E})}if(zh(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(tL(f)&&f.content){let h=oL(f,n),_=h===void 0?null:await this.readTaskLog(n,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return aL(c,u),{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Vh(r),r}catch{}let n=Dt(this.baseDir,"conversations");try{let s=[];for(let i of await Jh(n)){if(!i.endsWith(".db"))continue;cc(i,".db").startsWith(e)&&s.push(Dt(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=tg(r);return n?(await Kh(this.conversationPath(n),{force:!0}),await Kh(Dt(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 nL(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Dt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Gh(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}async readTaskLog(e,r){if(!/^task-\d+$/.test(r))return null;let n=Dt(this.baseDir,"brain",e,".system_generated","tasks",`${r}.log`);try{let[s,i]=await Promise.all([Gh(n,"utf8"),Oe(n)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as pL}from"node:child_process";function fc(t){return new uc(t)}async function _L(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",gL(e.timeoutMs)];e.model&&n.push("--model",e.model),Et("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await hL(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function hL(t,e,r){return new Promise((n,s)=>{let i;try{i=pL(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(d){s(d);return}let o="",a="";i.stdout?.on("data",d=>{o+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",d=>{r.signal?.removeEventListener("abort",l),s(d)}),i.on("exit",(d,c)=>{if(r.signal?.removeEventListener("abort",l),d===0){n({stdout:o,stderr:a});return}let u=c?`signal ${c}`:`exit code ${d}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function gL(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var uc,mc=w(()=>{"use strict";ng();Mt();gt();yt();xn();uc=class extends xe{constructor(e){super({provider:new yo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_L})}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 yL}from"node:crypto";import{existsSync as EL,mkdirSync as _c,readFileSync as wL,renameSync as TL,rmdirSync as ug,statSync as vL,writeFileSync as SL}from"node:fs";import{dirname as Ec,join as sg,resolve as pc}from"node:path";function bL(t){return yL("sha256").update(t).digest("hex").slice(0,8)}function kL(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function IL(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 fg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Eo(t){return Math.max(1,Math.ceil(t.length/4))}function Mn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return pc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?sg(Ec(pc(r)),".lmctl-claude-mock","sessions.json"):sg(pc(t),".lmctl-claude-mock","sessions.json")}function ig(){return{schemaVersion:1,sessions:{}}}function Us(t){if(!EL(t))return ig();try{let e=JSON.parse(wL(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=hc(e.defaultDelayMs);return{schemaVersion:1,sessions:r,...i!==void 0?{defaultDelayMs:i}:{},...n!==void 0?{script:n}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return ig()}}function mg(t,e){_c(Ec(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;SL(r,`${JSON.stringify(e,null,2)}
|
|
1694
|
+
`):"":""}function qh(t){return t.model||t.message?.model}function Y0(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Hh(t).filter(r=>!r.thought&&r.type!=="thinking"&&typeof r.text=="string"&&r.text.length>0).length}function Fs(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function z0(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Fs(e.output??e.error??t)}return Fs(t)}function Hh(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Bh(t,e,r){let n=t.name||"tool";return{role:"tool_use",timestamp:e,content:n,toolName:n,toolInput:Fs(t.args,!0),toolInputData:$t(t.args),toolCallId:t.id,model:r}}var go,Xh=w(()=>{"use strict";rr();go=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||xr(ve,".qwen")}async discoverSessions(){let e=xr(this.baseDir,"projects"),r;try{r=await ho(e)}catch{return[]}let n=[];for(let s of r){let i=xr(e,s,"chats"),o;try{o=await ho(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=xr(i,a);try{let c=await this.extractSummary(d,l);c&&n.push(c)}catch{}}}return n}async extractSummary(e,r){let n=await Xe(e,30);if(n.length===0)return null;let s=await Oe(e),i="(unknown)",o,a,l,d,c=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Fh(u)){let f=Wh(u).trim();f&&(l||(l=X(f,80)),d=X(f,80),c++)}if(Uh(u)){let f=qh(u);f&&(o=f),c+=Y0(u)}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Ph(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Oe(e),s="(unknown)",i,o,a,l,d,c,u=[],f=G0();for await(let m of He(e)){if(K0(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(m.type==="tool_result"){let _=Hh(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:h,content:Fs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let y=g.functionResponse,E=z0(y.response),v=Fs(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:h,content:v??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(Fh(m)){let _=Wh(m);_.trim()&&(d||(d=X(_.trim(),80)),c=X(_.trim(),80)),u.push({role:"user",timestamp:h,content:_})}else if(Uh(m)){let _=qh(m);if(_&&(i=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&u.push(Bh(g.functionCall,h,_));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let y=g.thinking||g.text;y&&u.push({role:"thinking",timestamp:h,content:y})}else g.functionCall?u.push(Bh(g.functionCall,h,_)):g.text&&u.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:c,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...V0(f),messages:u}}async resolveSessionPath(e){let r=xr(this.baseDir,"projects");try{let n=await ho(r),s=[];for(let i of n){let o=xr(r,i,"chats",`${e}.jsonl`);try{return await X0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=xr(r,i,"chats"),a;try{a=await ho(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Ph(l,".jsonl").startsWith(e)&&s.push(xr(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 J0(r),!0}catch{return!1}}}});function lc(){return new ac}var ac,dc=w(()=>{"use strict";Xh();Mt();Nr();gt();ac=class extends xe{constructor(){super({provider:new go,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:io})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as Jh,readFile as Gh,rm as Kh,stat as Vh}from"node:fs/promises";import{basename as cc,join as Dt}from"node:path";import{fileURLToPath as Z0}from"node:url";async function Q0(t){let e=await Promise.all(t.map(r=>Oe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function eL(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Yh(t){return t.type==="USER_INPUT"}function zh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function tL(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Zh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Qh(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 rL(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function nL(t){for await(let e of He(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=sL(s);if(i)return i}let n=iL(e.content);if(n)return n}return null}function sL(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 iL(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function oL(t,e){if(t.status!=="RUNNING"||!t.content)return;let r=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!r||r[1]!==e)&&!(t.step_index===void 0||Number(r[3])!==t.step_index))return r[2]}function aL(t,e){let r=new Set;for(let n of e){let s=lL(t,r,n);if(!s)continue;r.add(s);let i=n.event.step_index===void 0?void 0:`agy-step-${n.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=n.message.backgroundTaskId,n.message.toolName=s.name,n.message.toolCallId=i}}function lL(t,e,r){let n=r.message.backgroundTaskId===void 0?void 0:fL(r.event.content);if(n!==void 0)return eg(t.filter(i=>!e.has(i)&&mL(i)===n),r.event.step_index);let s=uL(r.event);if(s!==void 0)return eg(t.filter(i=>!e.has(i)&&dL(i.name,r.event.type)&&rg(cL(i))===s),r.event.step_index)}function eg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let r=t.map(n=>({call:n,distance:n.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-n.stepIndex)})).sort((n,s)=>n.distance-s.distance);return r[0].distance<r[1].distance?r[0].call:void 0}function dL(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function cL(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function uL(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),rg(e)}function rg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return Z0(e)}catch{return}}function fL(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function mL(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,r=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof r!="string"?void 0:`Timer: ${e}s, Prompt: ${r}`}}function tg(t){if(t.endsWith(".db"))return cc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var yo,ng=w(()=>{"use strict";rr();yo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Dt(ve,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Dt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Dt(this.baseDir,"conversations"),r;try{r=await Jh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=cc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Dt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,r){return Dt(this.baseDir,"brain",e,".system_generated","logs",r?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let r of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Vh(r),r}catch{}return null}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await Q0([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,d,c=0;if(n){let u=await Xe(n,80);for(let f of u){let m=Qh(f.content);if(m&&(a=m),Yh(f)){let p=Zh(f.content).trim();p&&(l||(l=X(p,80)),d=X(p,80)),c++}else zh(f)&&f.content&&c++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=tg(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage,c=[],u=[];if(i)for await(let f of He(i)){let m=eL(f.created_at,s.modifiedAt),p=Qh(f.content);if(p&&(a=p),Yh(f)){let h=Zh(f.content),_=h.trim();_&&(l||(l=X(_,80)),d=X(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=rL(h.args),y=$t(h.args),E={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:y};o.push(E),c.push({name:_,stepIndex:f.step_index,input:y,message:E})}if(zh(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(tL(f)&&f.content){let h=oL(f,n),_=h===void 0?null:await this.readTaskLog(n,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return aL(c,u),{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Vh(r),r}catch{}let n=Dt(this.baseDir,"conversations");try{let s=[];for(let i of await Jh(n)){if(!i.endsWith(".db"))continue;cc(i,".db").startsWith(e)&&s.push(Dt(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=tg(r);return n?(await Kh(this.conversationPath(n),{force:!0}),await Kh(Dt(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 nL(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Dt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Gh(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}async readTaskLog(e,r){if(!/^task-\d+$/.test(r))return null;let n=Dt(this.baseDir,"brain",e,".system_generated","tasks",`${r}.log`);try{let[s,i]=await Promise.all([Gh(n,"utf8"),Oe(n)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as pL}from"node:child_process";function fc(t){return new uc(t)}async function _L(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",gL(e.timeoutMs)];e.model&&n.push("--model",e.model),Et("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await hL(e.binary,n,{cwd:e.cwd,env:Je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function hL(t,e,r){return new Promise((n,s)=>{let i;try{i=pL(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(d){s(d);return}let o="",a="";i.stdout?.on("data",d=>{o+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",d=>{r.signal?.removeEventListener("abort",l),s(d)}),i.on("exit",(d,c)=>{if(r.signal?.removeEventListener("abort",l),d===0){n({stdout:o,stderr:a});return}let u=c?`signal ${c}`:`exit code ${d}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function gL(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var uc,mc=w(()=>{"use strict";ng();Mt();gt();yt();xn();uc=class extends xe{constructor(e){super({provider:new yo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_L})}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 yL}from"node:crypto";import{existsSync as EL,mkdirSync as _c,readFileSync as wL,renameSync as TL,rmdirSync as ug,statSync as vL,writeFileSync as SL}from"node:fs";import{dirname as Ec,join as sg,resolve as pc}from"node:path";function bL(t){return yL("sha256").update(t).digest("hex").slice(0,8)}function kL(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function IL(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 fg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Eo(t){return Math.max(1,Math.ceil(t.length/4))}function Mn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return pc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?sg(Ec(pc(r)),".lmctl-claude-mock","sessions.json"):sg(pc(t),".lmctl-claude-mock","sessions.json")}function ig(){return{schemaVersion:1,sessions:{}}}function Us(t){if(!EL(t))return ig();try{let e=JSON.parse(wL(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=hc(e.defaultDelayMs);return{schemaVersion:1,sessions:r,...i!==void 0?{defaultDelayMs:i}:{},...n!==void 0?{script:n}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return ig()}}function mg(t,e){_c(Ec(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;SL(r,`${JSON.stringify(e,null,2)}
|
|
1695
1695
|
`,"utf8"),TL(r,t)}function xL(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function RL(t){let e=`${t}.lock`;_c(Ec(t),{recursive:!0});let r=Date.now()+og;for(;;)try{return _c(e),e}catch(n){if(n.code!=="EEXIST")throw n;try{if(Date.now()-vL(e).mtimeMs>NL){try{ug(e)}catch{}continue}}catch{continue}if(Date.now()>=r)throw new Error(`ClaudeMock store lock timeout after ${og}ms: ${e}`);xL(AL)}}function LL(t){try{ug(t)}catch{}}function pg(t,e){let r=RL(t);try{return e()}finally{LL(r)}}function OL(t){return{...t,timestamp:t.timestamp.toISOString()}}function CL(t){return{...t,timestamp:new Date(t.timestamp)}}function $L(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(OL)}}function _g(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(CL)}}function wo(t,e=process.cwd()){let r=$n.get(t);if(r!==void 0)return r;let s=Us(Mn(e)).sessions[t];if(s===void 0)return;let i=_g(s);return $n.set(i.sessionId,i),i}function ag(t){$n.set(t.sessionId,t);let e=Mn(t.cwd);pg(e,()=>{let r=Us(e);r.sessions[t.sessionId]=$L({...t,filePath:e}),mg(e,r)})}function ML(t,e=process.cwd()){let r=Mn(e);return pg(r,()=>{let n=Us(r),s=n.sessions[t]!==void 0;return s&&(delete n.sessions[t],mg(r,n)),s})}function DL(){let t=Us(Mn()),e=Object.values(t.sessions).map(_g);for(let r of e)$n.set(r.sessionId,r);return e}function hc(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function lg(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=hc(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=hc(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function dg(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function jL(t,e){let{script:r,scriptContains:n}=e;if(r!==void 0){let s=lg(r[t]??r[fg(t)]);if(s!==void 0)return s}if(n!==void 0){for(let s of Object.keys(n))if(t.includes(s)){let i=lg(n[s]);if(i!==void 0)return i}}}function cg(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 wc(){return new yc}var $n,NL,AL,og,gc,yc,Tc=w(()=>{"use strict";$n=new Map;NL=5e3,AL=15,og=1e4;gc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of DL())e.set(r.sessionId,r);for(let r of $n.values())e.set(r.sessionId,r);return[...e.values()].map(cg)}async loadSession(e){let r=wo(e);return r===void 0?null:{...cg(r),messages:r.messages.slice()}}async resolveSessionPath(e){return wo(e)?.filePath??null}async deleteSession(e){let r=$n.delete(e),n=ML(e);return r||n}},yc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new gc;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=kL(IL(e,r)),s=`mock-${n}-${bL(`${e}:${n}`)}`,i=new Date,o=Mn(e),a=wo(s,e),l=r?.prompt??"ClaudeMock seed",d=Eo(l),c={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:i,content:l}),c.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=d,c.totalOutputTokens+=Eo("ACK: ClaudeMock seeded"),ag(c),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=wo(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=Us(Mn(r.cwd)),a=jL(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await dg(l),new Error(a.error);let d=a?.kind==="success"?a.text:`ClaudeMock ack: ${fg(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:d,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Eo(e),s.totalOutputTokens+=Eo(d),ag(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await dg(l),{text:d,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function jt(t){let e=[$d({claudeDir:t?.claudeDir}),jd({codexDir:t?.codexDir,codeDir:t?.codeDir}),qd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Jd({copilotDir:t?.copilotDir}),zd(),rc({kimiHome:t?.kimiHome}),ic({lmplayerDbPath:t?.lmplayerDbPath}),lc(),fc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(wc()),e}var vc=w(()=>{"use strict";Md();Pd();Bd();Gd();Zd();nc();oc();dc();mc();Tc();Md();Pd();Bd();Gd();Zd();nc();oc();dc();mc();Tc()});var Ic={};he(Ic,{ProviderRegistry:()=>xs,TransportConnectionError:()=>Se,TransportError:()=>ct,TransportJsonError:()=>Qi,TransportProcessError:()=>nr,TransportRpcError:()=>sr,_resetDefaultRegistryForTests:()=>PL,chat:()=>Pt,countTokens:()=>kc,createAdapterRegistry:()=>Ct,createAllAdapters:()=>jt,listSessions:()=>bc,seed:()=>Sc});function vo(){return To===null&&(To=Ct(jt())),To}function PL(){To=null}function gg(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Pt(t){let e=t.registry??vo(),r=gg(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Sc(t){let e=t.registry??vo(),r=gg(e,t.provider),n=await hg(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 hg(e,t.provider,t.cwd),a=FL(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function hg(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 FL(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 bc(t={}){return(t.registry??vo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function kc(t){let r=await(t.registry??vo()).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 To,Ft=w(()=>{"use strict";cd();vc();cd();vc();An();To=null});function UL(){return Nc===null&&(Nc=Ct(jt())),Nc}async function So(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 qL(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)Dn.delete(r),e.setMemberState(r,"idle");else{let o=WL(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function WL(t,e){if(!(t instanceof Re))return Dn.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=(Dn.get(e)??0)+1;return r>=3?(Dn.delete(e),"consecutive_timeouts"):(Dn.set(e,r),null)}return Dn.delete(e),null}async function qL(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=UL(),s;try{let c=await n.resolveSession(t.sessionid);if(!c)return Promise.reject(new Re("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Ac(t.sessionid,t.sessiondir,"unresolved")));s=c.provider.name}catch(c){return Promise.reject(new Re("other",null,`library: session resolution failed: ${yg(c)}`,Ac(t.sessionid,t.sessiondir,"unresolved")))}let i=Ac(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let d=Date.now();try{let c=await Pt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(c.status==="stalled")throw new Re("timeout",null,`library: stalled after ${c.stalledAfterMs??0}ms`,i);return{text:c.text,ms:Date.now()-d,exit_status:0,argv:i}}catch(c){throw l?new Re("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):BL(c,i)}finally{a!==null&&clearTimeout(a)}}function Ac(t,e,r){return["<library>","chat",t,e,"--provider",r]}function yg(t){return t instanceof Error?t.message:String(t)}function BL(t,e){if(t instanceof Re)return t;if(t instanceof Se){let r=t.cause;return r?.code==="ENOENT_CWD"?new Re("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Re("enoent",null,t.message,e):new Re("other",null,t.message,e)}return t instanceof nr?new Re("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof sr?new Re("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ct?new Re("other",null,t.message,e):new Re("other",null,yg(t),e)}var Re,Nc,Dn,bo=w(()=>{"use strict";Ft();Re=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},Nc=null;Dn=new Map});function Eg(){return xc===null&&(xc=Ct(jt())),xc}function XL(t,e){if(!HL.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ce("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return r}async function ko(t){let e=XL(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await JL({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function JL(t){let e=t.member.provider,r=t.member.sessiondir,n=Rc("seed",r,e);try{let s=await Sc({provider:e,cwd:r,registry:Eg()});if(!s.success)throw KL(s.error,n);if(!s.sessionId)throw new Ce("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ce?s:Lc(s,n)}}async function wg(t){return GL(t)}async function GL(t){let e=Eg(),r=Rc("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ce("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ce?i:Lc(i,r)}let s=Rc("tokens",t.sessionid,n);try{let i=await kc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ce?i:Lc(i,s)}}function Rc(t,e,r){return["<library>",t,e,"--provider",r]}function KL(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ce("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ce("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ce("nonzero_exit",Number(n[1]),r,e)}return new Ce("other",null,r,e)}function Lc(t,e){return t instanceof Ce?t:t instanceof Se?t.cause?.code==="ENOENT"?new Ce("enoent",null,t.message,e):new Ce("other",null,t.message,e):t instanceof nr?new Ce("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof sr?new Ce("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ct?new Ce("other",null,t.message,e):new Ce("other",null,t instanceof Error?t.message:String(t),e)}var Ce,xc,HL,Oc=w(()=>{"use strict";Ft();Ce=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},xc=null;HL=/^provider[123]$/});function Io(t){return Buffer.from(t,"utf8").toString("base64url")}function qs(t){return Buffer.from(t,"base64url").toString("utf8")}async function Tg(t,e=r=>wg({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of VL(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 vg(t,e,r){let n=Sg(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Ws(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await So({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:bg(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 Cc(t,e,r){let n=Sg(t,e,r);if(n===null)throw new Error("session member not found");let s=await ko({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:bg(t,e,r)}}function VL(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Sg(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 bg(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Ws,No=w(()=>{"use strict";bo();Oc();Ws=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function $c(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??zL(e),s=r-n,i=e.query(`
|
|
1696
1696
|
SELECT
|
|
1697
1697
|
isess.id AS interactive_session_id,
|
|
@@ -1736,7 +1736,7 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1736
1736
|
GROUP BY name
|
|
1737
1737
|
) latest ON latest.name = w.name AND latest.version = w.version
|
|
1738
1738
|
ORDER BY w.name ASC
|
|
1739
|
-
`)}function Rg(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 Lg(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 Og(t,e){return t.getSubmittedPr(e)}function $o(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function jn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Qr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:$o(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:sO(t,r.id)}}function sO(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Cg(t,r.id)}))}function Fc(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:Cg(t,n.id)}}function Cg(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function en(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 $g(t,e,r){let n=Fc(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 Mg(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 Dg(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
|
|
1739
|
+
`)}function Rg(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 Lg(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 Og(t,e){return t.getSubmittedPr(e)}function $o(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function jn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Qr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:$o(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:sO(t,r.id)}}function sO(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Cg(t,r.id)}))}function Fc(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:Cg(t,n.id)}}function Cg(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function en(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 $g(t,e,r){let n=Fc(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 Mg(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 Dg(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 Lr(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 Mo(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(`${jg}
|
|
1740
1740
|
WHERE ${n}
|
|
1741
1741
|
ORDER BY a.created_at DESC`,...r).map(Pg)}function Ut(t,e){let n=t.query(`${jg}
|
|
1742
1742
|
WHERE a.id = ?`,e)[0];return n===void 0?null:Pg(n)}function Pg(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 Fg(t){return t.query(`
|
|
@@ -1824,7 +1824,7 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1824
1824
|
AND acknowledged_at IS NULL
|
|
1825
1825
|
ORDER BY id ASC`,e).map(b=>({kind:b.kind,severity:b.severity,payload:_O(b.payload)})),v=g.map(b=>{let x=f.get(b),H=p.get(b),F=dO(s,b,y,x,H),$=x===void 0?null:Date.parse(x.started_at),R=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN($??NaN)?null:R!==null&&!Number.isNaN(R)?R-$:F==="running"||F==="paused"?n-$:null,Y=x===void 0?null:h.get(x.id)??null,B=hO(H?.last_activity_at??null,Y,_),k=i===null||H===void 0?void 0:fO(t,s.team_id,i.definition,H.state_name,x?.state_name??b);return{step_id:x?.id??null,state_id:b,status:F,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...H!==void 0?{interactive_session:{id:H.id,status:H.status,turn_count:H.turn_count,state_name:H.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:uO(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:cO(v,s.terminal_state!==null),related_attentions:E}}function Po(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} (${Ag(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${Ng(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Ng(t.submitted_at,a.started_at),d=a.status.padEnd(7),c=a.elapsed_ms===null?"":` elapsed ${Fo(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${d}${c}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${Ag(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${gO(a.payload)}`)}return`${n.join(`
|
|
1826
1826
|
`)}
|
|
1827
|
-
`}function aO(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 lO(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function dO(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 cO(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 uO(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 fO(t,e,r,n,s){let i=mO(r,n,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function mO(t,e,r){let n=pO(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>
|
|
1827
|
+
`}function aO(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 lO(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function dO(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 cO(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 uO(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 fO(t,e,r,n,s){let i=mO(r,n,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function mO(t,e,r){let n=pO(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Rr(a)?a.id===e||a.name===e||a.name===r:!1),i=Rr(s?.members)?s.members:null,o=i!==null&&Rr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(Rr(n.states)){let s=n.states[e]??n.states[r];if(!Rr(s))return null;let i=Rr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function pO(t){try{let e=JSON.parse(t);return Rr(e)?e:null}catch{return null}}function _O(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Rr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function hO(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Ng(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Fo(Math.max(0,n-r)).padEnd(6)}]`}function Ag(t,e){return Number.isNaN(t)?"?":Fo(Math.max(0,e-t))}function Fo(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 gO(t){if(!Rr(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"?`, ${Fo(t.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${i}`}var jg,ir=w(()=>{"use strict";dt();jg=`SELECT a.id AS attention_id,
|
|
1828
1828
|
a.kind AS kind,
|
|
1829
1829
|
a.severity AS severity,
|
|
1830
1830
|
a.created_at AS created_at,
|
|
@@ -1851,20 +1851,20 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1851
1851
|
`),2):bC(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&qo(r.rest.slice(2)))return e.stdout.write(`${AO}
|
|
1852
1852
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&qo(r.rest.slice(2)))return e.stdout.write(`${xO}
|
|
1853
1853
|
`),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?wC(r.rest.slice(2),e):TC(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?vC(r.rest.slice(2),e):SC(r.rest.slice(2),e);if(r.present)return iC(r.rest,e);let n=Xg(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1854
|
-
`),2;let s=tn(e),i=s.baseUrl,o=
|
|
1854
|
+
`),2;let s=tn(e),i=s.baseUrl,o=Or(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=PO(n.upload.filePath,n.upload.project)}catch(d){return e.stderr.write(`error: upload failed: ${d instanceof Error?d.message:String(d)}
|
|
1855
1855
|
`),2}else n.body!==void 0&&n.contentType!==void 0?o["Content-Type"]=n.contentType:n.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,i),{method:n.method,headers:o,body:a})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1856
1856
|
`),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1857
1857
|
`),l.status===400?2:1;if(n.runAfterSubmit){let d=await l.json(),c=UO(d);if(c===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
|
|
1858
|
-
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${c}/run`,i),{method:"POST",headers:
|
|
1858
|
+
`),2;let u;try{u=await fetch(new URL(`/api/jobs/${c}/run`,i),{method:"POST",headers:Or("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
|
|
1859
1859
|
`),2}if(!u.ok)return e.stderr.write(`error: HTTP ${u.status}: ${await u.text()}
|
|
1860
1860
|
`),u.status===400?2:1;let f=await u.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
|
|
1861
1861
|
`):e.stdout.write(`${JSON.stringify(f)}
|
|
1862
1862
|
`)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1863
1863
|
`):(e.stdout.write(await l.text()),e.stdout.write(`
|
|
1864
|
-
`));return 0}function Xg(t){let e=Kg(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"?Wo(i,"/api/status",n):s==="projects"?Wo(i,"/api/projects",n):s==="teams"?Wo(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?KO(i.slice(1),e.format):Wo(i,"/api/workflows",n):s==="workflow"?GO(i,n):s==="upload"?XO(i,n):s==="submit-job"?JO(i,n):s==="issues"?HO(i,n):s==="jobs"?Bs(i,"--status","/api/jobs","status",n):s==="job"?BO(i,n):s==="project"?VO(i,n):s==="artifact"?ZO(i,n):s==="runs"?Bs(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Bs(i,"--type","/api/external-objects","type",n):s==="external-signals"?qg(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?QO(i,n):qg(i,"--unacked","/api/attentions","unacked",n):s==="stats"?eC(i,n):s==="daemon"?tC(i,n):s==="intake"?rC(i,n):s==="session"?nC(i,n):s==="run"?sC(i,e.format):s==="prs"?Bs(i,"--status","/api/submitted-prs","status",n):s==="pr"?WO(i,n):`unknown subcommand: ${s}`}function
|
|
1864
|
+
`));return 0}function Xg(t){let e=Kg(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"?Wo(i,"/api/status",n):s==="projects"?Wo(i,"/api/projects",n):s==="teams"?Wo(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?KO(i.slice(1),e.format):Wo(i,"/api/workflows",n):s==="workflow"?GO(i,n):s==="upload"?XO(i,n):s==="submit-job"?JO(i,n):s==="issues"?HO(i,n):s==="jobs"?Bs(i,"--status","/api/jobs","status",n):s==="job"?BO(i,n):s==="project"?VO(i,n):s==="artifact"?ZO(i,n):s==="runs"?Bs(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Bs(i,"--type","/api/external-objects","type",n):s==="external-signals"?qg(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?QO(i,n):qg(i,"--unacked","/api/attentions","unacked",n):s==="stats"?eC(i,n):s==="daemon"?tC(i,n):s==="intake"?rC(i,n):s==="session"?nC(i,n):s==="run"?sC(i,e.format):s==="prs"?Bs(i,"--status","/api/submitted-prs","status",n):s==="pr"?WO(i,n):`unknown subcommand: ${s}`}function Or(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function tn(t){if(t.dal!==void 0)return Hs(t.dal,process.env,t);let e=Be({path:ne()});try{return Hs(e,process.env,t)}finally{e.close()}}function Hs(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=TO;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.
|
|
1865
1865
|
`)):o!==null?a=o:a=null;for(let l of n)r.stderr.write(`note: ${bO(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
|
|
1866
1866
|
`);return{baseUrl:i,token:a}}function bO(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 kO(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
|
|
1867
|
-
`),2;let s=e.dal===void 0,i=e.dal??
|
|
1867
|
+
`),2;let s=e.dal===void 0,i=e.dal??Be({path:ne()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
|
|
1868
1868
|
`),2;let o=n[0];if(!Uo.has(o))return e.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Uo].join(", ")})
|
|
1869
1869
|
`),2;let a=i.getConfig(o);return a===null?(e.stderr.write(`error: ${o} is not set
|
|
1870
1870
|
`),1):(e.stdout.write(`${a}
|
|
@@ -1879,8 +1879,8 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1879
1879
|
`),2}finally{s&&i.close()}}async function IO(t,e,r){if(qo(t))return e.stdout.write(`${NO}
|
|
1880
1880
|
`),0;let n=ey(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>
|
|
1881
1881
|
`),2):s?LO(o,a,e):o==="list"?CO(a,e):o==="show"?MO(a,e):o==="respond"?DO(a,e):(e.stderr.write(`error: unknown api escalations verb: ${o}
|
|
1882
|
-
`),2)}function qo(t){return t.some(e=>e==="--help"||e==="-h")}function LO(t,e,r){let n=r.dal===void 0,s=r.dal??
|
|
1883
|
-
`),2;let n=tn(e),s=
|
|
1882
|
+
`),2)}function qo(t){return t.some(e=>e==="--help"||e==="-h")}function LO(t,e,r){let n=r.dal===void 0,s=r.dal??Be({path:ne()});try{return ty(s,[t,...e],r)}finally{n&&s.close()}}function Jg(t){let e,r=!1,n=!1,s;for(let o=0;o<t.length;o+=1){let a=t[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let d=OO(l);if(typeof d=="object"&&"error"in d)return d.error;s=d.iso;continue}return ae(a)}let i={json:r,all:n};return e!==void 0&&(i.project=e),s!==void 0&&(i.since=s),i}function OO(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 CO(t,e){let r=Jg(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1883
|
+
`),2;let n=tn(e),s=Or("application/json",n.token),i=new URLSearchParams;r.project!==void 0&&i.set("project",r.project),r.all&&i.set("all","true"),r.since!==void 0&&i.set("since",r.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,n.baseUrl),{method:"GET",headers:s})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1884
1884
|
`),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
|
|
1885
1885
|
`),a.status===400?2:1;let l=await a.json();return Gg(l,r.json,e)}function Gg(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
|
|
1886
1886
|
`),0;if(t.length===0)return r.stdout.write(`No pending escalations.
|
|
@@ -1894,20 +1894,20 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1894
1894
|
`),r.stdout.write(`
|
|
1895
1895
|
`)}return 0}function $O(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function MO(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]
|
|
1896
1896
|
`),2;let n=de(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
|
|
1897
|
-
`),2;let s=tn(e),i=
|
|
1897
|
+
`),2;let s=tn(e),i=Or("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)}
|
|
1898
1898
|
`),1}return o.status===404?(e.stderr.write(`error: escalation not found: ${n}
|
|
1899
1899
|
`),1):o.ok?(e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1900
1900
|
`),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1901
1901
|
`),o.status===400?2:1)}async function DO(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1902
1902
|
`),2;let i=de(s[0],"attention_id");if(typeof i=="string")return e.stderr.write(`error: ${i}
|
|
1903
|
-
`),2;let o=s[1],a=tn(e),l=
|
|
1903
|
+
`),2;let o=s[1],a=tn(e),l=Or("application/json",a.token);l["Content-Type"]="application/json";let d={input:o};n&&(d.done=!0);let c;try{c=await fetch(new URL(`/api/escalations/${i}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(d)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
|
|
1904
1904
|
`),1}if(c.status===404)return e.stderr.write(`error: escalation not found: ${i}
|
|
1905
1905
|
`),1;if(!c.ok){let f=await c.text();return e.stderr.write(`error: HTTP ${c.status}: ${f}
|
|
1906
1906
|
`),c.status===400?2:1}let u=await c.json();return r?e.stdout.write(`${JSON.stringify(u,null,2)}
|
|
1907
1907
|
`):e.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
|
|
1908
1908
|
`),0}function Wg(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function jO(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Ao||t===xo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function PO(t,e){let r=yO(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:FO(t)}),EO(t)),e!==void 0&&s.append("project",e),s}function FO(t){switch(wO(t).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function UO(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function WO(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Bs(n,"--status","/api/submitted-prs","status",e);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Kg(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function Wo(t,e,r){return t.length>0?ae(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Bs(t,e,r,n,s,i=!1){let o;for(let l=0;l<t.length;l+=1){let d=t[l];if(d!==e)return ae(d);let c=t[++l];if(c===void 0||c.startsWith("--"))return`missing value for ${e}`;if(i&&(!/^\d+$/.test(c)||Number(c)<=0))return`invalid ${e}: ${c}`;o=c}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function qg(t,e,r,n,s){let i=!1;for(let o of t){if(o!==e)return ae(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function qO(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=de(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function BO(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return qO([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,d;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;d=p}else return ae(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let c={source:o};return s!==void 0&&(c.project=s),i!==void 0&&(c.project_id=i),a!==void 0&&(c.payload=qc(a)),l!==void 0&&(c.dedupe_key=l),d!==void 0&&(c.priority=d),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(c)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=de(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function HO(t,e){let[r,...n]=t;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let d=i[l],c=i[++l];if(c===void 0||c.startsWith("--"))return`missing value for ${d}`;if(d==="--status")o.set("status",c);else if(d==="--severity")o.set("severity",c);else if(d==="--ai-test-path")o.set("ai_test_path",c);else return ae(d)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=de(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Vg(n,e):r==="claim"?Yg(n,e):r==="claim-next"?zg(n,e):r==="close"?Zg(n,e):r==="reopen"?Qg(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Vg(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=qc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let d=de(l,"--source-run-id");if(typeof d=="string")return d;i.source_run_id=d}else return ae(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Yg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=de(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let d=de(l,"--assigned-run-id");if(typeof d=="string")return d;i.assigned_run_id=d}else return ae(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(i)}}function zg(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=de(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ae(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Zg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=de(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let d=de(l,"--closed-run-id");if(typeof d=="string")return d;i.closed_run_id=d}else return ae(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Qg(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=de(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let d=de(l,"--source-run-id");if(typeof d=="string")return d;i.source_run_id=d}else return ae(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(i)}}function XO(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ae(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function JO(t,e){let r,n,s,i;for(let a=0;a<t.length;a+=1){let l=t[a],d=t[++a];if(d===void 0||d.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=d;else if(l==="--workflow-id-override"){let c=Number(d);if(!Number.isInteger(c)||c<=0)return`invalid --workflow-id-override: ${d}`;n=c}else if(l==="--project")s=d;else if(l==="--inputs")try{let c=JSON.parse(d);if(c===null||typeof c!="object"||Array.isArray(c))return"--inputs must be a JSON object";i=c}catch{return"invalid --inputs JSON"}else return ae(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(o),runAfterSubmit:!0}}function qc(t){try{return JSON.parse(t)}catch{return t}}function GO(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function KO(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ae(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function VO(t,e){let[r,n,...s]=t;return r==="workflow"?YO([n,...s].filter(i=>i!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function YO(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=de(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=de(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:e}}if(r==="add"){let s=zO(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function zO(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=qc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ae(o)}return{project:e,body:s}}function ZO(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<t.length;o+=1){let a=t[o];if(a==="--raw"){s=!0;continue}let l=t[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let d=de(l,"run");if(typeof d=="string")return d;r=d}else if(a==="--kind")n=l;else return ae(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function QO(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=de(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function eC(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function tC(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function rC(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function nC(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Io(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function sC(t,e){let[r,n,s,i]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=de(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=de(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<t.length;l+=1){let d=t[l];if(d!=="--outcome")return ae(d);let c=t[++l];if(c===void 0||c.startsWith("--"))return"missing value for --outcome";a=c}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=de(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=de(n,"run_id");if(typeof o=="string")return o;let a=de(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,d=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:d?"text/plain":"application/json",json:!d}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=de(n,"run_id");if(typeof o=="string")return o;let a;for(let d=2;d<t.length;d+=1){let c=t[d];if(c!=="--kind")return ae(c);let u=t[++d];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=de(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=de(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function de(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ae(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function ey(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function iC(t,e){let r=Kg(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1909
1909
|
`),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
|
|
1910
|
-
`),2;let a=e.dal===void 0,l=e.dal??
|
|
1910
|
+
`),2;let a=e.dal===void 0,l=e.dal??Be({path:ne()});try{if(i==="issues"){let[d,...c]=o;return d===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
|
|
1911
1911
|
`),2):d==="create"?oC(l,c,e,s):d==="claim"?aC(l,c,e,s):d==="claim-next"?lC(l,c,e,s):d==="close"?dC(l,c,e,s):d==="reopen"?cC(l,c,e,s):d==="list"?pC(l,c,e,s):d==="show"?_C(l,c,e,s):(e.stderr.write(`error: --direct does not support: issues ${d} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
1912
1912
|
`),2)}return i==="status"?hC(l,o,e,s):i==="projects"?gC(l,o,e,s):i==="workflows"?yC(l,o,e,s):i==="runs"?EC(l,o,e,s):i==="attentions"||i==="attention"?kC(l,o,e,s):i==="escalations"?ty(l,o,e):(e.stderr.write(`error: --direct is not supported for: ${i} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
|
|
1913
1913
|
`),2)}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
|
|
@@ -1945,34 +1945,34 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1945
1945
|
`),2}return nt(r,jn(t,s!==void 0?{limit:s}:{}),n),0}function wC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
|
|
1946
1946
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1947
1947
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${ae(a)}
|
|
1948
|
-
`),2}let i=e.dal===void 0,o=e.dal??
|
|
1948
|
+
`),2}let i=e.dal===void 0,o=e.dal??Be({path:ne()});try{let a=Pn(o,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
|
|
1949
1949
|
`),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1950
1950
|
`):e.stdout.write(Do(a)),0)}finally{i&&o.close()}}async function TC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
|
|
1951
1951
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1952
1952
|
`),2;let s=!1;for(let d of n){if(d==="--json"){s=!0;continue}if(d!=="--text")return e.stderr.write(`error: ${ae(d)}
|
|
1953
|
-
`),2}let i=tn(e),a=
|
|
1953
|
+
`),2}let i=tn(e),a=Or(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,i.baseUrl),{method:"GET",headers:a})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1954
1954
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1955
1955
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1956
1956
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1957
1957
|
`),l.status===404?1:l.status===400?2:1)}function vC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
|
|
1958
1958
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1959
1959
|
`),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ae(a)}
|
|
1960
|
-
`),2}let i=e.dal===void 0,o=e.dal??
|
|
1960
|
+
`),2}let i=e.dal===void 0,o=e.dal??Be({path:ne()});try{let a=jo(o,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
|
|
1961
1961
|
`),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1962
1962
|
`):e.stdout.write(Po(a)),0)}finally{i&&o.close()}}async function SC(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
|
|
1963
1963
|
`),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
|
|
1964
1964
|
`),2;let s=!1;for(let d of n){if(d==="--json"){s=!0;continue}if(d!=="--text")return e.stderr.write(`error: ${ae(d)}
|
|
1965
|
-
`),2}let i=tn(e),a=
|
|
1965
|
+
`),2}let i=tn(e),a=Or(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,i.baseUrl),{method:"GET",headers:a})}catch(d){return e.stderr.write(`error: network failure: ${d instanceof Error?d.message:String(d)}
|
|
1966
1966
|
`),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
|
|
1967
1967
|
`):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1968
1968
|
`)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
|
|
1969
1969
|
`),l.status===404?1:l.status===400?2:1)}async function bC(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ae(a)}
|
|
1970
|
-
`),2}let n=tn(e),i=
|
|
1970
|
+
`),2}let n=tn(e),i=Or(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)}
|
|
1971
1971
|
`),2}return o.ok?(r?e.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1972
1972
|
`):(e.stdout.write(await o.text()),o.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
|
|
1973
1973
|
`)),0):(e.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1974
1974
|
`),o.status===400?2:1)}function kC(t,e,r,n){let s=!1;for(let i of e){if(i==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ae(i)}
|
|
1975
|
-
`),2}return nt(r,
|
|
1975
|
+
`),2}return nt(r,Lr(t,{unacked:s}),n),0}function ty(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1976
1976
|
`),2;if(n==="list"){let i=Jg(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
|
|
1977
1977
|
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Mo(t,o);return Gg(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]
|
|
1978
1978
|
`),2;let o=de(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
@@ -1982,9 +1982,9 @@ ${r}`:r}function UR(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1982
1982
|
`),2)}function IC(t,e,r){let n=!1,s=!1,i=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}i.push(m)}if(i.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1983
1983
|
`),2;let o=de(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
|
|
1984
1984
|
`),2;let a=i[1],l=Ut(t,o);if(l===null)return r.stderr.write(`error: escalation not found: ${o}
|
|
1985
|
-
`),1;let d=
|
|
1985
|
+
`),1;let d=Lr(t).find(m=>m.id===o);if(d===void 0)return r.stderr.write(`error: escalation not found: ${o}
|
|
1986
1986
|
`),1;if(d.kind==="workflow_escalation"){let m=t.resumeEscalation(o,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${o})
|
|
1987
|
-
`),2;let p=
|
|
1987
|
+
`),2;let p=Lr(t).find(_=>_.id===o),h={ok:!0,attention_id:o,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
|
|
1988
1988
|
`):r.stdout.write(`ok: attention ${o} acknowledged; run ${m.run.id} resumed with decision "${a}"
|
|
1989
1989
|
`),0}if(d.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${o} is kind=${d.kind}, not interactive_waiting_operator
|
|
1990
1990
|
`),2;if(d.acknowledged_at!==null)return r.stderr.write(`error: attention ${o} is already acknowledged (${d.acknowledged_at})
|
|
@@ -2133,7 +2133,7 @@ and \`lmctl api escalations\` (no args) print detailed usage.
|
|
|
2133
2133
|
and report the first step that would be started. Default output is the TTY
|
|
2134
2134
|
table; --json emits the structured WorkflowVerifyReport payload.`;mC=["open","assigned","closed","reopened"]});import ny from"jexl";function Fn(t){ny.compile(sy(t))}async function rn(t,e){return ny.eval(sy(t),e)}function sy(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Xs=w(()=>{"use strict"});import{z as T}from"zod";function Yc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var NC,iy,Hc,Xc,Jc,Gc,Kc,Vc,oy,AC,xC,RC,Js,LC,Bo,Ho,Xo,Jo,Go,ay,OC,CC,$C,MC,Ko,Un=w(()=>{"use strict";Xs();NC=T.object({kind:T.enum(["success","neutral","failure"])}),iy=T.enum(["string","number","boolean","object","array"]),Hc=T.object({name:T.string().min(1),type:iy,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),Xc=T.object({name:T.string().min(1),type:iy,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),Jc=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),Gc="__failure__",Kc=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),Vc=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),oy=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),AC=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),xC=T.union([T.string().min(1),AC]),RC=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Js=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(xC).optional(),skills:T.array(RC).optional()}),LC=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Bo=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Js,pre_checks:T.array(LC).optional(),reviewers:T.array(Js.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Ho=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Js.extend({topic:T.string().min(1)})).optional(),consolidator:Js,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Xo=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Js.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Jo=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Go=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),ay=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Fn(Yc(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}`})}}),OC=T.discriminatedUnion("type",[oy,Bo,Ho,Xo,Jo,Go,ay]),CC=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:OC,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{Fn(Yc(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),$C=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Fn(Yc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),MC=T.discriminatedUnion("type",[oy,Bo,Ho,Xo,Jo,Go,ay,CC,$C]),Ko=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),MC),terminals:T.record(T.string().min(1),NC),errors:Vc,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(Hc).optional(),outputs:T.array(Xc).optional(),triggers:T.array(Jc).optional(),read_only:T.boolean().optional(),requires:Kc}).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 DC,Vo,jC,PC,FC,Wt,Wn=w(()=>{"use strict";Un();DC=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Vo=z.string().regex(DC),jC=z.object({step_id:Vo,type:z.literal("main"),index:z.number().int().min(0)}),PC=z.record(Vo,z.record(z.string().min(1),z.array(z.array(jC)))),FC=z.object({id:Vo,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()}),Wt=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:Vc,inputs:z.array(Hc).optional(),outputs:z.array(Xc).optional(),steps:z.array(FC).min(1),connections:PC.default({}),entry_step_id:Vo,triggers:z.array(Jc).optional(),read_only:z.boolean().optional(),requires:Kc}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[d,c]of l.entries())r.has(c.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,d,"step_id"],message:`connection target does not reference an existing step: ${c.step_id}`})}})});function Yo(t){return Zc(t)}function Zc(t){if(Array.isArray(t))return t.map(Zc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Zc(e[n]);if(typeof r.type=="string"){let n=WC[r.type];n!==void 0&&(r.type=n)}return r}var zc,UC,WC,Qc=w(()=>{"use strict";zc="lmctl.builtin.",UC={Review:`${zc}Review`,Research:`${zc}Research`,Consolidate:`${zc}Consolidate`},WC=Object.fromEntries(Object.entries(UC).map(([t,e])=>[e,t]))});import{readFileSync as qC}from"node:fs";function cy(t){return BC(t)}function BC(t){let e=Yo(JC(t));if(XC(e),uy(e)===3)return HC(e);let r=Ko.safeParse(e);if(!r.success)throw new or({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=GC(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new or(n);return r.data}function HC(t){let e=Wt.safeParse(t);if(!e.success)throw new or({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function XC(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=uy(t);if(!(e===null||ly.includes(e)))throw new or({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ly.join(", ")}`}]})}function uy(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 JC(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
2135
2135
|
`)||e.startsWith("{")||e.startsWith("[")?dy(t,"$"):e.endsWith(".json")?dy(qC(e,"utf8"),e):t}function dy(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new or({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function GC(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"}),KC(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function KC(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 ly,or,fy=w(()=>{"use strict";Un();Wn();Qc();ly=[1,2,3],or=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 VC}from"node:crypto";function my(t,e){let r=YC(e),n=VC("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function YC(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var py=w(()=>{"use strict";Wn()});function QC(t,e){let r=ZC[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 yy(t){let e=[],r=(k,I)=>{throw new qn([{line:k,message:I}])},n=t.split(`
|
|
2136
|
-
`),s=[];for(let k=0;k<n.length;k+=1){let C=r$(n[k]).trim();C.length>0&&s.push({n:k+1,text:C})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,d=[],c=[],u=[],f,m={},p=new Map,h=new Map,_=new Map,g=(k,I,C,W,U,j)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:I,params:C,line:W,isTerminal:U,...j?{members:j}:{}}),c.push(k)},y=k=>{let I=[],C=k+1;for(;C<s.length;C+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(W===null)break;I.push({label:W[1],dst:W[2]})}return{branches:I,nextIdx:C-1}};for(let k=1;k<s.length;k+=1){let{n:I,text:C}=s[k],W=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){k!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let U=/^meta\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),j=Or(U[1],I,r);for(let te of Object.keys(j))hy.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...hy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(W==="step"){let U=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),j=U[1],te=U[2],Te=U[3],ue=_y[te];ue===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(_y).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:zt}=QC(ue,Or(Te,I,r));g(j,ue,Ae,I,!1,Object.keys(zt).length>0?zt:void 0);continue}if(W==="trigger"){let U=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),j=U[1],te=U[2],Te=U[3],ue=gy[te];ue===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(gy).join(", ")})`),p.has(j)&&r(I,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:ue,parameters:Or(Te,I,r)});continue}if(W==="mcp"||W==="skill"){let U=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??r(I,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${C}`),j=U[1],te=U[2].trim(),Te=W==="mcp"?h:_;Te.has(j)&&r(I,`duplicate ${W} declaration: ${j}`);let ue;if(te.startsWith("{")){let Ae=Or(te,I,r);W==="mcp"?ue={...Ae,name:j}:((typeof Ae.content!="string"||Ae.content.length===0)&&r(I,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ue={name:j,content:Ae.content})}else{let Ae=Ey(te);(typeof Ae!="string"||Ae.length===0)&&r(I,`\`${W} ${j}\`: string form must be a non-empty file path or http(s) URL`),ue=Ae}Te.set(j,ue);continue}if(W==="terminal"){let U=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(U[1],"lmctl/terminal",{name:U[2],kind:U[3]??"neutral"},I,!0);continue}if(W==="seq"){let j=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(j.length<3||j.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<j.length+1&&!(te+2>j.length-1);te+=2){let Te=j[te],ue=j[te+1],Ae=j[te+2],zt=ue==="->"?"main":ue.slice(1,-2);d.push({srcDeclId:Te,port:zt,dstDeclId:Ae,line:I})}continue}if(W==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Te,ue=k+1;for(;ue<s.length;ue+=1){let Ae=s[ue].text,zt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(zt!==null){Te!==void 0&&r(s[ue].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let _s=zt[2];te.push({when:zt[1].trim(),next:`@terminal:${_s}`}),d.push({srcDeclId:j,port:_s,dstDeclId:zt[3],line:s[ue].n});continue}let Ul=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(Ul!==null){Te!==void 0&&r(s[ue].n,`\`choice ${j}\` has more than one \`default\``);let _s=Ul[1];Te=`@terminal:${_s}`,d.push({srcDeclId:j,port:_s,dstDeclId:Ul[2],line:s[ue].n});continue}break}te.length===0&&r(I,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:te,...Te!==void 0?{default_next:Te}:{}},I,!1),k=ue-1;continue}if(W==="loop"){let U=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(U[1],"lmctl/loop",Or(U[2],I,r),I,!1);continue}if(W==="foreach"){let U=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),j=Or(U[2],I,r);"mode"in j&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(U[1],"lmctl/foreach",j,I,!1);continue}if(W==="call"){let U=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),j=U[1],te=Or(U[2],I,r),Te=te.workflow;(typeof Te!="string"||Te.length===0)&&r(I,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:ue,...Ae}=te;g(j,"lmctl/subflow",{workflow_name:Te,...Ae},I,!1),u.push({declId:j,target:Te,line:I});continue}if(W==="decide"){let U=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),j=U[1],te=Or(U[2],I,r),{branches:Te,nextIdx:ue}=y(k);Te.length===0&&r(I,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let Ae of Te)d.push({srcDeclId:j,port:Ae.label,dstDeclId:Ae.dst,line:I});k=ue;continue}if(W==="entry"){let U=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=U[1];continue}r(I,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}c.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=c[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=k=>{if(Array.isArray(k)){for(let C of k)E(C);return}if(typeof k!="object"||k===null)return;let I=k;if(typeof I.alias=="string")for(let[C,W]of[["mcp",h],["skills",_]]){let U=I[C];Array.isArray(U)&&(I[C]=U.map(j=>typeof j=="string"&&W.has(j)?structuredClone(W.get(j)):j))}for(let C of Object.values(I))E(C)};for(let k of c){let I=l.get(k);I.members!==void 0&&E(I.members)}let v=k=>my(o,k),b=c.map(k=>{let I=l.get(k);return{id:v(k),name:k,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let k of d){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let I=v(k.srcDeclId);x[I]??={},x[I][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[I][k.port]=[[{step_id:v(k.dstDeclId),type:"main",index:0}]]}for(let k of c){let I=l.get(k);e$.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let k of d){let I=H.get(k.srcDeclId);I===void 0?H.set(k.srcDeclId,[k.dstDeclId]):I.push(k.dstDeclId)}for(let k of c){let I=l.get(k);if(I.type!=="lmctl/loop")continue;let C=I.params.body;if(typeof C=="string"&&l.has(C)){let W=H.get(k);W===void 0?H.set(k,[C]):W.push(C)}}let F=new Set([f]),$=[f];for(;$.length>0;){let k=$.shift();for(let I of H.get(k)??[])F.has(I)||(F.add(I),$.push(I))}for(let k of c)F.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let R=new Map;for(let k of d){let I=R.get(k.srcDeclId);I===void 0&&(I=new Set,R.set(k.srcDeclId,I)),I.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of c){let I=l.get(k);if(I.isTerminal)continue;let C=R.get(k)??new Set;if(I.type==="lmctl/review"){let U=[...C].some(j=>!A.has(j));!C.has("approve")&&!U&&r(I.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let W=t$[I.type];if(W!==void 0)for(let U of W)C.has(U)||r(I.line,`uncovered outcome: required outcome \`${U}\` of step \`${k}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${k} -${U}-> <target|terminal>\`)`);else C.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${k}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of c){let I=l.get(k),C=zC[I.type];if(C===void 0)continue;let W={...I.params,...I.members??{},type:C.v2type,state_name:k,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},U=C.schema.safeParse(W);if(!U.success){let j=U.error.issues[0],te=j.path.length===0?"$":j.path.map(String).join(".");r(I.line,`step \`${k}\` (\`${I.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${j.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let Y={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:b,connections:x,entry_step_id:v(f)},B=Wt.safeParse(Y);if(!B.success)throw new qn(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 r$(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function Or(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let 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 n$(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]=Ey(l)}return s}function n$(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ey(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 zC,ZC,_y,qn,e$,t$,hy,gy,wy=w(()=>{"use strict";Wn();py();Un();zC={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Bo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Ho},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Xo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Jo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Go}},ZC={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};_y={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"},qn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2136
|
+
`),s=[];for(let k=0;k<n.length;k+=1){let C=r$(n[k]).trim();C.length>0&&s.push({n:k+1,text:C})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,d=[],c=[],u=[],f,m={},p=new Map,h=new Map,_=new Map,g=(k,I,C,W,U,j)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:I,params:C,line:W,isTerminal:U,...j?{members:j}:{}}),c.push(k)},y=k=>{let I=[],C=k+1;for(;C<s.length;C+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(W===null)break;I.push({label:W[1],dst:W[2]})}return{branches:I,nextIdx:C-1}};for(let k=1;k<s.length;k+=1){let{n:I,text:C}=s[k],W=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){k!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let U=/^meta\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),j=Cr(U[1],I,r);for(let re of Object.keys(j))hy.has(re)||r(I,`unknown \`meta\` key \`${re}\` \u2014 only workflow-level runtime metadata is allowed: ${[...hy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(W==="step"){let U=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),j=U[1],re=U[2],Te=U[3],ue=_y[re];ue===void 0&&r(I,`unknown step type: ${re} (supported \`step\` archetypes: ${Object.keys(_y).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:zt}=QC(ue,Cr(Te,I,r));g(j,ue,Ae,I,!1,Object.keys(zt).length>0?zt:void 0);continue}if(W==="trigger"){let U=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),j=U[1],re=U[2],Te=U[3],ue=gy[re];ue===void 0&&r(I,`unknown trigger type: ${re} (registered trigger archetypes: ${Object.keys(gy).join(", ")})`),p.has(j)&&r(I,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:ue,parameters:Cr(Te,I,r)});continue}if(W==="mcp"||W==="skill"){let U=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??r(I,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${C}`),j=U[1],re=U[2].trim(),Te=W==="mcp"?h:_;Te.has(j)&&r(I,`duplicate ${W} declaration: ${j}`);let ue;if(re.startsWith("{")){let Ae=Cr(re,I,r);W==="mcp"?ue={...Ae,name:j}:((typeof Ae.content!="string"||Ae.content.length===0)&&r(I,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ue={name:j,content:Ae.content})}else{let Ae=Ey(re);(typeof Ae!="string"||Ae.length===0)&&r(I,`\`${W} ${j}\`: string form must be a non-empty file path or http(s) URL`),ue=Ae}Te.set(j,ue);continue}if(W==="terminal"){let U=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(U[1],"lmctl/terminal",{name:U[2],kind:U[3]??"neutral"},I,!0);continue}if(W==="seq"){let j=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(re=>re.trim()).filter(re=>re.length>0);(j.length<3||j.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let re=0;re+2<j.length+1&&!(re+2>j.length-1);re+=2){let Te=j[re],ue=j[re+1],Ae=j[re+2],zt=ue==="->"?"main":ue.slice(1,-2);d.push({srcDeclId:Te,port:zt,dstDeclId:Ae,line:I})}continue}if(W==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],re=[],Te,ue=k+1;for(;ue<s.length;ue+=1){let Ae=s[ue].text,zt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(zt!==null){Te!==void 0&&r(s[ue].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let _s=zt[2];re.push({when:zt[1].trim(),next:`@terminal:${_s}`}),d.push({srcDeclId:j,port:_s,dstDeclId:zt[3],line:s[ue].n});continue}let Ul=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(Ul!==null){Te!==void 0&&r(s[ue].n,`\`choice ${j}\` has more than one \`default\``);let _s=Ul[1];Te=`@terminal:${_s}`,d.push({srcDeclId:j,port:_s,dstDeclId:Ul[2],line:s[ue].n});continue}break}re.length===0&&r(I,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:re,...Te!==void 0?{default_next:Te}:{}},I,!1),k=ue-1;continue}if(W==="loop"){let U=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(U[1],"lmctl/loop",Cr(U[2],I,r),I,!1);continue}if(W==="foreach"){let U=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),j=Cr(U[2],I,r);"mode"in j&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(U[1],"lmctl/foreach",j,I,!1);continue}if(W==="call"){let U=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),j=U[1],re=Cr(U[2],I,r),Te=re.workflow;(typeof Te!="string"||Te.length===0)&&r(I,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:ue,...Ae}=re;g(j,"lmctl/subflow",{workflow_name:Te,...Ae},I,!1),u.push({declId:j,target:Te,line:I});continue}if(W==="decide"){let U=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),j=U[1],re=Cr(U[2],I,r),{branches:Te,nextIdx:ue}=y(k);Te.length===0&&r(I,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:re});for(let Ae of Te)d.push({srcDeclId:j,port:Ae.label,dstDeclId:Ae.dst,line:I});k=ue;continue}if(W==="entry"){let U=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=U[1];continue}r(I,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}c.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=c[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=k=>{if(Array.isArray(k)){for(let C of k)E(C);return}if(typeof k!="object"||k===null)return;let I=k;if(typeof I.alias=="string")for(let[C,W]of[["mcp",h],["skills",_]]){let U=I[C];Array.isArray(U)&&(I[C]=U.map(j=>typeof j=="string"&&W.has(j)?structuredClone(W.get(j)):j))}for(let C of Object.values(I))E(C)};for(let k of c){let I=l.get(k);I.members!==void 0&&E(I.members)}let v=k=>my(o,k),b=c.map(k=>{let I=l.get(k);return{id:v(k),name:k,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let k of d){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let I=v(k.srcDeclId);x[I]??={},x[I][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[I][k.port]=[[{step_id:v(k.dstDeclId),type:"main",index:0}]]}for(let k of c){let I=l.get(k);e$.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let k of d){let I=H.get(k.srcDeclId);I===void 0?H.set(k.srcDeclId,[k.dstDeclId]):I.push(k.dstDeclId)}for(let k of c){let I=l.get(k);if(I.type!=="lmctl/loop")continue;let C=I.params.body;if(typeof C=="string"&&l.has(C)){let W=H.get(k);W===void 0?H.set(k,[C]):W.push(C)}}let F=new Set([f]),$=[f];for(;$.length>0;){let k=$.shift();for(let I of H.get(k)??[])F.has(I)||(F.add(I),$.push(I))}for(let k of c)F.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let R=new Map;for(let k of d){let I=R.get(k.srcDeclId);I===void 0&&(I=new Set,R.set(k.srcDeclId,I)),I.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of c){let I=l.get(k);if(I.isTerminal)continue;let C=R.get(k)??new Set;if(I.type==="lmctl/review"){let U=[...C].some(j=>!A.has(j));!C.has("approve")&&!U&&r(I.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let W=t$[I.type];if(W!==void 0)for(let U of W)C.has(U)||r(I.line,`uncovered outcome: required outcome \`${U}\` of step \`${k}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${k} -${U}-> <target|terminal>\`)`);else C.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${k}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of c){let I=l.get(k),C=zC[I.type];if(C===void 0)continue;let W={...I.params,...I.members??{},type:C.v2type,state_name:k,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},U=C.schema.safeParse(W);if(!U.success){let j=U.error.issues[0],re=j.path.length===0?"$":j.path.map(String).join(".");r(I.line,`step \`${k}\` (\`${I.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${re}\`: ${j.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let Y={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:b,connections:x,entry_step_id:v(f)},B=Wt.safeParse(Y);if(!B.success)throw new qn(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 r$(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 Cr(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 n$(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]=Ey(l)}return s}function n$(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Ey(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 zC,ZC,_y,qn,e$,t$,hy,gy,wy=w(()=>{"use strict";Wn();py();Un();zC={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Bo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Ho},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Xo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Jo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Go}},ZC={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};_y={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"},qn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
2137
2137
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
2138
2138
|
`)}`),this.issues=e,this.name="DslCompileError"}},e$=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"]),t$={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},hy=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),gy={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as s$}from"node:fs";function i$(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function o$(t){for(let e of t.split(`
|
|
2139
2139
|
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Tt(t){if(typeof t=="string"&&i$()&&o$(t)){let r;try{r=yy(t)}catch(s){throw s instanceof qn?new ar(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=Wt.safeParse(r);if(!n.success)throw new ar(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Yo(l$(t));if(d$(e)&&e.definition_schema_version===3){let r=Wt.safeParse(e);if(!r.success)throw new ar(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return a$(e)}function a$(t){let e=Ko.safeParse(t);if(!e.success)throw new ar(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 ar([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return cy(r)}catch(s){throw s instanceof or?new eu(s):s}}function l$(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
@@ -2151,7 +2151,7 @@ description: ${n}`:"",o=`---
|
|
|
2151
2151
|
name: ${e}${i}
|
|
2152
2152
|
type: ${r}
|
|
2153
2153
|
---
|
|
2154
|
-
${s}`;Y$(t,o,"utf8")}function Q$(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 eM(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?tM(t.path):rM(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function tM(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function rM(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var sa,ia,By,Gy=w(()=>{"use strict";ir();qy();pu();sa=["user","feedback","project","reference"],ia=new Set(["smoke","integration","vision","scenario","regression"]),By="operator"});function
|
|
2154
|
+
${s}`;Y$(t,o,"utf8")}function Q$(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 eM(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?tM(t.path):rM(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function tM(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function rM(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var sa,ia,By,Gy=w(()=>{"use strict";ir();qy();pu();sa=["user","feedback","project","reference"],ia=new Set(["smoke","integration","vision","scenario","regression"]),By="operator"});function Ue(t,e){return`<!doctype html>
|
|
2155
2155
|
<html lang="en">
|
|
2156
2156
|
<head>
|
|
2157
2157
|
<meta charset="utf-8">
|
|
@@ -2223,36 +2223,36 @@ ${s}`;Y$(t,o,"utf8")}function Q$(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2223
2223
|
`).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function lE(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 dE(t,e){if(e.length===0)return null;let r=aE(t,"durable-memory");if(!EM(r))return null;let n;try{n=wM(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=TM(aE(r,i),"utf8");if(vM(o).some(l=>e.includes(l))){let l=lE(o,"name")??i.replace(".md",""),d=lE(o,"description");s.push(d?`${l} (${d})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var cE=w(()=>{"use strict"});function bu(t){let e=t.trim().replace(SM,"").trim();for(let r=0;r<4;r+=1){let n=bM.exec(e);if(n===null)break;e=n[2].trim()}return e}function uE(t){let e=t.trim(),r=kM.exec(e);if(r!==null)return r[2];let n=IM.exec(e);return n!==null?n[0]:null}function Qs(t,e){let r=t.split(`
|
|
2224
2224
|
`),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=bu(r[o]),l=vu.exec(a);if(l===null)continue;let d=l[1].trim();if(Su.test(d))continue;let c=uE(d);c!==null&&(n=c,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=bu(r[o]),l=vu.exec(a);if(l===null)break;let d=Su.exec(l[1].trim());if(d===null)break;i[d[1]]=d[2].trim()}return{outcome:n,evidence:i}}function fE(t){let e=t.split(`
|
|
2225
2225
|
`),r=null;for(let n=0;n<e.length;n+=1){let s=bu(e[n]),i=vu.exec(s);if(i===null)continue;let o=i[1].trim();if(Su.test(o))continue;let a=uE(o);if(a===null||!In(a))continue;let d=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:d}}return r}var SM,bM,vu,Su,kM,IM,ku=w(()=>{"use strict";Ns();SM=/^#{1,6}\s+/,bM=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,vu=/^STANCE:\s+(.+)$/,Su=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,kM=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,IM=/^[A-Za-z0-9_-]+/});function mE(t,e,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),d=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let c=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:c.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:null})}}var pE=w(()=>{"use strict"});import{readFileSync as NM}from"node:fs";import{dirname as AM,join as xM}from"node:path";import{fileURLToPath as RM}from"node:url";function CM(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function jM(t){let e=[],r=[];for(let n of t)LM.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function PM(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&OM.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,d)=>s[d]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function FM(t,e){if(t.length===0)return{matched:!1};let r=jM(t);for(let n of r){let s=PM(n,e);if(s.matched)return s}return{matched:!1}}function Iu(t){return FM(t,DM)}function UM(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 Nu(t){return UM(t).split(" ").filter(e=>e.length>0)}var LM,OM,$M,MM,DM,_E=w(()=>{"use strict";LM=new Set(["&&","||",";","|",">",">>","<","<<"]),OM=/^[A-Za-z_][A-Za-z0-9_]*=/;$M=AM(RM(import.meta.url)),MM=JSON.parse(NM(xM($M,"side_effect_classifier.json"),"utf-8")),DM=CM(MM)});function ca(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 hE(t,e){try{return await rn(Au(t)??t,ca(e))===!0}catch{return!1}}async function ua(t,e){try{return await rn(Au(t)??t,ca(e))}catch{return}}async function gE(t,e){if(typeof t!="string")return t;let r=Au(t);if(r===null)return t;try{return await rn(r,ca(e))}catch{return}}async function yE(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+=WM(await rn(a,ca(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 WM(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var ei=w(()=>{"use strict";Xs()});import{existsSync as EE,readdirSync as wE,readFileSync as qM,statSync as TE}from"node:fs";import{join as ma}from"node:path";function vE(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function J(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function G(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function ft(t,e,r,n,s={}){let i=M(),o=J(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,`${ti}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=In(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Gi,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:BM(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function BM(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
2226
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function
|
|
2226
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function V(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 SE(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=$r(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function st(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=$r(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=$r(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=HM(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return yE(n,e)}function HM(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 $r(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 ri(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=mE(e.dal,e.run_id,()=>i),d=xu(e,r),c={violation:null},u=y=>{if(l(y),c.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let E=Nu(y.summary),v=Iu(E);v.matched&&!d&&(c.violation={summary:y.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{u(y),XM(y,(E,v)=>{m+=E,p+=v})},_=await So({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Qe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:_.ms})}),JM(e.project,e.dal,f);let g=c.violation;return g!==null?{kind:"g3_violation",summary:g.summary,violationKind:g.kind}:!a&&e.project.local_path.trim().length>0&&Ru(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:_.text,ms:_.ms,argv:_.argv}}function XM(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=fa(s.input_tokens),a=fa(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=fa(i.input_tokens),a=fa(i.output_tokens);(o>0||a>0)&&e(o,a)}}function fa(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function lr(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=J(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ri({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let d=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,d?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Xn(t,e,r,n,s,i,o,a=!1,l){let d=t.membersByAlias.get(r.alias);if(d===void 0||d.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let c=J(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];d.prompt_snapshot!==null&&d.prompt_snapshot.length>0&&u.push(d.prompt_snapshot),i&&u.push(g_(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await st(r.prompt_template,t,e):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
|
|
2227
2227
|
|
|
2228
2228
|
`);try{let p=await ri({context:t,stateId:e,member:d,prompt:m,stepId:c.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let _=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(c.id,null,_),{outcome:null,text:"",status_detail:_}}if(t.dal.insertStepArtifact({step_id:c.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(c.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=Qs(p.text,s);return t.dal.finishStep(c.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Re?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(c.id,null,h),{outcome:null,text:"",status_detail:h}}}function Jn(t,e){return(e?.length??0)>0?dE(t.project.local_path,e):null}function bE(t){return Iu(Nu(t))}function xu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
2229
2229
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
2230
2230
|
ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Ru(t,e){if(!EE(t))return!1;let r=ma(t,"durable-memory");function n(s){let i;try{i=wE(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=ma(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(TE(a).mtime>e)return!0}catch{}}return!1}return n(t)}function JM(t,e,r){let n=ma(t.local_path,"durable-memory");if(!EE(n))return;let s;try{s=wE(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=ma(n,i),a;try{a=TE(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=qM(o,"utf8")}catch{continue}let d=KM(l);if(d===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
|
|
2231
|
-
`),D({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:d.type,name:d.name,description:d.description,body:d.body})}catch{}}}function KM(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||!GM.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var ti,GM,tt=w(()=>{"use strict";dt();Un();bo();cE();ku();Ns();pE();pe();_E();ei();ti="__paused__:";GM=new Set(["user","feedback","project","reference"])});import{spawnSync as kE}from"node:child_process";function VM(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=kE("git",["diff","--quiet"],{cwd:i}).status!==0,a=kE("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),
|
|
2231
|
+
`),D({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:d.type,name:d.name,description:d.description,body:d.body})}catch{}}}function KM(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||!GM.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var ti,GM,tt=w(()=>{"use strict";dt();Un();bo();cE();ku();Ns();pE();pe();_E();ei();ti="__paused__:";GM=new Set(["user","feedback","project","reference"])});import{spawnSync as kE}from"node:child_process";function VM(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=kE("git",["diff","--quiet"],{cwd:i}).status!==0,a=kE("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),V(t,r,n,Gc),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),V(t,r,n,"clean"),G(t.workflow,e.next)}var IE,NE=w(()=>{"use strict";tt();IE={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=>VM(t,t.state)}});async function YM(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await hE(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),V(t,r,n,"matched"),G(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),V(t,r,n,"no_match"),e.default_next!==void 0?G(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var AE,xE=w(()=>{"use strict";tt();ei();AE={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=>YM(t,t.state)}});async function zM(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=Jn(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,_=await Xn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);_.text.length>0&&(a[p]=_.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
|
|
2232
2232
|
${m}`:null).filter(m=>m!==null).join(`
|
|
2233
2233
|
|
|
2234
|
-
`),d=`${n}:consolidator`,c=await Xn(t,d,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,c.outcome===null||c.outcome==="error"){t.dal.finishStep(u.id,c.outcome,c.status_detail),c.outcome==="error"&&
|
|
2234
|
+
`),d=`${n}:consolidator`,c=await Xn(t,d,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,c.outcome===null||c.outcome==="error"){t.dal.finishStep(u.id,c.outcome,c.status_detail),c.outcome==="error"&&V(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?G(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:c.text}),t.dal.finishStep(u.id,"ok","consolidated"),V(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await lr(t,n,m,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.ok)}var RE,LE=w(()=>{"use strict";tt();RE={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=>zM(t,t.state)}});async function ZM(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await ua(e.items_from,t),a=rD(o);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},d=e.mode==="parallel"?await eD(t,e,s.id,a,l):await QM(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let c=d.some(f=>f.outcome===null||f.outcome==="__failure__"),u=c?"any_failed":"all_ok";if(t.dal.finishStep(s.id,u,JSON.stringify({iterations:d,count:a.length})),V(t,r,n,u),c){let f=e.outcomes.any_failed;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}return G(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function QM(t,e,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await CE(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 eD(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 CE(t,e,r,n[l],l,s)}});return await Promise.all(a),i}async function CE(t,e,r,n,s,i){let o=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let c=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":tD(t.outcomes[a]);return t.emit_progress?.({kind:c===null||c==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:c}}),{index:s,value:n,outcome:c}}function tD(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function rD(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 OE,$E=w(()=>{"use strict";tt();ei();OE={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=>ZM(t,t.state)}});async function nD(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:Z(t.workflow)}}let o=Jn(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 lr(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),V(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?G(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ri({context:t,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),V(t,r,n,"done"),e.write_back_durable_memory&&await lr(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(ME({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Re?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}}return{kind:"paused"}}let l=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),c=await st(e.agent.initial_prompt_template,t,n),u=o?`${o}
|
|
2235
2235
|
|
|
2236
|
-
${c}`:c;try{let f=await ri({context:t,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(d.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await lr(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(ME({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Re?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function ME(t){let{context:e,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=t,a=M();e.dal.setRunPausedState(e.run_id,`${ti}${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(sD({context:e,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function sD(t){let{context:e,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=iD(e,r),d={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:d,transcript_tail:oD(i,3),paused_at:o,created_run_inputs
|
|
2236
|
+
${c}`:c;try{let f=await ri({context:t,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(d.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await lr(t,n,i,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(ME({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Re?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function ME(t){let{context:e,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=t,a=M();e.dal.setRunPausedState(e.run_id,`${ti}${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(sD({context:e,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function sD(t){let{context:e,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=iD(e,r),d={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:d,transcript_tail:oD(i,3),paused_at:o,created_run_inputs:$r(e.job.payload)}}function iD(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 oD(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 DE,jE=w(()=>{"use strict";bo();tt();DE={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=>nD(t,t.state)}});async function aD(t,e){let r=t.stateId,n=t.displayName,s=SE(t,e.over);if(s===null){let u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let u=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(u.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:Z(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=t.iteration;t.iteration={item:f,index:u};let h;try{h=await t.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let _=lD(t.outcomes[m]);if(a.push({index:u,value:f,outcome:_}),_===null&&e.stop_on_error){l=!0;break}}let d=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=l?"error":"ok";if(t.dal.finishStep(d.id,c,JSON.stringify({iterations:a,count:o.length})),V(t,r,n,c),l){let u=e.outcomes.error;return u!==void 0?G(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}return G(t.workflow,e.outcomes.ok)}function lD(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var PE,FE=w(()=>{"use strict";tt();PE={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>aD(t,t.state)}});import{createHash as dD}from"node:crypto";import{existsSync as cD,mkdirSync as uD,readFileSync as fD,writeFileSync as mD}from"node:fs";import{dirname as pD,isAbsolute as WE,normalize as _D,resolve as ni}from"node:path";import{Document as hD,ExternalHyperlink as gD,HeadingLevel as Gn,LevelFormat as yD,Packer as ED,Paragraph as kt,Table as wD,TableCell as TD,TableRow as vD,TextRun as It,WidthType as SD}from"docx";import{marked as bD}from"marked";async function kD(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await ID(t,e,n),o=await ND(t,e),a=await AD(t,e.title),l=await CD(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return uD(pD(o),{recursive:!0}),mD(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:dD("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),V(t,r,n,{output_path:o,path:o,bytes:l.length}),G(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),V(t,r,n,{error:o}),G(t.workflow,e.outcomes?.error??"@terminal:error")}}async function ID(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await st(e.markdown_source,t,r)).trim(),i=(n.length===0?OD(t,e.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=RD(t.project.local_path,i);if(o!==null){if(!cD(o))throw new Error(`markdown_source file not found: ${o}`);return pa(fD(o,"utf8"))}return pa(i)}async function ND(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await st(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=xD(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function AD(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await st(e,t,t.stateId)).trim();return r.length===0?null:r}function xD(t,e){let r=ni(t);return _D(WE(e)?ni(e):ni(r,e))}function RD(t,e){return LD(e)?WE(e)?ni(e):ni(t,e):null}function LD(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function OD(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 pa(s);let i=t.dal.query(`SELECT sa.content
|
|
2237
2237
|
FROM step_artifact sa
|
|
2238
2238
|
JOIN step s ON s.id = sa.step_id
|
|
2239
2239
|
WHERE s.run_id = ?
|
|
2240
2240
|
AND s.state_name LIKE ?
|
|
2241
2241
|
AND sa.content IS NOT NULL
|
|
2242
2242
|
ORDER BY sa.id DESC
|
|
2243
|
-
LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:pa(i[0].content)}function pa(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function CD(t,e){let r=BE(bD.lexer(t,{gfm:!0})),n=new hD({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:yD.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new kt("")]:r}]});return ED.toBuffer(n)}function BE(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new kt({heading:UD(r.depth),children:Mr(
|
|
2244
|
-
`).map(r=>new kt({children:[new It({text:r.length===0?" ":r,font:"Courier New"})]}))}function
|
|
2245
|
-
${a}`:null,d,l,s,e.writes_to_project_path===!0,i);if(l){let _=fE(p.text);if(_!==null){let g=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),E=Qs(p.text,y);if(E.outcome===null){let b=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(b.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let v=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,E.outcome,"outcomes_from_stance"),
|
|
2246
|
-
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(_=>_.outcome==="approve")){let _=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve",`loop=${f}`),
|
|
2243
|
+
LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:pa(i[0].content)}function pa(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function CD(t,e){let r=BE(bD.lexer(t,{gfm:!0})),n=new hD({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:yD.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new kt("")]:r}]});return ED.toBuffer(n)}function BE(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new kt({heading:UD(r.depth),children:Dr(Mr(r))}));break;case"paragraph":e.push(new kt({children:Dr(Mr(r))}));break;case"text":e.push(new kt({children:Mr(r).length===0?[new It(r.text)]:Dr(Mr(r))}));break;case"blockquote":e.push(...BE(Mr(r)).map(n=>n instanceof kt?n:new kt({children:[new It(r.text)]})));break;case"list":jD(r)&&e.push(...$D(r));break;case"table":PD(r)&&e.push(MD(r));break;case"code":FD(r)&&e.push(...DD(r));break;case"hr":e.push(new kt(""));break;case"html":r.text.trim().length>0&&e.push(new kt({children:[new It(r.text)]}));break;default:break}return e}function Dr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new It({text:n.text,...Lu(e)}));break;case"strong":r.push(...Dr(Mr(n),{...e,bold:!0}));break;case"em":r.push(...Dr(Mr(n),{...e,italics:!0}));break;case"codespan":r.push(new It({text:n.text,...Lu({...e,code:!0})}));break;case"link":r.push(new gD({link:n.href,children:Dr(Mr(n),{...e})}));break;case"br":r.push(new It({text:"",break:1}));break;case"image":r.push(new It({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new It({text:n.text,strike:!0}));break;default:r.push(new It({text:n.raw,...Lu(e)}));break}return r.length===0?[new It("")]:r}function Lu(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function $D(t){return t.items.map(e=>new kt({children:Dr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:UE(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:UE(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function UE(t){return t.task?`[${t.checked?"x":" "}] `:""}function MD(t){let e=[t.header,...t.rows].map(r=>new vD({children:r.map(n=>new TD({children:[new kt({children:Dr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new wD({width:{size:100,type:SD.PERCENTAGE},rows:e})}function DD(t){return t.text.split(`
|
|
2244
|
+
`).map(r=>new kt({children:[new It({text:r.length===0?" ":r,font:"Courier New"})]}))}function Mr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function jD(t){return t.type==="list"&&Array.isArray(t.items)}function PD(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function FD(t){return t.type==="code"&&typeof t.text=="string"}function UD(t){switch(t){case 1:return Gn.HEADING_1;case 2:return Gn.HEADING_2;case 3:return Gn.HEADING_3;case 4:return Gn.HEADING_4;case 5:return Gn.HEADING_5;default:return Gn.HEADING_6}}var qE,HE=w(()=>{"use strict";tt();qE={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=>kD(t,t.state)}});import{createHash as WD}from"node:crypto";import{existsSync as qD,mkdirSync as BD,readFileSync as XE,statSync as HD}from"node:fs";import{dirname as XD,isAbsolute as JE,normalize as JD,resolve as si}from"node:path";import{marked as GD}from"marked";import KD from"write-excel-file/node";async function VD(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await YD(t,e),o=zD(e.input_format),a=await ZD(t,e),l=await QD(t,e.title),d=o==="markdown"?lj(i):nj(i);await dj({sheets:d.length===0?[{name:"Sheet1",headers:[],rows:[]}]:d,outputPath:a,title:l??t.workflow.name});let c=HD(a).size;if(c===0)throw new Error("rendered XLSX file was empty");let u=WD("sha256").update(XE(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),V(t,r,n,{output_path:a,path:a,bytes:c}),G(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),V(t,r,n,{error:o}),G(t.workflow,e.outcomes?.error??"@terminal:error")}}async function YD(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await st(e.source,t,t.stateId)).trim(),n=tj(t.project.local_path,r);if(n!==null){if(!qD(n))throw new Error(`source file not found: ${n}`);return XE(n,"utf8")}return r}function zD(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function ZD(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await st(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=ej(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function QD(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await st(e,t,t.stateId)).trim();return r.length===0?null:r}function ej(t,e){let r=si(t);return JD(JE(e)?si(e):si(r,e))}function tj(t,e){return rj(e)?JE(e)?si(e):si(t,e):null}function rj(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function nj(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(!_a(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>sj(r,n))}function sj(t,e){if(!_a(t))throw new Error(`sheets[${e}] must be an object`);let r=ij(t.headers,`sheets[${e}].headers`),n=oj(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:aj(t.styles)}}function ij(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 oj(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 aj(t){if(!_a(t)||!_a(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 lj(t){let e=GD.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(hj(s)){n=s.text;continue}gj(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 dj(t){BD(XD(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:mj(n.name,e),data:cj(n),columns:fj(n)}));await KD(r).toFile(t.outputPath)}function cj(t){let e=[];if(t.headers.length>0){let r=_j(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(uj));return e.length===0?[[{}]]:e}function uj(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 fj(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 mj(t,e){let r=pj(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 pj(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function _j(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 hj(t){return t.type==="heading"&&typeof t.text=="string"}function gj(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function _a(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var GE,KE=w(()=>{"use strict";tt();GE={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=>VD(t,t.state)}});import{spawnSync as yj}from"node:child_process";async function wj(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(yj("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),V(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?G(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let i=Jn(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,d=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await Xn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
2245
|
+
${a}`:null,d,l,s,e.writes_to_project_path===!0,i);if(l){let _=fE(p.text);if(_!==null){let g=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),E=Qs(p.text,y);if(E.outcome===null){let b=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(b.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let v=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,E.outcome,"outcomes_from_stance"),V(t,r,n,E.outcome),G(t.workflow,e.outcomes_from_stance[E.outcome])}let _=Qs(p.text,Ej);if(_.outcome!==null){let y=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,_.outcome,"default_failure_stance"),V(t,r,n,_.outcome),{kind:"escalate",token:_.outcome,reason:`failure_stance:${_.outcome}`}}let g=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve","no_reviewers"),V(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await lr(t,n,y,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(_=>Xn(t,`${n}:reviewer_${_.alias}[${f}]`,_,`CODER OUTPUT:
|
|
2246
|
+
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(_=>_.outcome==="approve")){let _=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve",`loop=${f}`),V(t,r,n,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await lr(t,n,g,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}if(a=h.filter(_=>_.outcome==="request_changes").map(_=>_.text).join(`
|
|
2247
2247
|
|
|
2248
|
-
`),e.loop_feedback_artifact!==void 0){let _=J(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(c.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?G(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}var Ej,VE,YE=w(()=>{"use strict";ku();tt();Ej=["blocked","failed","aborted"],VE={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=>wj(t,t.state)}});import{spawnSync as Tj}from"node:child_process";async function vj(t,e){let r=t.stateId,n=t.displayName,s=await st(e.command,t,n),i=xu(t,n),o=bE(s);if(o.matched&&!i){let h=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,d=Tj("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof d.stderr=="string"?d.stderr:"",f=d.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:d.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),d.status===null)return l?(t.dal.finishStep(c.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(c.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ru(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(c.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=d.stdout??"";t.dal.insertStepArtifact({step_id:c.id,kind:e.capture_output_to,content:h})}let m=String(d.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:c.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(c.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(c.id,m,`exit=${d.status}`),K(t,r,n,m),G(t.workflow,p))}var zE,ZE=w(()=>{"use strict";tt();zE={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=>vj(t,t.state)}});async function Sj(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let 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=Tt(i.definition),a=await bj(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let d=l.terminal_state;if(d===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};K(t,r,n,kj(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,d,`child_run=${l.run_id}`);let c=e.outcomes[d]??e.outcomes.default;return c===void 0?{kind:"terminal",terminal:Z(t.workflow)}:G(t.workflow,c)}async function bj(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await gE(s,t);r[n]=i===s?await ua(s,t):i}return r}function kj(t,e,r){let n={};for(let s of r)n[s.name]=Ij(t,e,s);return n}function Ij(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=Nj(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 Nj(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var QE,ew=w(()=>{"use strict";Gs();tt();ei();QE={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>Sj(t,t.state)}});function Aj(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=J(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 tw,rw=w(()=>{"use strict";tt();tw={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=>Aj(t,t.state)}});async function xj(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=Rj(t.cursor),a=i.filter(Lj).filter(d=>d.id>o);if(a.length===0)return null;let l=Math.max(...a.map(d=>d.id));return{main:a.map(d=>({trigger_id:t.trigger_id,issue_id:d.id,issue_number:d.number,issue_url:d.html_url,title:d.title,cursor:String(l)}))}}function Rj(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function Lj(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 nw,sw=w(()=>{"use strict";nw={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=>xj(t)}});async function Oj(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 iw,ow=w(()=>{"use strict";iw={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=>Oj(t)}});function aw(t){t.register(IE),t.register(VE),t.register(RE),t.register(DE),t.register(PE),t.register(qE),t.register(GE),t.register(zE),t.register(AE),t.register(OE),t.register(QE),t.register(tw),t.register(iw),t.register(nw)}var lw=w(()=>{"use strict";NE();xE();LE();$E();jE();FE();HE();KE();YE();ZE();ew();rw();sw();ow()});function dw(){return ha===null&&(ha=new Ou,aw(ha)),ha}var Cj,Ou,ha,cw=w(()=>{"use strict";lw();Cj={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"},Ou=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:Cj[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ha=null});async function mw(t){yw(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=Mj(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ii(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=iE(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let d=new Map(t.members.map(m=>[m.alias,m]));if(ii(n)){let m=Cu({dal:t.dal,workflow:ya(n),job:t.job,project:r,run:o,membersByAlias:d,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:Cr(t.job.payload)??{},team_id:t.team.id}),p=await _w(n,m,o.current_state??n.entry_step_id);return fw(t.dal,r.id,o.id,n.name,p),p}let c=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Cu({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:d,outcomes:c,inputs:Cr(t.job.payload)??{},team_id:t.team.id}),f=await pw(u,o.current_state??n.start_at);return fw(t.dal,r.id,o.id,n.name,f),f}function fw(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let c=t.getRun(r);if(c!==null){let u=t.getWorkflow(c.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let g=_.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let d=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:d,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function Cu(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 $u(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{yw(n);let i=ii(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=Cu({dal:t.dal,workflow:ii(n)?ya(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ii(n)?_w(n,a,o.current_state??n.entry_step_id):pw(a,o.current_state??n.start_at)}};return e}async function pw(t,e){let r=e;if(r.startsWith(ti))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 dr(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=ga(t,Z(t.workflow));if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ge(t);if(l.kind==="terminal")return dr(t,l.terminal);r=l.state;continue}let o,a=gw(t,r);if(a!==null){let l=J(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===Is)return dr(t,ad);let d=i.outcomes?.[a];o=d!==void 0?G(t.workflow,d):ft(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await $u(t,r,i);if(o.kind==="paused")return Ge(t);if(o.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},o.token,o.reason),Ge(t);if(o.kind==="terminal"){let l=ga(t,o.terminal);if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},l.token,l.reason),Ge(t);if(l.kind==="terminal")return dr(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=ga(t,Z(t.workflow));return n.kind==="terminal"?dr(t,n.terminal):dr(t,Z(t.workflow))}async function _w(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return ft(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ge(e);let l=gw(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===Is)return dr(e,ad);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ge(e);i=h;continue}let d=await $j(e,t,a);if(d.kind==="paused")return Ge(e);let c=Object.keys(t.connections[a.id]??{});if(d.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},d.token,d.reason,{declared_outcomes:c}),Ge(e);let u=d.kind==="terminal"?d.terminal:d.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=ya(t,a);try{let p=ga(e,u);if(p.kind==="paused")return Ge(e);if(p.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ge(e);if(p.kind==="terminal")return dr(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ge(e);i=h.id;continue}finally{e.workflow=m}}if(In(u))return ft(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);let f=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),dr(e,"aborted")}async function $j(t,e,r){let n=hw(e,r),s=t.workflow;t.workflow=ya(e,r);try{return await $u(t,r.id,n,r.name)}finally{t.workflow=s}}function hw(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 $u(t,e,r,n){let s=dw().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?Pj(t,s):void 0,t.progress_step_id=null;try{return await s.execute(vE(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function Mj(t,e){try{let r=JSON.parse(t);if(jj(r)&&r.definition_schema_version===3)return Wt.parse(r)}catch{return e}return e}function ii(t){return t.definition_schema_version===3}function ya(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]=hw(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:Dj(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 Dj(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pj(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 dr(t,e){t.dal.setRunTerminalState(t.run_id,e);try{tE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ge(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function gw(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 ga(t,e){if(!Fj(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&&Uj(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function Fj(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function Uj(t,e,r){let n=Wj(t),s=r.capture_evidence&&n!==null?qj(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 Wj(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 qj(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 yw(t){if(!uw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${uw.join(", ")}`)}var uw,Ew=w(()=>{"use strict";Wn();rE();oE();tt();cw();Ns();uw=[1,2,3]});import{readFileSync as Bj,readdirSync as Hj}from"node:fs";import{basename as Xj,join as Jj,resolve as Gj}from"node:path";function vw(t={}){let e=Gj(t.workflowsDir??"workflows"),r=Hj(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=>Kj(Jj(e,n)))}}function Kj(t){let e=Xj(t);try{let r=Bj(t,"utf8"),n=Tt(r);return kw(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:Iw(r)}}}function Sw(t,e){try{let r=Tt(e);return kw(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:Iw(r)}}}function bw(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(`
|
|
2248
|
+
`),e.loop_feedback_artifact!==void 0){let _=J(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(c.id,"max_loops_exceeded",`loops=${e.max_loops}`),V(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?G(t.workflow,u):{kind:"terminal",terminal:Z(t.workflow)}}var Ej,VE,YE=w(()=>{"use strict";ku();tt();Ej=["blocked","failed","aborted"],VE={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=>wj(t,t.state)}});import{spawnSync as Tj}from"node:child_process";async function vj(t,e){let r=t.stateId,n=t.displayName,s=await st(e.command,t,n),i=xu(t,n),o=bE(s);if(o.matched&&!i){let h=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,d=Tj("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof d.stderr=="string"?d.stderr:"",f=d.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:d.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),d.status===null)return l?(t.dal.finishStep(c.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(c.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Ru(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(c.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=d.stdout??"";t.dal.insertStepArtifact({step_id:c.id,kind:e.capture_output_to,content:h})}let m=String(d.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:c.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(c.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(c.id,m,`exit=${d.status}`),V(t,r,n,m),G(t.workflow,p))}var zE,ZE=w(()=>{"use strict";tt();zE={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=>vj(t,t.state)}});async function Sj(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let 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=Tt(i.definition),a=await bj(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let d=l.terminal_state;if(d===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};V(t,r,n,kj(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,d,`child_run=${l.run_id}`);let c=e.outcomes[d]??e.outcomes.default;return c===void 0?{kind:"terminal",terminal:Z(t.workflow)}:G(t.workflow,c)}async function bj(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await gE(s,t);r[n]=i===s?await ua(s,t):i}return r}function kj(t,e,r){let n={};for(let s of r)n[s.name]=Ij(t,e,s);return n}function Ij(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=Nj(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 Nj(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var QE,ew=w(()=>{"use strict";Gs();tt();ei();QE={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>Sj(t,t.state)}});function Aj(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),V(t,r,n,s),{kind:"terminal",terminal:s}}var tw,rw=w(()=>{"use strict";tt();tw={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=>Aj(t,t.state)}});async function xj(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=Rj(t.cursor),a=i.filter(Lj).filter(d=>d.id>o);if(a.length===0)return null;let l=Math.max(...a.map(d=>d.id));return{main:a.map(d=>({trigger_id:t.trigger_id,issue_id:d.id,issue_number:d.number,issue_url:d.html_url,title:d.title,cursor:String(l)}))}}function Rj(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function Lj(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 nw,sw=w(()=>{"use strict";nw={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=>xj(t)}});async function Oj(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 iw,ow=w(()=>{"use strict";iw={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=>Oj(t)}});function aw(t){t.register(IE),t.register(VE),t.register(RE),t.register(DE),t.register(PE),t.register(qE),t.register(GE),t.register(zE),t.register(AE),t.register(OE),t.register(QE),t.register(tw),t.register(iw),t.register(nw)}var lw=w(()=>{"use strict";NE();xE();LE();$E();jE();FE();HE();KE();YE();ZE();ew();rw();sw();ow()});function dw(){return ha===null&&(ha=new Ou,aw(ha)),ha}var Cj,Ou,ha,cw=w(()=>{"use strict";lw();Cj={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"},Ou=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:Cj[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ha=null});async function mw(t){yw(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=Mj(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ii(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=iE(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let d=new Map(t.members.map(m=>[m.alias,m]));if(ii(n)){let m=Cu({dal:t.dal,workflow:ya(n),job:t.job,project:r,run:o,membersByAlias:d,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:$r(t.job.payload)??{},team_id:t.team.id}),p=await _w(n,m,o.current_state??n.entry_step_id);return fw(t.dal,r.id,o.id,n.name,p),p}let c=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Cu({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:d,outcomes:c,inputs:$r(t.job.payload)??{},team_id:t.team.id}),f=await pw(u,o.current_state??n.start_at);return fw(t.dal,r.id,o.id,n.name,f),f}function fw(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let c=t.getRun(r);if(c!==null){let u=t.getWorkflow(c.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let g=_.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let d=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:d,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function Cu(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 $u(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{yw(n);let i=ii(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=Cu({dal:t.dal,workflow:ii(n)?ya(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ii(n)?_w(n,a,o.current_state??n.entry_step_id):pw(a,o.current_state??n.start_at)}};return e}async function pw(t,e){let r=e;if(r.startsWith(ti))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 dr(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=ga(t,Z(t.workflow));if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ge(t);if(l.kind==="terminal")return dr(t,l.terminal);r=l.state;continue}let o,a=gw(t,r);if(a!==null){let l=J(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),V(t,r,r,a),a===Is)return dr(t,ad);let d=i.outcomes?.[a];o=d!==void 0?G(t.workflow,d):ft(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await $u(t,r,i);if(o.kind==="paused")return Ge(t);if(o.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},o.token,o.reason),Ge(t);if(o.kind==="terminal"){let l=ga(t,o.terminal);if(l.kind==="paused")return Ge(t);if(l.kind==="escalate")return ft(t,{id:r,name:r,type:i.type},l.token,l.reason),Ge(t);if(l.kind==="terminal")return dr(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=ga(t,Z(t.workflow));return n.kind==="terminal"?dr(t,n.terminal):dr(t,Z(t.workflow))}async function _w(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return ft(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ge(e);let l=gw(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),V(e,a.id,a.name,l),l===Is)return dr(e,ad);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ge(e);i=h;continue}let d=await $j(e,t,a);if(d.kind==="paused")return Ge(e);let c=Object.keys(t.connections[a.id]??{});if(d.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},d.token,d.reason,{declared_outcomes:c}),Ge(e);let u=d.kind==="terminal"?d.terminal:d.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=ya(t,a);try{let p=ga(e,u);if(p.kind==="paused")return Ge(e);if(p.kind==="escalate")return ft(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ge(e);if(p.kind==="terminal")return dr(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ge(e);i=h.id;continue}finally{e.workflow=m}}if(In(u))return ft(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);let f=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ft(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ge(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),dr(e,"aborted")}async function $j(t,e,r){let n=hw(e,r),s=t.workflow;t.workflow=ya(e,r);try{return await $u(t,r.id,n,r.name)}finally{t.workflow=s}}function hw(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 $u(t,e,r,n){let s=dw().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?Pj(t,s):void 0,t.progress_step_id=null;try{return await s.execute(vE(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function Mj(t,e){try{let r=JSON.parse(t);if(jj(r)&&r.definition_schema_version===3)return Wt.parse(r)}catch{return e}return e}function ii(t){return t.definition_schema_version===3}function ya(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]=hw(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:Dj(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 Dj(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pj(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 dr(t,e){t.dal.setRunTerminalState(t.run_id,e);try{tE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ge(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function gw(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 ga(t,e){if(!Fj(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&&Uj(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function Fj(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function Uj(t,e,r){let n=Wj(t),s=r.capture_evidence&&n!==null?qj(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 Wj(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 qj(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 yw(t){if(!uw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${uw.join(", ")}`)}var uw,Ew=w(()=>{"use strict";Wn();rE();oE();tt();cw();Ns();uw=[1,2,3]});import{readFileSync as Bj,readdirSync as Hj}from"node:fs";import{basename as Xj,join as Jj,resolve as Gj}from"node:path";function vw(t={}){let e=Gj(t.workflowsDir??"workflows"),r=Hj(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=>Kj(Jj(e,n)))}}function Kj(t){let e=Xj(t);try{let r=Bj(t,"utf8"),n=Tt(r);return kw(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:Iw(r)}}}function Sw(t,e){try{let r=Tt(e);return kw(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:Iw(r)}}}function bw(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(`
|
|
2249
2249
|
`)}
|
|
2250
2250
|
`}function kw(t,e){let r=Yj(e),n=zj(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=Vj(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 Vj(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function Yj(t){return Mu(t)?t.entry_step_id:t.start_at}function zj(t){return Mu(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Mu(t){return t.definition_schema_version===3}function Iw(t){return t instanceof ar?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 Nw(t){let e=new Set;if(Mu(t))for(let r of t.steps){let n=r.members??{};ww(n,e)}else for(let r of Object.values(t.states))ww(r,e);return[...e].sort()}function ww(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=Tw(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=Tw(o);a!==null&&e.add(a)}}}function Tw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ea=w(()=>{"use strict";Gs()});function Zj({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,wa)[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}=Qj(t,r,o);if(a<20)continue;let d=o??"initial",c=`${oi}:${r.id}:${d}`;t.enqueueJob({project_id:r.id,source:wa,source_ref:oi,payload:JSON.stringify({kind:oi,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:c})}}function Qj(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
2251
2251
|
FROM run r
|
|
2252
2252
|
JOIN job j ON j.id = r.job_id
|
|
2253
2253
|
WHERE j.project_id = ?
|
|
2254
2254
|
AND r.terminal_state IS NOT NULL
|
|
2255
|
-
${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 Aw(t){for(let e of eP)try{e(t)}catch{}}var wa,oi,eP,Du=w(()=>{"use strict";wa="memory_policy",oi="memory_consolidation_request";eP=[Zj]});var $w={};he($w,{getOrInsertConsolidationWorkflow:()=>Rw,runJobById:()=>iP,runOnce:()=>on,startWorker:()=>oP});import{createHash as tP}from"node:crypto";import{readFileSync as rP}from"node:fs";import{pathToFileURL as nP}from"node:url";function Rw(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{eE({swallow:!0});let n=da(e);if(n===null)return null;let s=rP(n,"utf8"),i=Tt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:nP(n).href,source_sha256:tP("sha256").update(s).digest("hex")})}catch{return null}}async function on(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??xw,evaluator:n=>Ow(t.dal,n)}),r===null?null:await Lw(t.dal,r,e)}catch(n){if(r!==null)return
|
|
2255
|
+
${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 Aw(t){for(let e of eP)try{e(t)}catch{}}var wa,oi,eP,Du=w(()=>{"use strict";wa="memory_policy",oi="memory_consolidation_request";eP=[Zj]});var $w={};he($w,{getOrInsertConsolidationWorkflow:()=>Rw,runJobById:()=>iP,runOnce:()=>on,startWorker:()=>oP});import{createHash as tP}from"node:crypto";import{readFileSync as rP}from"node:fs";import{pathToFileURL as nP}from"node:url";function Rw(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{eE({swallow:!0});let n=da(e);if(n===null)return null;let s=rP(n,"utf8"),i=Tt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:nP(n).href,source_sha256:tP("sha256").update(s).digest("hex")})}catch{return null}}async function on(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??xw,evaluator:n=>Ow(t.dal,n)}),r===null?null:await Lw(t.dal,r,e)}catch(n){if(r!==null)return jr(t.dal,r,"worker_run_failed",sn(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ta(sn(n))})})}catch{}return null}finally{t.max_concurrent}}async function iP(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??xw,evaluator:s=>Ow(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Lw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...jr(t.dal,r,"worker_run_failed",sn(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ta(sn(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Lw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return jr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===wa&&e.source_ref===oi,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=Rw(t):o=Cw(t,e,n),o===null)return jr(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 jr(t,e,"worker_team_missing","team_not_found",r,n);let d;try{d=Tt(o.definition)}catch(u){return jr(t,e,"worker_workflow_invalid",sn(u),r,n)}let c=aP(d,l);if(c.length>0)return jr(t,e,"worker_team_missing_aliases",`missing_aliases:${c.join(",")}`,r,n,a);try{let u=await mw({dal:t,job:e,workflow:d,team:a,members:l,workflowRow:o});return t.setJobRun(e.id,u.run_id),u.paused===!0?{job_id:e.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return jr(t,e,"worker_run_failed",sn(u),r,n,a)}}function Ow(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Cw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Tt(n.definition)}catch{s=null}return zo({workflow:s,job:e,project:r})}function Cw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function oP(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await on(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ta(sn(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??sP))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function jr(t,e,r,n,s,i,o){let a=Ta(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 sn(t){return t instanceof Error?t.message:String(t)}function Ta(t){return t.length>4096?t.slice(0,4096):t}function aP(t,e){let r=Nw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var xw,sP,va=w(()=>{"use strict";wu();Ew();Gs();Ea();tu();Du();xw=6e5,sP=5e3});import{existsSync as lP,readFileSync as dP}from"node:fs";import{marked as cP}from"marked";function Pw(t,e){t.get("/layman",r=>r.html(Ue("Layman Home",uP(e.dal)))),t.get("/api/layman",r=>r.json(qw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=jw(r);return n===null?r.notFound():r.html(Ue(`Start ${Kn(n)}`,pP(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=jw(r);return n===null?r.notFound():n==="newspaper"?Mw(r,e.dal):_P(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Qr(e.dal,Sa(r,"id"));return n===null?r.notFound():r.html(Ue(`Run ${n.id}`,yP(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Qr(e.dal,Sa(r,"id"));return n===null?r.notFound():r.json(xP(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>wP(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ue("Newspaper Subscriptions",NP(e.dal)))),t.post("/layman/newspaper",r=>Mw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Dw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Dw(r,e.dal))}function uP(t){let e=qw(t);return`<section class="layman-home">
|
|
2256
2256
|
<h1>Welcome</h1>
|
|
2257
2257
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
2258
2258
|
<div class="grid">${ba.map(fP).join("")}</div>
|
|
@@ -2280,7 +2280,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2280
2280
|
<label>Slug<input name="slug" placeholder="my-document" required></label>
|
|
2281
2281
|
<label>Output directory<input name="output_dir" value="drafts"></label>
|
|
2282
2282
|
<button type="submit">Start Document Wizard</button>
|
|
2283
|
-
</form>`:Ww(n,"/layman/start/newspaper")}function Fw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function _P(t,e,r){let n=await t.req.parseBody(),s=Xw(e,n);if(s===null)return t.html(
|
|
2283
|
+
</form>`:Ww(n,"/layman/start/newspaper")}function Fw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function _P(t,e,r){let n=await t.req.parseBody(),s=Xw(e,n);if(s===null)return t.html(Ue("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=e.getWorkflowByName(r);if(i===null)return t.html(Ue("Start workflow",`<p class="error">${S(Kn(r))} is not loaded.</p>`),400);let o=r==="info-qa"?hP(n):gP(n);if(typeof o=="string")return t.html(Ue("Start workflow",`<p class="error">${S(o)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await on({dal:e,worker_id:`layman-start-${Date.now()}`}),d=e.getJob(a.id),c=l?.job_id===a.id?l.run_id:d?.run_id??null;return c===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${c}`,302)}function hP(t){let e=it(t.question).trim();if(e.length===0)return"Enter a question.";let r=it(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function gP(t){let e=it(t.task_description).trim(),r=DP(it(t.slug).trim()),n=it(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function yP(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(Kn(r))}</h1>
|
|
2284
2284
|
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${vP(t,e,r)}`;let s=Hw(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${EP(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
|
|
2285
2285
|
<h2>Running</h2>
|
|
2286
2286
|
<p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
|
|
@@ -2296,7 +2296,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2296
2296
|
<button type="submit" name="done" value="false">Send response</button>
|
|
2297
2297
|
<button type="submit" name="done" value="true">Done with this stage</button>
|
|
2298
2298
|
</form>
|
|
2299
|
-
</section>`}async function wP(t,e){let r=Sa(t,"id"),n=await t.req.parseBody(),s=Number(it(n.step_id)),i=it(n.input),o=it(n.done)==="true";if(!Number.isInteger(s))return t.html(
|
|
2299
|
+
</section>`}async function wP(t,e){let r=Sa(t,"id"),n=await t.req.parseBody(),s=Number(it(n.step_id)),i=it(n.input),o=it(n.done)==="true";if(!Number.isInteger(s))return t.html(Ue("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(TP(e,a.run.id),await on({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Ue("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function TP(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Pu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Pu(o)&&o.name===r.current_state&&typeof o.id=="string");Pu(i)&&typeof i.id=="string"&&t.setRunCurrentState(r.id,i.id)}catch{return}}function vP(t,e,r){let n=CP(e.terminal_state);return`<section class="metric terminal-run">
|
|
2300
2300
|
<h2>${n?"Complete":"Stopped"}</h2>
|
|
2301
2301
|
<p>Status: <strong>${S(e.terminal_state)}</strong></p>
|
|
2302
2302
|
${n?SP(t,e,r):kP(e)}
|
|
@@ -2319,7 +2319,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2319
2319
|
<label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
|
|
2320
2320
|
<label>Output directory<input name="output_dir" value="digests"></label>
|
|
2321
2321
|
<button type="submit">Create subscription</button>
|
|
2322
|
-
</form>`}async function Mw(t,e){let r=await t.req.parseBody(),n=Xw(e,r);if(n===null)return t.html(
|
|
2322
|
+
</form>`}async function Mw(t,e){let r=await t.req.parseBody(),n=Xw(e,r);if(n===null)return t.html(Ue("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ue("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=it(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return t.html(Ue("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:it(r.output_dir).trim()||"digests",schedule:LP(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Dw(t,e){let r=Sa(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function AP(t){return ye(["id","project","topics","status","action"],t.map(e=>{let r=jP(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function qw(t){let e=Bw(t);return{workflows:ba,recent_runs:RP(t),newspaper_subscriptions:e.length}}function xP(t,e){let r=Hw(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function RP(t){return t.query(`SELECT r.*, w.name AS workflow_name
|
|
2323
2323
|
FROM run r
|
|
2324
2324
|
JOIN workflow w ON w.id = r.workflow_id
|
|
2325
2325
|
WHERE w.name IN (${Fu.map(()=>"?").join(",")})
|
|
@@ -2337,13 +2337,13 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2337
2337
|
WHERE run_id = ?
|
|
2338
2338
|
AND acknowledged_at IS NULL
|
|
2339
2339
|
AND requires_user = 1
|
|
2340
|
-
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ja=w(()=>{"use strict"});function CT(t,e){t.all("/runtime/*",r=>$F(r.req.raw,e))}async function $F(t,e){try{return Response.json(await MF(t,e))}catch(r){if(r instanceof ce)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 MF(t,e){let r=new URL(t.url),n=qF(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Zu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Pa(t,n.id,s[2]),DF(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Pa(t,n.id,s[2]);let i=kT(e.dal,s[4]);return bT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Zu(t),e.dal.listTeams().map(i=>WF(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=IT(e.dal,NT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ce(400,"runtime lead chat body does not match route team");return xT(t,n.id,o.context),AT(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=IT(e.dal,NT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ce(400,"runtime lead message body does not match route team");xT(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ce(400,"runtime lead message requires draft.body");return AT(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Pa(t,n.id,s[2]);let i=kT(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ce(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ce(400,"runtime workflow message requires draft.body");return FF(e.dal,i,a),bT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ai(t,n.id),e.dal.listWorkflows().map(i=>BF(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ai(t,n.id);let i=XF(e.dal,s[2]);return HF(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ai(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ce(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return JF(e.dal,i,o).map(l=>LT(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ai(t,n.id);let i=RT(e.dal,s[2]);return LT(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ai(t,n.id);let i=RT(e.dal,s[2]),o=KF(e.dal,i);return{runId:nf(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ce(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function DF(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>$T(t,e,r))}}function bT(t,e,r){let n=$T(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:jF(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:PF(t,r)}}function $T(t,e,r){let n=MT(t,r.id),s=ef(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 jF(t,e){let r=MT(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:ef(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 PF(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 FF(t,e,r){let n=UF(t,e.id);if(n!==null){let s=Da(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ce(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Ut(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ce(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ce(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 MT(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 UF(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 ef(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 kT(t,e){let r=t.findProjectByName(e);if(r===null)throw new ce(404,`project not found: ${e}`);return r}function IT(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ce(404,`team not found: ${e}`);return r}function NT(t){return t.startsWith("team:")?t.slice(5):t}function WF(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function AT(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??OT}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function qF(t){let e=t.workspaceName??"default";return{id:e,name:e}}function Zu(t){if(t.headers.get("x-lmctl-workspace-id")!==OT)throw new ce(400,"runtime request requires global-admin workspace identity")}function Pa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ce(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ce(400,"runtime workspace identity does not match route")}function ai(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ce(400,"runtime request requires workspace identity");if(r!==e)throw new ce(400,"runtime workspace identity does not match server workspace")}function xT(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ce(400,"workspace manager context requires workspace identity");Pa(t,e,r.workspaceId);return}Zu(t)}function tf(t){return`${Zn}${rf(t.name)}`}function rf(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function nf(t){return`${Qu}${t.id}`}function BF(t){let e=Fa(t.definition);return{id:tf(t),name:t.name,...e.description===null?{}:{description:e.description}}}function HF(t){let e=Fa(t.definition);return{id:tf(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Fa(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 XF(t,e){if(!e.startsWith(Zn))throw new ce(404,`template not found: ${e}`);let r=e.slice(Zn.length),n=t.listWorkflows().filter(s=>rf(s.name)===r);if(n.length===0)throw new ce(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ce(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function RT(t,e){if(!e.startsWith(Qu))throw new ce(404,`run not found: ${e}`);let r=e.slice(Qu.length);if(!/^[1-9]\d*$/.test(r))throw new ce(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ce(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ce(404,`run not found: ${e}`);return s}function JF(t,e,r){if(r!==null){if(!r.startsWith(Zn))return[];let s=r.slice(Zn.length),i=t.listWorkflows().filter(a=>rf(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 LT(t,e){let r=t.getWorkflow(e.workflow_id),n=ef(e),s=GF(r,e);return{id:nf(e),templateId:r===null?`${Zn}unknown`:tf(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 GF(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]:[Fa(t.definition).nameToId.get(r)??r]}function KF(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Fa(r.definition),s=d=>n.nameToId.get(d)??d,i=nf(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let d of a){let c=s(d.state_name);if(o.push({timestamp:d.started_at,type:"step.started",stepId:c,message:`step ${d.state_name} started`}),d.ended_at!==null){let u=VF(d);o.push({timestamp:d.ended_at,type:u,stepId:c,...d.outcome===null?{}:{message:d.outcome},...d.status_detail===null?{}:{payload:{status_detail:d.status_detail}}})}else e.paused_at!==null&&d.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:c})}let l=t.listSessionEvents(e.id);for(let d of l){let c=d.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===d.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(d.timestamp_ms).toISOString(),f={kind:d.kind,session_event_id:d.id};if(d.payload.length>0)try{let m=JSON.parse(d.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...c===void 0?{}:{stepId:c},payload:f})}if(e.terminal_state!==null){let d=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:d,message:e.terminal_state})}return o.sort((d,c)=>d.timestamp.localeCompare(c.timestamp)),o.map((d,c)=>({id:`${i}:evt:${c+1}`,runId:i,sequence:c+1,timestamp:d.timestamp,type:d.type,...d.stepId===void 0?{}:{stepId:d.stepId},...d.message===void 0?{}:{message:d.message},...d.payload===void 0?{}:{payload:d.payload}}))}function VF(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 OT,Zn,Qu,ce,DT=w(()=>{"use strict";ja();ir();OT="global-admin";Zn="template:",Qu="run:";ce=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as YF,writeFileSync as zF}from"node:fs";import{randomUUID as jT}from"node:crypto";import{dirname as ZF,resolve as Ua,sep as PT}from"node:path";async function UT(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(!n1(n))return t.text("missing image file",400);if(n.size>QF)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=s1(s);if(i===null||!(i in FT))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=e1(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?Ua(r1()):Ua(o.local_path),l=Ua(a,"uploads",jT()),d=Ua(l,`${jT()}${FT[i]}`);if(!t1(d,a))return t.text("invalid upload path",400);YF(l,{recursive:!0});let c=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);zF(d,c);let u={path:d,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function e1(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function t1(t,e){let r=e.endsWith(PT)?e:`${e}${PT}`;return t.startsWith(r)}function r1(){return ZF(ne())}function n1(t){return typeof File<"u"&&t instanceof File}function s1(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 QF,FT,WT=w(()=>{"use strict";ze();QF=10*1024*1024,FT={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Wa}from"node:fs";import{basename as i1,dirname as o1,extname as a1,isAbsolute as l1,join as d1,relative as c1}from"node:path";import{fileURLToPath as u1}from"node:url";import{Hono as f1}from"hono";import{serveStatic as qt}from"@hono/node-server/serve-static";function KT(t){let e=new f1,r=[],n=t.localWebui!==void 0?of(t.localWebui.webuiDir):m1();if(t.localWebui!==void 0&&Qw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=p1();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,qt({root:n})),e.use("/vendor/*",s,qt({root:n})),e.use("/src/*",s,qt({root:n})),e.get("/",s,qt({root:n,path:"index.html"})),e.get("/admin",s,qt({root:n,path:"index.html"})),e.get("/admin/*",s,qt({root:n,path:"index.html"})),e.get("/terminal",s,qt({root:n,path:"index.html"})),e.get("/terminal/*",s,qt({root:n,path:"index.html"})),e.get("/chat",s,qt({root:n,path:"index.html"})),e.get("/chat/*",s,qt({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("*",xy({disabled:t.authDisabled})),e.get("/login",s=>s.html(Fe("Login",`
|
|
2340
|
+
ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ja=w(()=>{"use strict"});function CT(t,e){t.all("/runtime/*",r=>$F(r.req.raw,e))}async function $F(t,e){try{return Response.json(await MF(t,e))}catch(r){if(r instanceof ce)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 MF(t,e){let r=new URL(t.url),n=qF(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Zu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Pa(t,n.id,s[2]),DF(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Pa(t,n.id,s[2]);let i=kT(e.dal,s[4]);return bT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Zu(t),e.dal.listTeams().map(i=>WF(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=IT(e.dal,NT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ce(400,"runtime lead chat body does not match route team");return xT(t,n.id,o.context),AT(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=IT(e.dal,NT(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ce(400,"runtime lead message body does not match route team");xT(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ce(400,"runtime lead message requires draft.body");return AT(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Pa(t,n.id,s[2]);let i=kT(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ce(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ce(400,"runtime workflow message requires draft.body");return FF(e.dal,i,a),bT(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return ai(t,n.id),e.dal.listWorkflows().map(i=>BF(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){ai(t,n.id);let i=XF(e.dal,s[2]);return HF(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){ai(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ce(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return JF(e.dal,i,o).map(l=>LT(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){ai(t,n.id);let i=RT(e.dal,s[2]);return LT(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){ai(t,n.id);let i=RT(e.dal,s[2]),o=KF(e.dal,i);return{runId:nf(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ce(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function DF(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>$T(t,e,r))}}function bT(t,e,r){let n=$T(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:jF(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:PF(t,r)}}function $T(t,e,r){let n=MT(t,r.id),s=ef(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 jF(t,e){let r=MT(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:ef(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 PF(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 FF(t,e,r){let n=UF(t,e.id);if(n!==null){let s=Da(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ce(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Ut(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ce(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ce(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 MT(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 UF(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 ef(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 kT(t,e){let r=t.findProjectByName(e);if(r===null)throw new ce(404,`project not found: ${e}`);return r}function IT(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ce(404,`team not found: ${e}`);return r}function NT(t){return t.startsWith("team:")?t.slice(5):t}function WF(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function AT(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??OT}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function qF(t){let e=t.workspaceName??"default";return{id:e,name:e}}function Zu(t){if(t.headers.get("x-lmctl-workspace-id")!==OT)throw new ce(400,"runtime request requires global-admin workspace identity")}function Pa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ce(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ce(400,"runtime workspace identity does not match route")}function ai(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ce(400,"runtime request requires workspace identity");if(r!==e)throw new ce(400,"runtime workspace identity does not match server workspace")}function xT(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ce(400,"workspace manager context requires workspace identity");Pa(t,e,r.workspaceId);return}Zu(t)}function tf(t){return`${Zn}${rf(t.name)}`}function rf(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function nf(t){return`${Qu}${t.id}`}function BF(t){let e=Fa(t.definition);return{id:tf(t),name:t.name,...e.description===null?{}:{description:e.description}}}function HF(t){let e=Fa(t.definition);return{id:tf(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Fa(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 XF(t,e){if(!e.startsWith(Zn))throw new ce(404,`template not found: ${e}`);let r=e.slice(Zn.length),n=t.listWorkflows().filter(s=>rf(s.name)===r);if(n.length===0)throw new ce(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ce(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function RT(t,e){if(!e.startsWith(Qu))throw new ce(404,`run not found: ${e}`);let r=e.slice(Qu.length);if(!/^[1-9]\d*$/.test(r))throw new ce(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ce(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ce(404,`run not found: ${e}`);return s}function JF(t,e,r){if(r!==null){if(!r.startsWith(Zn))return[];let s=r.slice(Zn.length),i=t.listWorkflows().filter(a=>rf(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 LT(t,e){let r=t.getWorkflow(e.workflow_id),n=ef(e),s=GF(r,e);return{id:nf(e),templateId:r===null?`${Zn}unknown`:tf(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 GF(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]:[Fa(t.definition).nameToId.get(r)??r]}function KF(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Fa(r.definition),s=d=>n.nameToId.get(d)??d,i=nf(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let d of a){let c=s(d.state_name);if(o.push({timestamp:d.started_at,type:"step.started",stepId:c,message:`step ${d.state_name} started`}),d.ended_at!==null){let u=VF(d);o.push({timestamp:d.ended_at,type:u,stepId:c,...d.outcome===null?{}:{message:d.outcome},...d.status_detail===null?{}:{payload:{status_detail:d.status_detail}}})}else e.paused_at!==null&&d.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:c})}let l=t.listSessionEvents(e.id);for(let d of l){let c=d.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===d.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(d.timestamp_ms).toISOString(),f={kind:d.kind,session_event_id:d.id};if(d.payload.length>0)try{let m=JSON.parse(d.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...c===void 0?{}:{stepId:c},payload:f})}if(e.terminal_state!==null){let d=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:d,message:e.terminal_state})}return o.sort((d,c)=>d.timestamp.localeCompare(c.timestamp)),o.map((d,c)=>({id:`${i}:evt:${c+1}`,runId:i,sequence:c+1,timestamp:d.timestamp,type:d.type,...d.stepId===void 0?{}:{stepId:d.stepId},...d.message===void 0?{}:{message:d.message},...d.payload===void 0?{}:{payload:d.payload}}))}function VF(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 OT,Zn,Qu,ce,DT=w(()=>{"use strict";ja();ir();OT="global-admin";Zn="template:",Qu="run:";ce=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as YF,writeFileSync as zF}from"node:fs";import{randomUUID as jT}from"node:crypto";import{dirname as ZF,resolve as Ua,sep as PT}from"node:path";async function UT(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(!n1(n))return t.text("missing image file",400);if(n.size>QF)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=s1(s);if(i===null||!(i in FT))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=e1(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?Ua(r1()):Ua(o.local_path),l=Ua(a,"uploads",jT()),d=Ua(l,`${jT()}${FT[i]}`);if(!t1(d,a))return t.text("invalid upload path",400);YF(l,{recursive:!0});let c=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);zF(d,c);let u={path:d,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function e1(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function t1(t,e){let r=e.endsWith(PT)?e:`${e}${PT}`;return t.startsWith(r)}function r1(){return ZF(ne())}function n1(t){return typeof File<"u"&&t instanceof File}function s1(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 QF,FT,WT=w(()=>{"use strict";ze();QF=10*1024*1024,FT={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Wa}from"node:fs";import{basename as i1,dirname as o1,extname as a1,isAbsolute as l1,join as d1,relative as c1}from"node:path";import{fileURLToPath as u1}from"node:url";import{Hono as f1}from"hono";import{serveStatic as qt}from"@hono/node-server/serve-static";function KT(t){let e=new f1,r=[],n=t.localWebui!==void 0?of(t.localWebui.webuiDir):m1();if(t.localWebui!==void 0&&Qw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=p1();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,qt({root:n})),e.use("/vendor/*",s,qt({root:n})),e.use("/src/*",s,qt({root:n})),e.get("/",s,qt({root:n,path:"index.html"})),e.get("/admin",s,qt({root:n,path:"index.html"})),e.get("/admin/*",s,qt({root:n,path:"index.html"})),e.get("/terminal",s,qt({root:n,path:"index.html"})),e.get("/terminal/*",s,qt({root:n,path:"index.html"})),e.get("/chat",s,qt({root:n,path:"index.html"})),e.get("/chat/*",s,qt({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("*",xy({disabled:t.authDisabled})),e.get("/login",s=>s.html(Ue("Login",`
|
|
2341
2341
|
<h1>Login</h1>
|
|
2342
2342
|
<form method="post" action="/login">
|
|
2343
2343
|
<label>Token <input name="token" type="password"></label>
|
|
2344
2344
|
<button type="submit">Login</button>
|
|
2345
2345
|
</form>
|
|
2346
|
-
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Ly(o)?(du(s,o),s.redirect("/",302)):s.html(Fe("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Oy(s),s.redirect("/login",302))),Pw(e,{dal:t.dal}),CT(e,{dal:t.dal}),tT(e,{dal:t.dal}),fT(e,{terminalSessionManager:t.terminalSessionManager}),yT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=qs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],d=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!d.ok){let f=d.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let c=[],u=[];for(let f of a)try{await Cc(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),c.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return q(s,{team:i,seeded:c,failed:u},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),Fy(e,{dal:t.dal}),Jy(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Lo(t.dal),T1)),e.get("/api/projects",s=>q(s,Oo(t.dal),v1)),e.get("/api/teams",s=>q(s,xg(t.dal),k1)),e.get("/api/workflows",s=>q(s,Co(t.dal),I1)),e.get("/api/workflows/verify",s=>{let i=vw();return s.req.header("accept")?.includes("text/plain")?s.text(bw(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Rg(t.dal,{status:s.req.query("status")}),N1)),e.post("/api/uploads",s=>UT(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=$o(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",d=i.payload,c=d==null?null:typeof d=="string"?d:JSON.stringify(d),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:c,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,u,_e)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(va(),$w)),o=$o(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():q(s,t.dal.listProjectWorkflows(i.id),S1)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Qn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,d=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(d===null)return s.text("workflow not found",404);let c=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(c!==null)try{Fn(c)}catch{return s.text("invalid condition",400)}let u=g1(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:d.id,condition:c,parameters_override:u,priority:f});return q(s,m,_e)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},_e):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():q(s,i,_e)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=BT(s.req.query("status"),y1);if(typeof o=="string")return s.text(o,400);let a=BT(s.req.query("severity"),YT);return typeof a=="string"?s.text(a,400):q(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),b1)}),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 Qn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let d=E1(o.severity);if(typeof d=="object")return s.text(d.error,400);let c=w1(o.labels);if(typeof c=="string"&&c.startsWith("error:"))return s.text(c.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...d!==void 0?{severity:d}:{},labels:c,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return q(s,u,_e)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Qn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let d=t.dal.claimIssue(i,l);return d===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,d,_e)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Qn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):q(s,l,_e)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Qn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return q(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Qn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return q(s,t.dal.reopenIssue(ie(s,"id"),a),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return q(s,{...i,owner:a,repo:l},_e)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=en(t.dal,i,o);return q(s,a,_e)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=en(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],d=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return d?s.text(l.content):q(s,l,_e);if(l.path!==null&&l.path!==void 0){if(d)try{let{readFileSync:c}=await import("node:fs"),u=_1(l.path);if(h1(u)){let h=c(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=c(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=i1(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(c){return s.text(`failed to read artifact path: ${c.message}`,500)}return q(s,l,_e)}return q(s,l,_e)}),e.get("/api/runs",s=>q(s,jn(t.dal,{limit:sf(s,"limit")??100}),A1)),e.get("/api/runs/:id",s=>{let i=Qr(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,x1)}),e.get("/api/runs/:id/where",s=>{let i=Pn(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Do(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=jo(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Po(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let d=(await s.req.parseBody().catch(()=>({}))).outcome;typeof d=="string"&&d.length>0&&(i=d)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(qa(t.daemon),q(s,o,HT)):q(s,o,HT,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let c=await s.req.json();typeof c.input=="string"&&(o=c.input),c.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let c=await s.req.parseBody().catch(()=>({}));typeof c.input=="string"&&(o=c.input),(c.done==="true"||c.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=t.dal.resumeInteractive(i,o,a);return!d.resumed&&d.reason==="not_found"?s.notFound():d.resumed?(qa(t.daemon),s.json({resumed:!0,session_status:d.session.status})):s.json({resumed:!1,reason:d.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>qT(s,t.dal,i=>q(s,i,L1))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=$g(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():VT(s)?s.html(`<pre>${S(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=>qT(s,t.dal,i=>{let o=TT(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>q(s,Mg(t.dal,{type:s.req.query("type")}),O1)),e.get("/api/external-signals",s=>q(s,Dg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),C1)),e.get("/api/attentions",s=>q(s,Rr(t.dal,{unacked:s.req.query("unacked")==="true"}),$1)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():q(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let d=Mo(t.dal,l);return q(s,d,c=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],c.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Ut(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=Ut(t.dal,i);if(d===null)return s.notFound();let c=Rr(t.dal).find(m=>m.id===i);if(c===void 0)return s.notFound();if(c.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);qa(t.daemon);let p=Rr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(c.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:c.kind},400);if(c.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(d.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(d.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:d.step_id},400);let f=t.dal.acknowledgeAttention(i);return qa(t.daemon),s.json({ok:!0,attention_id:i,step_id:d.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=Lg(t.dal,{status:o,pr_url:i});return q(s,a,M1)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=Og(t.dal,i);return o===null?s.notFound():q(s,o,D1)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),XT)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=qs(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),XT)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=qs(s.req.param("team_name"));try{let o=await vg(t.dal,i,s.req.param("alias"));return q(s,o,a=>JT("compacted",a.row))}catch(o){if(o instanceof Ws)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=qs(s.req.param("team_name")),o=await Cc(t.dal,i,s.req.param("alias"));return q(s,o,a=>JT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,r,GT)),e.post("/api/intake/scan",async s=>(r=await ea(t.dal),q(s,r,GT))),e.get("/api/stats/run-throughput",s=>q(s,Fg(t.dal),j1)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,P1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},_e);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},_e)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Uc(t.dal,i),l=Wc(t.dal,{project_id:i});return s.html(Fe(`Metrics \u2014 ${o.name}`,F1(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=sf(s,"since_days");return s.json(Uc(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=sf(s,"since_days");return s.json(Wc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function qT(t,e,r){let n=Fc(e,ie(t,"id"),ie(t,"step_id"));return n===null?t.notFound():r(n)}function qa(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,r,n=200){return VT(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 VT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function m1(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Wa(`${t}/index.html`)?of(t):null;let e="src/serve/webui-dist";if(Wa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Wa(`${r}/index.html`))return r;let n=d1(o1(u1(import.meta.url)),"webui-dist");return Wa(`${n}/index.html`)?of(n):null}function of(t){if(!l1(t))return t;let e=c1(process.cwd(),t);return e.length===0?".":e}function p1(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function sf(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 _1(t){switch(a1(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 h1(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Qn(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 g1(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 BT(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function E1(t){if(t!=null)return typeof t=="string"&&YT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function w1(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 T1(t){return`<h1>Status</h1><div class="grid">
|
|
2346
|
+
`))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Ly(o)?(du(s,o),s.redirect("/",302)):s.html(Ue("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Oy(s),s.redirect("/login",302))),Pw(e,{dal:t.dal}),CT(e,{dal:t.dal}),tT(e,{dal:t.dal}),fT(e,{terminalSessionManager:t.terminalSessionManager}),yT(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=qs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],d=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!d.ok){let f=d.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let c=[],u=[];for(let f of a)try{await Cc(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),c.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return q(s,{team:i,seeded:c,failed:u},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),Fy(e,{dal:t.dal}),Jy(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Lo(t.dal),T1)),e.get("/api/projects",s=>q(s,Oo(t.dal),v1)),e.get("/api/teams",s=>q(s,xg(t.dal),k1)),e.get("/api/workflows",s=>q(s,Co(t.dal),I1)),e.get("/api/workflows/verify",s=>{let i=vw();return s.req.header("accept")?.includes("text/plain")?s.text(bw(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Rg(t.dal,{status:s.req.query("status")}),N1)),e.post("/api/uploads",s=>UT(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=$o(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",d=i.payload,c=d==null?null:typeof d=="string"?d:JSON.stringify(d),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:c,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,u,_e)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(va(),$w)),o=$o(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():q(s,t.dal.listProjectWorkflows(i.id),S1)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Qn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,d=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(d===null)return s.text("workflow not found",404);let c=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(c!==null)try{Fn(c)}catch{return s.text("invalid condition",400)}let u=g1(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:d.id,condition:c,parameters_override:u,priority:f});return q(s,m,_e)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},_e):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():q(s,i,_e)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():q(s,i,_e)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=BT(s.req.query("status"),y1);if(typeof o=="string")return s.text(o,400);let a=BT(s.req.query("severity"),YT);return typeof a=="string"?s.text(a,400):q(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),b1)}),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 Qn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let d=E1(o.severity);if(typeof d=="object")return s.text(d.error,400);let c=w1(o.labels);if(typeof c=="string"&&c.startsWith("error:"))return s.text(c.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...d!==void 0?{severity:d}:{},labels:c,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return q(s,u,_e)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Qn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let d=t.dal.claimIssue(i,l);return d===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,d,_e)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Qn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):q(s,l,_e)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Qn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return q(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await Qn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return q(s,t.dal.reopenIssue(ie(s,"id"),a),_e)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return q(s,{...i,owner:a,repo:l},_e)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=en(t.dal,i,o);return q(s,a,_e)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=en(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],d=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return d?s.text(l.content):q(s,l,_e);if(l.path!==null&&l.path!==void 0){if(d)try{let{readFileSync:c}=await import("node:fs"),u=_1(l.path);if(h1(u)){let h=c(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=c(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=i1(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(c){return s.text(`failed to read artifact path: ${c.message}`,500)}return q(s,l,_e)}return q(s,l,_e)}),e.get("/api/runs",s=>q(s,jn(t.dal,{limit:sf(s,"limit")??100}),A1)),e.get("/api/runs/:id",s=>{let i=Qr(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,x1)}),e.get("/api/runs/:id/where",s=>{let i=Pn(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Do(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=jo(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Po(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let d=(await s.req.parseBody().catch(()=>({}))).outcome;typeof d=="string"&&d.length>0&&(i=d)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(qa(t.daemon),q(s,o,HT)):q(s,o,HT,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let c=await s.req.json();typeof c.input=="string"&&(o=c.input),c.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let c=await s.req.parseBody().catch(()=>({}));typeof c.input=="string"&&(o=c.input),(c.done==="true"||c.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=t.dal.resumeInteractive(i,o,a);return!d.resumed&&d.reason==="not_found"?s.notFound():d.resumed?(qa(t.daemon),s.json({resumed:!0,session_status:d.session.status})):s.json({resumed:!1,reason:d.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>qT(s,t.dal,i=>q(s,i,L1))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=$g(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():VT(s)?s.html(`<pre>${S(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=>qT(s,t.dal,i=>{let o=TT(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>q(s,Mg(t.dal,{type:s.req.query("type")}),O1)),e.get("/api/external-signals",s=>q(s,Dg(t.dal,{unhandled:s.req.query("unhandled")==="true"}),C1)),e.get("/api/attentions",s=>q(s,Lr(t.dal,{unacked:s.req.query("unacked")==="true"}),$1)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():q(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let d=Mo(t.dal,l);return q(s,d,c=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],c.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Ut(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,_e)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=Ut(t.dal,i);if(d===null)return s.notFound();let c=Lr(t.dal).find(m=>m.id===i);if(c===void 0)return s.notFound();if(c.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);qa(t.daemon);let p=Lr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(c.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:c.kind},400);if(c.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(d.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(d.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:d.step_id},400);let f=t.dal.acknowledgeAttention(i);return qa(t.daemon),s.json({ok:!0,attention_id:i,step_id:d.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=Lg(t.dal,{status:o,pr_url:i});return q(s,a,M1)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=Og(t.dal,i);return o===null?s.notFound():q(s,o,D1)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),XT)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=qs(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),XT)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=qs(s.req.param("team_name"));try{let o=await vg(t.dal,i,s.req.param("alias"));return q(s,o,a=>JT("compacted",a.row))}catch(o){if(o instanceof Ws)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=qs(s.req.param("team_name")),o=await Cc(t.dal,i,s.req.param("alias"));return q(s,o,a=>JT(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,r,GT)),e.post("/api/intake/scan",async s=>(r=await ea(t.dal),q(s,r,GT))),e.get("/api/stats/run-throughput",s=>q(s,Fg(t.dal),j1)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,P1)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},_e);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},_e)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Uc(t.dal,i),l=Wc(t.dal,{project_id:i});return s.html(Ue(`Metrics \u2014 ${o.name}`,F1(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=sf(s,"since_days");return s.json(Uc(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=sf(s,"since_days");return s.json(Wc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function qT(t,e,r){let n=Fc(e,ie(t,"id"),ie(t,"step_id"));return n===null?t.notFound():r(n)}function qa(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,r,n=200){return VT(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 VT(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function m1(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Wa(`${t}/index.html`)?of(t):null;let e="src/serve/webui-dist";if(Wa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Wa(`${r}/index.html`))return r;let n=d1(o1(u1(import.meta.url)),"webui-dist");return Wa(`${n}/index.html`)?of(n):null}function of(t){if(!l1(t))return t;let e=c1(process.cwd(),t);return e.length===0?".":e}function p1(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function sf(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 _1(t){switch(a1(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 h1(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Qn(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 g1(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 BT(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function E1(t){if(t!=null)return typeof t=="string"&&YT.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function w1(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 T1(t){return`<h1>Status</h1><div class="grid">
|
|
2347
2347
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
2348
2348
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
2349
2349
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -2396,10 +2396,10 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2396
2396
|
FROM tracked_invocation
|
|
2397
2397
|
WHERE target_teamfile = ?
|
|
2398
2398
|
AND target_alias = ?
|
|
2399
|
-
AND status = 'running'`,e,r),s=0;for(let i of n)nv(t,i)!==null&&(s+=1);return s}var Ha=w(()=>{"use strict";ht()});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=
|
|
2399
|
+
AND status = 'running'`,e,r),s=0;for(let i of n)nv(t,i)!==null&&(s+=1);return s}var Ha=w(()=>{"use strict";ht()});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=Be({path:ne()});try{return await e(r)}finally{r.close()}}function Q(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let d=t[a+1];if(d===void 0||d.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=d,a+=1}return{positionals:i,flags:o}}function P(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function K(t,e){return t.flags[e]===!0}function ee(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
2400
2400
|
`)}function N(t,e){return t.stderr.write(`error: ${e}
|
|
2401
2401
|
`),1}function Ke(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
2402
|
-
`),2}var De=w(()=>{"use strict";dt();ze()});import{hostname as av}from"node:os";function lv(t,e,r){let n=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=
|
|
2402
|
+
`),2}var De=w(()=>{"use strict";dt();ze()});import{hostname as av}from"node:os";function lv(t,e,r){let n=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Be({path:ne()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Fe(a.holder_pid)),pollMs:J1,settleMs:G1,maxHoldMs:Tn(r),onHold:()=>D({event:"delivery_hold_open_started",receiver:n}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&D({event:"delivery_hold_open_released",receiver:n,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function es(t){let e=t.finalize??"auto";await Ga(t.io,t.env);let r=await O(t.io,h=>{if(t.onlyMailboxId!==void 0){let _=h.getMailboxMessage(t.onlyMailboxId);return _!==null&&_.message_type==="request"&&dv(_,t.sender)&&_.receiver_teamfile===t.receiver.teamfile&&_.receiver_alias===t.receiver.alias&&_.delivered_at===null&&_.delivering_at===null?[_]:[]}return h.listEnqueuedRequestMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)}),n=r.length===0?[]:await O(t.io,h=>h.claimMailForDelivery(r.map(_=>_.id),new Date().toISOString(),process.pid,av())),s=t.newMessage===void 0?Gr(n):null,i=s===null?null:Me(s.id);if(i!==null)try{await O(t.io,h=>{h.setCurrentlyHandlingMessage(t.receiver.teamfile,t.receiver.alias,i)})}catch(h){t.io.stderr.write(`warning: failed to set mailbox causal pointer: ${h instanceof Error?h.message:String(h)}
|
|
2403
2403
|
`)}let o=K1(n,t.newMessage,{newMessageFrom:t.newMessageFrom??uv(t.sender)});if(o.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let a=!1,l=le(),d=0,c=0,u=0,f={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:o,permissionMode:t.permissionMode,env:t.env,onDelta:h=>{a=!0,l&&(d+=1,u=Buffer.byteLength(h,"utf8"),c+=u),t.onDelta?.(h)},onProgress:h=>t.onProgress?.(h)};t.receiver.model!==void 0&&(f.model=t.receiver.model),t.receiver.effort!==void 0&&(f.effort=t.receiver.effort),f.alias=t.receiver.alias,f.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(f.timeoutMs=t.idleTimeoutMs),f.holdOpen=lv(t.io,t.receiver,t.env);let m;try{ur("mailbox_delivery_attempt_started",n,{batch_ids:n.map(h=>h.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId}),await t.onPromptBuilt?.(o),m=await Pt(f)}catch(h){let _=h instanceof Error?h.message:String(h);if(ur("mailbox_delivery_attempt_failed",n,{error_message:_}),e==="auto"&&await ov(t.io,n,"provider-or-preflight-error",_),e==="caller")return{status:"error",receipt:_,prompt:o,queued:n,deliveredIds:[],wroteDelta:a,error:_};throw h}finally{if(i!==null)try{await O(t.io,h=>{h.clearCurrentlyHandlingMessage(t.receiver.teamfile,t.receiver.alias,i)})}catch(h){t.io.stderr.write(`warning: failed to clear mailbox causal pointer: ${h instanceof Error?h.message:String(h)}
|
|
2404
2404
|
`)}}if(l&&$e(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:a,blockCount:d,streamedBytes:c,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:u,tailPreview:m.text.slice(-200)})),m.status==="stalled")return ur("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:m.stalledAfterMs,duration_ms:m.durationMs}),e==="auto"&&await ov(t.io,n,"provider-stalled"),{status:"stalled",receipt:m.text,prompt:o,queued:n,deliveredIds:[],wroteDelta:a,durationMs:m.durationMs,stalledAfterMs:m.stalledAfterMs};let p=n.map(h=>h.id);return e==="auto"&&await Xa(t.io,n,m.text),{status:"ok",receipt:m.text,prompt:o,queued:n,deliveredIds:p,wroteDelta:a,durationMs:m.durationMs}}async function Ja(t){await Ga(t.io,t.env);let e=await O(t.io,i=>{if(t.onlyMailboxId!==void 0){let o=i.getMailboxMessage(t.onlyMailboxId);return o!==null&&o.message_type==="response"&&dv(o,t.sender)&&o.receiver_teamfile===t.receiver.teamfile&&o.receiver_alias===t.receiver.alias&&o.delivered_at===null&&o.delivering_at===null?[o]:[]}return i.listEnqueuedResponseMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)}),r=e.length===0?[]:await O(t.io,i=>i.claimMailForDelivery(e.map(o=>o.id),new Date().toISOString(),process.pid,av())),n=V1(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,alias:t.receiver.alias,isLead:t.receiver.isLead};t.receiver.model!==void 0&&(s.model=t.receiver.model),t.receiver.effort!==void 0&&(s.effort=t.receiver.effort),t.idleTimeoutMs!==void 0&&(s.timeoutMs=t.idleTimeoutMs),s.holdOpen=lv(t.io,t.receiver,t.env),ur("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 Pt(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
|
|
2405
2405
|
${i.text}`;return ur("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.stalledAfterMs,duration_ms:i.durationMs}),await Xa(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 Xa(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 ur("mailbox_delivery_attempt_failed",r,{error_message:o}),await Xa(t.io,r,a),{status:"error",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),error:o}}}function K1(t,e,r={}){let n=t.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${cv(s)}, sent ${s.created_at}) ---`,s.payload].join(`
|
|
@@ -2411,19 +2411,19 @@ ${i.text}`;return ur("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.st
|
|
|
2411
2411
|
|
|
2412
2412
|
`)}function cv(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":uv({teamfile:t.sender_teamfile,alias:t.sender_alias})}function uv(t){return`${t.teamfile}:${t.alias}`}async function Xa(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);ur("mailbox_delivery_finalize_failed",e,{error_message:s}),t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${s}
|
|
2413
2413
|
`)}}async function ov(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)ur(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);ur("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}
|
|
2414
|
-
`)}}async function Ga(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-af(e)).toISOString())})}catch{}}function af(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return iv;let r=Number(e);return!Number.isFinite(r)||r<=0?iv:r}function ur(t,e,r={}){let n=new Date().toISOString();for(let s of e)D({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 iv,J1,G1,Ka=w(()=>{"use strict";Ft();Pi();kn();pe();De();dt();ze();
|
|
2414
|
+
`)}}async function Ga(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-af(e)).toISOString())})}catch{}}function af(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return iv;let r=Number(e);return!Number.isFinite(r)||r<=0?iv:r}function ur(t,e,r={}){let n=new Date().toISOString();for(let s of e)D({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 iv,J1,G1,Ka=w(()=>{"use strict";Ft();Pi();kn();pe();De();dt();ze();wr();ht();iv=60*60*1e3,J1=2e3,G1=5e3});import{basename as Y1}from"node:path";function pv(t,e){let r=new Date(e.now.getTime()-Bt()).toISOString(),n=gv(t,r).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=eU(e.sender,n),i=tU(e.sender,n);i!==null&&i.teamfile===e.root&&!mv(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(m=>mv(m,o)),d=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,c=d!==null&&e.now.getTime()-d<z1,u=lf(e.sender,n).length;return{stop:l.length>=1&&c&&u>=Z1,chain:rU(a)}}function _v(t,e){let r=new Date(e.now.getTime()-Bt()).toISOString(),n=gv(t,r),s=lf(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 Bt(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return fv;let r=Number(e);return!Number.isFinite(r)||r<=0?fv:r}function hv(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function Q1(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 gv(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(Q1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function eU(t,e,r={}){let n=new Map;for(let a of e)n.set(ln(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([ln(t)]);for(let a=0;a<64;a+=1){let l=n.get(ln(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let d={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let c=ln(l.sender);if(o.has(c))break;s.unshift(d),o.add(c),i=l.sender}return s}function lf(t,e){let r=ln(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let d=ln(l.sender),c=ln(l.receiver);d!==a&&c!==a||(i.includes(l)||i.push(l),n.has(d)||(n.add(d),s.push(d)),n.has(c)||(n.add(c),s.push(c)))}}return i.sort((o,a)=>o.at-a.at)}function tU(t,e){let r=lf(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function mv(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function ln(t){return`${t.teamfile}\0${t.alias}`}function rU(t){return t.map(e=>`${Y1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var z1,Z1,fv,li=w(()=>{"use strict";z1=6e4,Z1=2,fv=8*60*60*1e3});function yv(t){if(t.length===0||!t.startsWith("---"))throw new Ht("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2415
2415
|
`);if(e[0]!=="---")throw new Ht("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 Ht(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let d=l[1],c=l[2].trim();if(!nU.has(d))throw new Ht(`unknown frontmatter key "${d}" \u2014 allowed keys: ${Va.join(", ")}`);r[d]=c}if(n===-1)throw new Ht("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Va)if(r[o]===void 0)throw new Ht(`missing required frontmatter key "${o}" \u2014 required: ${Va.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 Va,nU,Ht,Ev=w(()=>{"use strict";Va=["title","description","members"],nU=new Set(Va),Ht=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as sU,writeFileSync as H7,renameSync as X7,existsSync as Tv}from"node:fs";import{basename as iU,resolve as ts,dirname as df}from"node:path";function aU(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 lU(t){return/^\s*_MEMBER_\s+\S/.test(t)}function dU(t){return/^\s*_SESSION_\s+\S/.test(t)}function cU(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Ya(t){let e=iU(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function ot(t){let e=sU(t,"utf-8"),r=df(ts(t)),n=uf(e,Ya(t),{baseDir:r,sourcePath:ts(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ts(r,s.sessiondir));return n}function uf(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2416
2416
|
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=yv(i)}catch(l){if(l instanceof Ht)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
2417
2417
|
`);for(let l=0;l<a.length;l++){let d=a[l],c=l+1;if(dU(d))throw new Error(`line ${c}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(cU(d)||!lU(d))continue;let u=aU(d);for(let p of Object.keys(u))if(!wv.includes(p))throw new Error(`line ${c}: unknown key "${p}" on _MEMBER_ line: ${d.trim()}
|
|
2418
2418
|
allowed keys: ${wv.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${c}: member line missing provider (or teamfile): ${d.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function ff(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()===cf.toLowerCase());n.length>1&&r.push({field:cf,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?ts(e,i.teamfile):ts(i.teamfile);if(!Tv(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=ot(a),d=Xt(l);d?d.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else oU.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 Xt(t){return t.members.find(e=>e.alias.toLowerCase()===cf.toLowerCase())}function mf(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=ts(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),!Tv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=ot(i),l=Xt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return mf(l,df(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||df(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function za(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var cf,oU,wv,fr=w(()=>{"use strict";Ev();cf="Lead",oU=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"]);wv=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as uU}from"node:crypto";import{existsSync as _f,readFileSync as Sv,realpathSync as fU}from"node:fs";import{basename as vv,dirname as mU,resolve as bv}from"node:path";function be(t,e){let r=bv(t);if(_f(r))return fU(r);if(e!==void 0){let n=_U(t,r,e);if(n!==null)return n}return r}function Qa(t,e){let r=mU(e),n=uf(t,Ya(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bv(r,s.sessiondir));return n}function Ve(t,e,r=n=>{process.stderr.write(`warning: ${n}
|
|
2419
2419
|
`)}){let n=be(t,pU(e)?e:void 0);if(_f(n)){let i=Sv(n,"utf8"),o=Qa(i,n);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(n)===null&&hU(o)&&yU(e,n,o,i,r),o}let s=e?.getRootTeam(n)??null;throw s!==null?new Error(`teamfile missing on disk: ${n} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function pU(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function _U(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=vv(t),i=Ya(t),o=r.listRootTeams().filter(l=>(vv(l.teamfile_path)===s||l.name===i)&&_f(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 hU(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=pf)}function hf(t,e,r){let n=be(e),s=r.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=pf);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=be(i.teamfile_path),o===n)continue;a=Sv(o,"utf8")}catch(d){if(gU(d))continue;throw d}let l=Qa(a,o);for(let d of s){let c=l.members.find(u=>u.teamfile===void 0&&u.session===d.session&&(u.session?.length??0)>=pf);if(c!==void 0)throw new Za(`sessionid ownership conflict: ${n}:${d.alias} and ${o}:${c.alias} both use sessionid "${d.session}"`)}}}function gU(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function yU(t,e,r,n,s){try{hf(t,e,r)}catch(o){if(!(o instanceof Za))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:uU("sha256").update(n).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var pf,Za,mr=w(()=>{"use strict";fr();pf=5,Za=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as EU}from"node:fs";import{dirname as kv}from"node:path";function vU(t){return wU.test(t)||TU.test(t)}function Iv(t){return el.test(t)}function dn(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!el.test(n)?null:{teamfile:r,alias:n}}function Ne(t,e,r){if(!t.endsWith(".lmctl"))throw new ke(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Iv(e))throw new ke(`lmctl: "${e}" is not a valid alias (must match ${el.source}).`);let n=be(t,r);if(r===void 0&&!EU(n))throw new ke(`lmctl: teamfile not found: ${t}`);let s;try{s=Ve(n,r)}catch(o){throw new ke(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ke(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=za(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ke(`lmctl: alias "${e}" not found in ${t}.
|
|
2420
2420
|
Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=mf(i,kv(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ke(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
|
|
2421
|
-
Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??kv(n),isLead:Xt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function
|
|
2421
|
+
Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??kv(n),isLead:Xt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function Pr(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=dn(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?Iv(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${el.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
2422
2422
|
Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(vU(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.
|
|
2423
2423
|
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}".
|
|
2424
2424
|
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.
|
|
2425
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ke,wU,TU,el,at=w(()=>{"use strict";fr();mr();ke=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},wU=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,TU=/^ses_[A-Za-z0-9_-]+$/,el=/^[A-Za-z][A-Za-z0-9_-]*$/});function tl(t){return bU.has(t)}function yf(){return gf===null&&(gf=Ct(jt())),gf}function Ef(t,e,r={}){if(!tl(t))return null;try{let n=yf().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?to({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?SU[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...Nv[t]??[]]}catch{return null}}function rl(t,e,r={}){let n=Ef(t,e,r);return n===null?null:n.join(" ")}function
|
|
2426
|
-
${t.receipt}`:`relay delivery error: ${t.error}`}function CU(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-af(e)).toISOString())}function $U(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var Rv,Cv=w(()=>{"use strict";ht();Ha();Ka();li();at();nl();Rv=10});function di(){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 DU(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($v);MU.has(s)&&r.add(s)}}return r}function Mv(t){let e=t.intervalMs??di(),r=t.runOnceFn??on,n=new Set(t.features??DU()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,d=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(d=(t.startRollupUpdaterFn??ZT)(t.dal));let c=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>c(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=Dv(t.dal,n,t.monitorSessionActivityFn??$c,e,s).finally(()=>{l=null})),l.finally(()=>u(Mc(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=jU(t.dal,r,t.collectSessionSizesFn??Tg,t.scanIntakeFn??ea,t.monitorSessionActivityFn??$c,t.mailboxRelayFn??Ov,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),d?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;c(m),n.has("session-monitor")&&u(m)}return f}async function jU(t,e,r,n,s,i,o,a,l,d){d.in_flight=!0,d.last_started_at=new Date().toISOString(),d.last_error=null;let c=[],u=0,f=0,m=[],p=null,h=PU();try{if(l.has("durable-memory-policies")&&Aw({dal:t}),l.has("drift-detectors")&&tv({dal:t}),l.has("intake")&&(m=await n(t)),l.has("job-worker"))for(;;){let _=await e({dal:t,worker_id:o,lease_ms:6e5});if(_===null)break;c.push(_)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let _=await r(t);u=_.recorded,f=_.failed}l.has("session-monitor")&&(p=await Dv(t,l,s,a,d))}catch(_){d.last_error=_ instanceof Error?_.message:String(_);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:d.last_error})})}catch{}}finally{d.in_flight=!1,d.cycles+=1,d.last_jobs_processed=c.length,d.last_session_sizes_recorded=u,d.last_session_size_failures=f,d.last_intake_scanned=m.reduce((_,g)=>_+g.scanned,0),d.last_intake_new_jobs=m.reduce((_,g)=>_+g.new_jobs,0),d.last_intake_failures=m.filter(_=>_.error!==void 0).length,d.last_session_hung_detected=p?.hung_detected??0,d.last_mailbox_relay_scanned=h.scanned,d.last_mailbox_relay_delivered=h.delivered,d.last_mailbox_relay_errors=h.errors,d.jobs_processed+=c.length,d.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function PU(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function Dv(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=Mc(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 $v,MU,wf=w(()=>{"use strict";iu();va();Du();No();QT();rv();Dc();Cv();$v=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],MU=new Set($v)});function jv(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 Pv=w(()=>{"use strict"});import{mkdirSync as FU,readFileSync as UU,readdirSync as WU,statSync as qU,writeFileSync as BU}from"node:fs";import{dirname as HU,join as Uv,sep as Fv}from"node:path";function sl(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Wv:return XU(t,s.input);case qv:return JU(t,s.input);case Bv:return GU(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Sf,GetObjectCommand:vf,PutObjectCommand:Tf}}}function XU(t,e){let r=Hv(t,e.Key);return FU(HU(r),{recursive:!0}),BU(r,e.Body),{}}function JU(t,e){let r=Hv(t,e.Key),n;try{n=UU(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 GU(t,e){let r=e.Prefix??"";Xv(r);let s=KU(t).sort((c,u)=>c.key<u.key?-1:c.key>u.key?1:0).filter(c=>c.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(c=>c.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let d={Contents:a.map(c=>({Key:c.key,LastModified:c.lastModified})),IsTruncated:l};return l&&(d.NextContinuationToken=a[a.length-1].key),d}function Hv(t,e){return Xv(e),Uv(t,e)}function Xv(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function KU(t){let e=[],r=(n,s)=>{let i;try{i=WU(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=Uv(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let d=Fv==="/"?a:a.split(Fv).join("/");e.push({key:d,lastModified:qU(l).mtime})}}};return r(t,""),e}var Wv,qv,Bv,Tf,vf,Sf,bf=w(()=>{"use strict";Wv="localfs-put",qv="localfs-get",Bv="localfs-list",Tf=class{input;_localfsTag=Wv;constructor(e){this.input=e}},vf=class{input;_localfsTag=qv;constructor(e){this.input=e}},Sf=class{input;_localfsTag=Bv;constructor(e){this.input=e}}});function Jv(){return{put:0,get:0,list:0}}function kf(t,e=VU){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function If(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var VU,il,Nf=w(()=>{"use strict";VU={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};il=class{counts=Jv();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Jv(),e}estimateCostUsd(e){return kf(this.counts,e)}}});function Gv(t){let e=t.now??Date.now,r=t.timers??YU,n=null,s=null;async function i(){let l=e(),d=If(l),c=t.meter.drain();(c.put>0||c.get>0||c.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:d,put:c.put,get:c.get,list:c.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,d),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(d,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(d)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=kf(m);if(n!==d&&p>=t.ceilingUsd){n=d,t.log?.(`[usage] quota exceeded period=${d} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:d,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===If(e())}}}var YU,Kv=w(()=>{"use strict";Nf();YU={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Af=w(()=>{"use strict";Na();xa();xa()});function zU(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 ZU(t){return t.reply_to!==void 0&&t.response!==void 0}function QU(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Vv(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 ol,ci,Yv=w(()=>{"use strict";Af();ol=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},ci=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 ol("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=cr(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let d=r?.abortSignal,c;if(d!==void 0){if(d.aborted){l(Vv(d));return}c=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Vv(d)))},d.addEventListener("abort",c,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...c!==void 0?{abortListener:c}:{},...d!==void 0?{abortSignal:d}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new ol;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=zU(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(ZU(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??QU(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let d=l instanceof Error?l.message:String(l),c=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:c,message:d}}}let a={message_id:cr(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 xf(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 zv=w(()=>{"use strict"});function Rf(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 Zv=w(()=>{"use strict"});function Of(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 Lf,Qv=w(()=>{"use strict";Lf="daemon:events"});function tS(t){return{kind:"prompt",prompt_id:t.prompt_id??cr(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Cf(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 eS,$f=w(()=>{"use strict";Af();eS="prompt:root"});function ui(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(nS(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function eW(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(nS(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function rS(t,e=60){if(typeof t!="string"||t==="")return!0;let r=eW(t);return r===null?!0:Date.now()/1e3>=r-e}function nS(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 Mf=w(()=>{"use strict"});async function al(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":tW},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let d=JSON.parse(s);l=d.message??d.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var tW,Df=w(()=>{"use strict";tW="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as sS,mkdirSync as iS,readFileSync as oS,writeFileSync as aS}from"node:fs";import{homedir as lS}from"node:os";import{dirname as dS,join as cS}from"node:path";function fi(){return process.env.LMCTL_DEVICE_AUTH_PATH??cS(lS(),".lmctl","device-auth.json")}function uS(){return process.env.LMCTL_TOKEN_PATH??cS(lS(),".lmctl","cli-tokens.json")}function jf(t=fi()){try{let e=JSON.parse(oS(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 fS(t,e=fi()){iS(dS(e),{recursive:!0,mode:448}),aS(e,JSON.stringify(t,null,2));try{sS(e,384)}catch{}}function Pf(t,e=uS()){let r={};try{r=JSON.parse(oS(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};iS(dS(e),{recursive:!0,mode:448}),aS(e,JSON.stringify(s,null,2));try{sS(e,384)}catch{}}async function mS(t){let e=t.deviceAuthPath??fi(),r=jf(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await al({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Pf({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??uS()),{idToken:n.idToken,userId:r.userId}}var Ff=w(()=>{"use strict";Df()});import{existsSync as rW,realpathSync as nW}from"node:fs";import{dirname as sW}from"node:path";function Uf(t){iW(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function iW(t){let e=t.payload.root_teamfile;try{e=nW(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return ss({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let r=aW(e);if("error"in r)return ss({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=Ot(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:uW(t.env??process.env)});if(!n.acquired){let i=cW(r.alias,n.current);return ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=wr(i=>t.store.heartbeatAgentInflight(n.lease,n.leaseId,i),{intervalMs:En(t.env??process.env)});try{let o=await(t.chat??Pt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",d=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,c=a||l?"error":"ok";return c==="ok"?await lW(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:o.text,status:c,error_detail:null,log:t.log}):ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:d??"provider failed",reason:a?"stalled":"empty_response"}),{status:c,response:c==="error"?null:o.text,error_detail:d}}catch(i){let o=i instanceof Error?i.message:String(i);return ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(n.lease,n.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function ss(t){D({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:oW(t.message)})}function oW(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function aW(t){if(!rW(t))return{error:`prompt root missing/unreadable: ${t}`};let e=ot(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Xt(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??sW(t)}}async function lW(t,e){let r=hS(e.message),n=e.response===null?null:hS(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 hS(t){return t.length<=pS?{text:t,truncated:!1}:{text:t.slice(0,pS),truncated:!0}}function dW(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function cW(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:dW(t,e)}function uW(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return _S;let r=Number(e);return!Number.isFinite(r)||r<=0?_S:r}var pS,_S,gS=w(()=>{"use strict";Ft();fr();pe();ht();pS=256*1024,_S=30*60*1e3});import{chmodSync as SS,existsSync as fW,mkdirSync as bS,readFileSync as ul,writeFileSync as kS}from"node:fs";import{dirname as Wf,resolve as ll,join as IS}from"node:path";import{fileURLToPath as mW}from"node:url";import{homedir as NS}from"node:os";import{CognitoIdentityClient as pW,GetIdCommand as _W}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as yS}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as hW,ListObjectsV2Command as gW,PutObjectCommand as yW,S3Client as ES}from"@aws-sdk/client-s3";function pi(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:SW(t.selfUrl),n={},s;for(let b of r)if(fW(b)){n=vW(b),s=b;break}let i=(...b)=>{for(let x of b)if(typeof x=="string"&&x!=="")return x},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??EW,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??wW,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??TW,d=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",c=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??fl,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=cl(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=cl(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=cl(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=cl(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:c,region:d,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function vW(t){try{let e=ul(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function SW(t){let e=Wf(mW(t??import.meta.url));return[ll(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ll(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ll(e,"..","..","..","infra","terraform","terraform.tfstate"),ll(e,"..","..","infra","terraform","terraform.tfstate")]}function cl(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function bW(t){let e=kW(t.intervalMs)??AS,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let d=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},c=setInterval(()=>{d()},e);return typeof c.unref=="function"&&c.unref(),{pollNow:d,stop(){a=!0,clearInterval(c)}}}function kW(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function xS(t){let e=t.tokenPath??IS(NS(),".lmctl","cli-tokens.json"),r=TS(t.tokenPath);if(rS(r.cognito?.idToken)&&jf()!==null)try{await mS({region:t.region,clientId:t.cognitoClientId??fl,cliTokensPath:e}),r=TS(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Y=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Y}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await vS({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=yS({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ES({region:t.region,credentials:a}),d={ListObjectsV2Command:gW,GetObjectCommand:hW,PutObjectCommand:yW},c=ui(n),u=c??i,f=t.deviceId,m=Vn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Y=!1,B=0;for(;!Y&&B<2;){B+=1;try{let k=ka(m,"web"),I=0,C;do{let W=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let U of W.Contents??[]){let j=Ia(U.Key??"",m,"web");j!==void 0&&j>I&&(I=j)}C=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(C!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${u}`),Y=!0}catch(k){let I=k instanceof Error?k.message:String(k);if(o&&B===1&&AW(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),NW(e),o=!1,i=await vS({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=yS({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ES({region:t.region,credentials:a}),m=Vn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let _=null,g=t.terminalSessionManager,y=t.persistentSessionManager,E=t.promptTriggerStore,v=new il,b=new an({bucket:t.mailboxBucket,identityId:i,...c!==null?{userId:c}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:d,selfRole:"agent",onS3Op:A=>v.record(A),onMessage:async A=>{if(g!==void 0&&xf(A.payload)){g.onInbound(A.payload);return}if(y!==void 0&&Rf(A.payload)){await y.onInbound(A.payload);return}if(!Of(A.payload)){if(E!==void 0&&Cf(A.payload)){Uf({store:E,payload:A.payload,log:t.log});return}_!==null&&await _.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});_=new ci({client:b,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async A=>b.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>b.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>b.putMessage({conversation_id:Lf,payload:A});b.start();let H=t.chatLogTailStore===void 0?void 0:bW({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??AS,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let F=t.deviceId??i,$=`${u}/usage/`,R;return R=t.usageStore===void 0?void 0:Gv({meter:v,store:t.usageStore,userId:u,deviceId:F,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Y,ceilingUsd:B})=>{t.log?.(`[usage] month ${A} cost $${Y.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),b.stop().catch(()=>{}),R?.stop()},publishOwnRollup:async(A,Y)=>{await l.send(new d.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${$}${F}-${A}.json`,Body:JSON.stringify({...Y,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Y={put:0,get:0,list:0},B;do{let k=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let I of k.Contents??[]){let C=I.Key??"";if(C.endsWith(`-${A}.json`))try{let W=await l.send(new d.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(W.Body===void 0)continue;let U=JSON.parse(await W.Body.transformToString("utf-8"));Y.put+=U.put??0,Y.get+=U.get??0,Y.list+=U.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Y},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:b,fetchClient:_,publishDaemonEvent:x,async stop(){H?.stop(),R!==void 0&&(await R.flushNow().catch(()=>{}),R.stop()),await _.stop().catch(()=>{}),await b.stop().catch(()=>{})}}}async function RS(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:sl(t.rootDir),r=Vn({identityId:mi,userId:mi,deviceId:wS}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new an({bucket:"local",identityId:mi,userId:mi,deviceId:wS,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async d=>{if(s!==void 0&&xf(d.payload)){s.onInbound(d.payload);return}if(i!==void 0&&Rf(d.payload)){await i.onInbound(d.payload);return}if(!Of(d.payload)){if(o!==void 0&&Cf(d.payload)){Uf({store:o,payload:d.payload,log:t.log});return}n!==null&&await n.handleIncoming(d.payload,d)}},pollIntervalMs:t.pollIntervalMs??dl,readIntervalMs:t.readIntervalMs??dl,heartbeatIdleMs:t.heartbeatIdleMs??dl,backoffReadIntervalMs:t.backoffReadIntervalMs??dl});n=new ci({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async d=>a.putMessage({conversation_id:`terminal:${d.session_id}`,payload:d})),i!==void 0&&i.setPublish(async d=>a.putMessage({conversation_id:`provider:${d.session_id}`,payload:d}));let l=d=>a.putMessage({conversation_id:Lf,payload:d});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:mi,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TS(t){let e=t??IS(NS(),".lmctl","cli-tokens.json");try{let r=ul(e,"utf8");return JSON.parse(r)}catch{return{}}}function IW(t,e){if(e===void 0||e==="")return;let r={};try{let s=ul(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};bS(Wf(t),{recursive:!0,mode:448}),kS(t,JSON.stringify(n,null,2));try{SS(t,384)}catch{}}function NW(t){let e={};try{let n=ul(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,bS(Wf(t),{recursive:!0,mode:448}),kS(t,JSON.stringify(r,null,2));try{SS(t,384)}catch{}}async function vS(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new pW({region:t.region}).send(new _W({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{IW(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 AW(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 AS,dl,fl,EW,wW,TW,mi,wS,qf=w(()=>{"use strict";Ra();bf();Nf();Kv();Yv();zv();Zv();Qv();$f();Na();Mf();Ff();gS();AS=3e3,dl=1e3,fl="79u5jhkk46qofog661c9i0bdcs",EW="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",wW="us-east-1_4iUdFggDn",TW="lmctl-next-preview-mailbox-254332045686";mi="local",wS="local"});import{spawn as Jf}from"node:child_process";import{createInterface as LS}from"node:readline";var Bf,Hf,Xf,OS,CS=w(()=>{"use strict";so();pe();Ls();Bf=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=Jf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=LS({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+`
|
|
2425
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ke,wU,TU,el,at=w(()=>{"use strict";fr();mr();ke=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},wU=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,TU=/^ses_[A-Za-z0-9_-]+$/,el=/^[A-Za-z][A-Za-z0-9_-]*$/});function tl(t){return bU.has(t)}function yf(){return gf===null&&(gf=Ct(jt())),gf}function Ef(t,e,r={}){if(!tl(t))return null;try{let n=yf().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?to({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?SU[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...Nv[t]??[]]}catch{return null}}function rl(t,e,r={}){let n=Ef(t,e,r);return n===null?null:n.join(" ")}function We(t,e){return yf().getSession(t,e)}async function rs(t){return(await yf().resolveSessions(t)).map(r=>r.provider.name)}var Nv,SU,bU,Av,gf,Jt=w(()=>{"use strict";Ft();Ed();Nv={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},SU={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t]},bU=new Set(Object.keys(Nv)),Av=/^[\w.:-]+$/;gf=null});function kU(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return xv;let r=Number(e);return!Number.isFinite(r)||r<=0?xv:r}async function IU(t,e,r){try{let n=Ne(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let d=await rs(s);if(d.length!==1)return null;i=d[0]}let o=await We(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 ns(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??kU(),o=await IU(t,r,n),a=o!==null&&o>=i;return a&&D({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 xv,nl=w(()=>{"use strict";pe();Jt();at();xv=36e5});function NU(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return Rv;let r=Number(e);return!Number.isFinite(r)||r<=0?Rv:Math.max(1,Math.trunc(r))}async function Ov(t){let e=t.env??process.env,r=t.maxBatches??NU(e),n=$U(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};CU(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(Lv(l)));if(o===void 0)break;i.add(Lv(o)),s.scanned+=1;let a=await AU(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 Lv(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function AU(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};Ba(t,n.receiver_teamfile,n.receiver_alias);let i=_t(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await ns(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null,l=null;try{let d=Ne(n.receiver_teamfile,n.receiver_alias,t),c=Ot(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:Bt(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a={row:c.lease,leaseId:c.leaseId},l=Tr(f=>t.heartbeatAgentInflight(a.row,a.leaseId,f),{intervalMs:En(r)}),n.message_type==="response"){let f=await Ja({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},io:e,permissionMode:"yolo",env:r});return LU(f)}let u=await es({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return RU(t,u)}catch(d){return xU(t,n,`relay delivery error: ${d instanceof Error?d.message:String(d)}`)}finally{if(l!==null&&clearInterval(l),a!==null)try{t.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function xU(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 RU(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=OU(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function LU(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 OU(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
|
|
2426
|
+
${t.receipt}`:`relay delivery error: ${t.error}`}function CU(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-af(e)).toISOString())}function $U(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var Rv,Cv=w(()=>{"use strict";ht();Ha();Ka();li();at();nl();Rv=10});function di(){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 DU(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($v);MU.has(s)&&r.add(s)}}return r}function Mv(t){let e=t.intervalMs??di(),r=t.runOnceFn??on,n=new Set(t.features??DU()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,d=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(d=(t.startRollupUpdaterFn??ZT)(t.dal));let c=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>c(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=Dv(t.dal,n,t.monitorSessionActivityFn??$c,e,s).finally(()=>{l=null})),l.finally(()=>u(Mc(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=jU(t.dal,r,t.collectSessionSizesFn??Tg,t.scanIntakeFn??ea,t.monitorSessionActivityFn??$c,t.mailboxRelayFn??Ov,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),d?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;c(m),n.has("session-monitor")&&u(m)}return f}async function jU(t,e,r,n,s,i,o,a,l,d){d.in_flight=!0,d.last_started_at=new Date().toISOString(),d.last_error=null;let c=[],u=0,f=0,m=[],p=null,h=PU();try{if(l.has("durable-memory-policies")&&Aw({dal:t}),l.has("drift-detectors")&&tv({dal:t}),l.has("intake")&&(m=await n(t)),l.has("job-worker"))for(;;){let _=await e({dal:t,worker_id:o,lease_ms:6e5});if(_===null)break;c.push(_)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let _=await r(t);u=_.recorded,f=_.failed}l.has("session-monitor")&&(p=await Dv(t,l,s,a,d))}catch(_){d.last_error=_ instanceof Error?_.message:String(_);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:d.last_error})})}catch{}}finally{d.in_flight=!1,d.cycles+=1,d.last_jobs_processed=c.length,d.last_session_sizes_recorded=u,d.last_session_size_failures=f,d.last_intake_scanned=m.reduce((_,g)=>_+g.scanned,0),d.last_intake_new_jobs=m.reduce((_,g)=>_+g.new_jobs,0),d.last_intake_failures=m.filter(_=>_.error!==void 0).length,d.last_session_hung_detected=p?.hung_detected??0,d.last_mailbox_relay_scanned=h.scanned,d.last_mailbox_relay_delivered=h.delivered,d.last_mailbox_relay_errors=h.errors,d.jobs_processed+=c.length,d.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function PU(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function Dv(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=Mc(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 $v,MU,wf=w(()=>{"use strict";iu();va();Du();No();QT();rv();Dc();Cv();$v=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],MU=new Set($v)});function jv(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 Pv=w(()=>{"use strict"});import{mkdirSync as FU,readFileSync as UU,readdirSync as WU,statSync as qU,writeFileSync as BU}from"node:fs";import{dirname as HU,join as Uv,sep as Fv}from"node:path";function sl(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Wv:return XU(t,s.input);case qv:return JU(t,s.input);case Bv:return GU(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Sf,GetObjectCommand:vf,PutObjectCommand:Tf}}}function XU(t,e){let r=Hv(t,e.Key);return FU(HU(r),{recursive:!0}),BU(r,e.Body),{}}function JU(t,e){let r=Hv(t,e.Key),n;try{n=UU(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 GU(t,e){let r=e.Prefix??"";Xv(r);let s=KU(t).sort((c,u)=>c.key<u.key?-1:c.key>u.key?1:0).filter(c=>c.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(c=>c.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let d={Contents:a.map(c=>({Key:c.key,LastModified:c.lastModified})),IsTruncated:l};return l&&(d.NextContinuationToken=a[a.length-1].key),d}function Hv(t,e){return Xv(e),Uv(t,e)}function Xv(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function KU(t){let e=[],r=(n,s)=>{let i;try{i=WU(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=Uv(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let d=Fv==="/"?a:a.split(Fv).join("/");e.push({key:d,lastModified:qU(l).mtime})}}};return r(t,""),e}var Wv,qv,Bv,Tf,vf,Sf,bf=w(()=>{"use strict";Wv="localfs-put",qv="localfs-get",Bv="localfs-list",Tf=class{input;_localfsTag=Wv;constructor(e){this.input=e}},vf=class{input;_localfsTag=qv;constructor(e){this.input=e}},Sf=class{input;_localfsTag=Bv;constructor(e){this.input=e}}});function Jv(){return{put:0,get:0,list:0}}function kf(t,e=VU){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function If(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var VU,il,Nf=w(()=>{"use strict";VU={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};il=class{counts=Jv();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Jv(),e}estimateCostUsd(e){return kf(this.counts,e)}}});function Gv(t){let e=t.now??Date.now,r=t.timers??YU,n=null,s=null;async function i(){let l=e(),d=If(l),c=t.meter.drain();(c.put>0||c.get>0||c.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:d,put:c.put,get:c.get,list:c.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,d),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(d,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(d)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=kf(m);if(n!==d&&p>=t.ceilingUsd){n=d,t.log?.(`[usage] quota exceeded period=${d} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:d,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===If(e())}}}var YU,Kv=w(()=>{"use strict";Nf();YU={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Af=w(()=>{"use strict";Na();xa();xa()});function zU(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 ZU(t){return t.reply_to!==void 0&&t.response!==void 0}function QU(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Vv(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 ol,ci,Yv=w(()=>{"use strict";Af();ol=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},ci=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 ol("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=cr(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let d=r?.abortSignal,c;if(d!==void 0){if(d.aborted){l(Vv(d));return}c=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Vv(d)))},d.addEventListener("abort",c,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...c!==void 0?{abortListener:c}:{},...d!==void 0?{abortSignal:d}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new ol;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=zU(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(ZU(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??QU(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let d=l instanceof Error?l.message:String(l),c=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:c,message:d}}}let a={message_id:cr(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 xf(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 zv=w(()=>{"use strict"});function Rf(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 Zv=w(()=>{"use strict"});function Of(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 Lf,Qv=w(()=>{"use strict";Lf="daemon:events"});function tS(t){return{kind:"prompt",prompt_id:t.prompt_id??cr(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Cf(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 eS,$f=w(()=>{"use strict";Af();eS="prompt:root"});function ui(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(nS(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function eW(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(nS(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function rS(t,e=60){if(typeof t!="string"||t==="")return!0;let r=eW(t);return r===null?!0:Date.now()/1e3>=r-e}function nS(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 Mf=w(()=>{"use strict"});async function al(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":tW},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let d=JSON.parse(s);l=d.message??d.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var tW,Df=w(()=>{"use strict";tW="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as sS,mkdirSync as iS,readFileSync as oS,writeFileSync as aS}from"node:fs";import{homedir as lS}from"node:os";import{dirname as dS,join as cS}from"node:path";function fi(){return process.env.LMCTL_DEVICE_AUTH_PATH??cS(lS(),".lmctl","device-auth.json")}function uS(){return process.env.LMCTL_TOKEN_PATH??cS(lS(),".lmctl","cli-tokens.json")}function jf(t=fi()){try{let e=JSON.parse(oS(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 fS(t,e=fi()){iS(dS(e),{recursive:!0,mode:448}),aS(e,JSON.stringify(t,null,2));try{sS(e,384)}catch{}}function Pf(t,e=uS()){let r={};try{r=JSON.parse(oS(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};iS(dS(e),{recursive:!0,mode:448}),aS(e,JSON.stringify(s,null,2));try{sS(e,384)}catch{}}async function mS(t){let e=t.deviceAuthPath??fi(),r=jf(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await al({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Pf({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??uS()),{idToken:n.idToken,userId:r.userId}}var Ff=w(()=>{"use strict";Df()});import{existsSync as rW,realpathSync as nW}from"node:fs";import{dirname as sW}from"node:path";function Uf(t){iW(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function iW(t){let e=t.payload.root_teamfile;try{e=nW(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return ss({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let r=aW(e);if("error"in r)return ss({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=Ot(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:uW(t.env??process.env)});if(!n.acquired){let i=cW(r.alias,n.current);return ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=Tr(i=>t.store.heartbeatAgentInflight(n.lease,n.leaseId,i),{intervalMs:En(t.env??process.env)});try{let o=await(t.chat??Pt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",d=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,c=a||l?"error":"ok";return c==="ok"?await lW(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:o.text,status:c,error_detail:null,log:t.log}):ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:d??"provider failed",reason:a?"stalled":"empty_response"}),{status:c,response:c==="error"?null:o.text,error_detail:d}}catch(i){let o=i instanceof Error?i.message:String(i);return ss({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(n.lease,n.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function ss(t){D({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:oW(t.message)})}function oW(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function aW(t){if(!rW(t))return{error:`prompt root missing/unreadable: ${t}`};let e=ot(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Xt(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??sW(t)}}async function lW(t,e){let r=hS(e.message),n=e.response===null?null:hS(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 hS(t){return t.length<=pS?{text:t,truncated:!1}:{text:t.slice(0,pS),truncated:!0}}function dW(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function cW(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:dW(t,e)}function uW(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return _S;let r=Number(e);return!Number.isFinite(r)||r<=0?_S:r}var pS,_S,gS=w(()=>{"use strict";Ft();fr();pe();ht();pS=256*1024,_S=30*60*1e3});import{chmodSync as SS,existsSync as fW,mkdirSync as bS,readFileSync as ul,writeFileSync as kS}from"node:fs";import{dirname as Wf,resolve as ll,join as IS}from"node:path";import{fileURLToPath as mW}from"node:url";import{homedir as NS}from"node:os";import{CognitoIdentityClient as pW,GetIdCommand as _W}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as yS}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as hW,ListObjectsV2Command as gW,PutObjectCommand as yW,S3Client as ES}from"@aws-sdk/client-s3";function pi(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:SW(t.selfUrl),n={},s;for(let b of r)if(fW(b)){n=vW(b),s=b;break}let i=(...b)=>{for(let x of b)if(typeof x=="string"&&x!=="")return x},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??EW,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??wW,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??TW,d=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",c=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??fl,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=cl(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=cl(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=cl(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=cl(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:c,region:d,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function vW(t){try{let e=ul(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function SW(t){let e=Wf(mW(t??import.meta.url));return[ll(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ll(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ll(e,"..","..","..","infra","terraform","terraform.tfstate"),ll(e,"..","..","infra","terraform","terraform.tfstate")]}function cl(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function bW(t){let e=kW(t.intervalMs)??AS,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let d=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},c=setInterval(()=>{d()},e);return typeof c.unref=="function"&&c.unref(),{pollNow:d,stop(){a=!0,clearInterval(c)}}}function kW(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function xS(t){let e=t.tokenPath??IS(NS(),".lmctl","cli-tokens.json"),r=TS(t.tokenPath);if(rS(r.cognito?.idToken)&&jf()!==null)try{await mS({region:t.region,clientId:t.cognitoClientId??fl,cliTokensPath:e}),r=TS(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Y=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Y}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await vS({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=yS({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ES({region:t.region,credentials:a}),d={ListObjectsV2Command:gW,GetObjectCommand:hW,PutObjectCommand:yW},c=ui(n),u=c??i,f=t.deviceId,m=Vn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Y=!1,B=0;for(;!Y&&B<2;){B+=1;try{let k=ka(m,"web"),I=0,C;do{let W=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let U of W.Contents??[]){let j=Ia(U.Key??"",m,"web");j!==void 0&&j>I&&(I=j)}C=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(C!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${u}`),Y=!0}catch(k){let I=k instanceof Error?k.message:String(k);if(o&&B===1&&AW(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),NW(e),o=!1,i=await vS({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=yS({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ES({region:t.region,credentials:a}),m=Vn({identityId:i,userId:c,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let _=null,g=t.terminalSessionManager,y=t.persistentSessionManager,E=t.promptTriggerStore,v=new il,b=new an({bucket:t.mailboxBucket,identityId:i,...c!==null?{userId:c}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:d,selfRole:"agent",onS3Op:A=>v.record(A),onMessage:async A=>{if(g!==void 0&&xf(A.payload)){g.onInbound(A.payload);return}if(y!==void 0&&Rf(A.payload)){await y.onInbound(A.payload);return}if(!Of(A.payload)){if(E!==void 0&&Cf(A.payload)){Uf({store:E,payload:A.payload,log:t.log});return}_!==null&&await _.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});_=new ci({client:b,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async A=>b.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>b.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>b.putMessage({conversation_id:Lf,payload:A});b.start();let H=t.chatLogTailStore===void 0?void 0:bW({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??AS,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let F=t.deviceId??i,$=`${u}/usage/`,R;return R=t.usageStore===void 0?void 0:Gv({meter:v,store:t.usageStore,userId:u,deviceId:F,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Y,ceilingUsd:B})=>{t.log?.(`[usage] month ${A} cost $${Y.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),b.stop().catch(()=>{}),R?.stop()},publishOwnRollup:async(A,Y)=>{await l.send(new d.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${$}${F}-${A}.json`,Body:JSON.stringify({...Y,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Y={put:0,get:0,list:0},B;do{let k=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let I of k.Contents??[]){let C=I.Key??"";if(C.endsWith(`-${A}.json`))try{let W=await l.send(new d.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(W.Body===void 0)continue;let U=JSON.parse(await W.Body.transformToString("utf-8"));Y.put+=U.put??0,Y.get+=U.get??0,Y.list+=U.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Y},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:b,fetchClient:_,publishDaemonEvent:x,async stop(){H?.stop(),R!==void 0&&(await R.flushNow().catch(()=>{}),R.stop()),await _.stop().catch(()=>{}),await b.stop().catch(()=>{})}}}async function RS(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:sl(t.rootDir),r=Vn({identityId:mi,userId:mi,deviceId:wS}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new an({bucket:"local",identityId:mi,userId:mi,deviceId:wS,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async d=>{if(s!==void 0&&xf(d.payload)){s.onInbound(d.payload);return}if(i!==void 0&&Rf(d.payload)){await i.onInbound(d.payload);return}if(!Of(d.payload)){if(o!==void 0&&Cf(d.payload)){Uf({store:o,payload:d.payload,log:t.log});return}n!==null&&await n.handleIncoming(d.payload,d)}},pollIntervalMs:t.pollIntervalMs??dl,readIntervalMs:t.readIntervalMs??dl,heartbeatIdleMs:t.heartbeatIdleMs??dl,backoffReadIntervalMs:t.backoffReadIntervalMs??dl});n=new ci({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async d=>a.putMessage({conversation_id:`terminal:${d.session_id}`,payload:d})),i!==void 0&&i.setPublish(async d=>a.putMessage({conversation_id:`provider:${d.session_id}`,payload:d}));let l=d=>a.putMessage({conversation_id:Lf,payload:d});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:mi,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TS(t){let e=t??IS(NS(),".lmctl","cli-tokens.json");try{let r=ul(e,"utf8");return JSON.parse(r)}catch{return{}}}function IW(t,e){if(e===void 0||e==="")return;let r={};try{let s=ul(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};bS(Wf(t),{recursive:!0,mode:448}),kS(t,JSON.stringify(n,null,2));try{SS(t,384)}catch{}}function NW(t){let e={};try{let n=ul(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,bS(Wf(t),{recursive:!0,mode:448}),kS(t,JSON.stringify(r,null,2));try{SS(t,384)}catch{}}async function vS(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new pW({region:t.region}).send(new _W({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{IW(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 AW(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 AS,dl,fl,EW,wW,TW,mi,wS,qf=w(()=>{"use strict";Ra();bf();Nf();Kv();Yv();zv();Zv();Qv();$f();Na();Mf();Ff();gS();AS=3e3,dl=1e3,fl="79u5jhkk46qofog661c9i0bdcs",EW="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",wW="us-east-1_4iUdFggDn",TW="lmctl-next-preview-mailbox-254332045686";mi="local",wS="local"});import{spawn as Jf}from"node:child_process";import{createInterface as LS}from"node:readline";var Bf,Hf,Xf,OS,CS=w(()=>{"use strict";so();pe();Ls();Bf=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=Jf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=LS({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+`
|
|
2427
2427
|
`)}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+`
|
|
2428
2428
|
`)}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}}}},Hf=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Jf(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(`
|
|
2429
2429
|
`);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+`
|
|
@@ -2432,10 +2432,10 @@ ${t.receipt}`:`relay delivery error: ${t.error}`}function CU(t,e){t.reclaimStale
|
|
|
2432
2432
|
`)}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+`
|
|
2433
2433
|
`)}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}})}}},OS=t=>{switch(t){case"codex":return new Bf;case"claude":case"qwen":return new Hf;case"gemini":case"copilot":case"opencode":case"kimi":return new Xf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as xW}from"node:crypto";import{existsSync as DQ,mkdirSync as RW,readFileSync as LW,writeFileSync as OW}from"node:fs";import{homedir as CW}from"node:os";import{dirname as $W,join as MW}from"node:path";function ml(){return process.env.LMCTL_DEVICE_FILE??MW(CW(),".lmctl","device.json")}function cn(t=ml()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(LW(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 Gf(t=ml()){let e=cn(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:xW(),created_at:new Date().toISOString()};return RW($W(t),{recursive:!0}),OW(t,`${JSON.stringify(r,null,2)}
|
|
2434
2434
|
`,{encoding:"utf8",mode:384}),r}var Kf=w(()=>{"use strict"});import{mkdirSync as DW,readFileSync as $S,rmSync as jW,writeFileSync as PW}from"node:fs";import{dirname as MS,join as FW}from"node:path";function Gt(t=ne()){return FW(MS(t),"serve.pid")}function DS(t,e){let r=Gt(e);return DW(MS(r),{recursive:!0}),PW(r,`${JSON.stringify(t,null,2)}
|
|
2435
|
-
`,"utf-8"),r}function Vf(t){let e=Gt(t),r;try{r=$S(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 is(t){jW(Gt(t),{force:!0})}function pl(t){let e=UW(t),r=Vf(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Jp(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 UW(t){let e=Gt(t),r;try{r=$S(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 jS(){return Ql(process.pid)}var PS=w(()=>{"use strict";
|
|
2435
|
+
`,"utf-8"),r}function Vf(t){let e=Gt(t),r;try{r=$S(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 is(t){jW(Gt(t),{force:!0})}function pl(t){let e=UW(t),r=Vf(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Jp(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 UW(t){let e=Gt(t),r;try{r=$S(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 jS(){return Ql(process.pid)}var PS=w(()=>{"use strict";wr();ze()});var ZS={};he(ZS,{_resetStdoutEpipeGuardForTests:()=>JW,bootstrapAgentRestMailbox:()=>GS,installStdoutEpipeGuard:()=>BS,publishRegisteredWorkflowsOnStart:()=>JS,resolveLocalMailboxDir:()=>YS,resolveLocalWebuiDir:()=>VS,resolveServeConfig:()=>KS,runServe:()=>HW,runServeStatus:()=>HS,runServeStop:()=>XS,validateServeArgs:()=>zS});import{randomBytes as WW}from"node:crypto";import{existsSync as WS}from"node:fs";import{isIP as FS}from"node:net";import{homedir as qW}from"node:os";import{isAbsolute as qS,resolve as Yf}from"node:path";async function HW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(BW),0;let r=t[0];return r==="status"?HS(t.slice(1),e):r==="stop"?XS(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?US:`error: unknown serve subcommand: ${r}
|
|
2436
2436
|
|
|
2437
2437
|
${US.replace(/^error: [^\n]*\n\n/,"")}`),2):XW(t.slice(1),e)}async function XW(t,e){let r=zS(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2438
|
-
`),2;let n=
|
|
2438
|
+
`),2;let n=Be({path:ne()}),s={portCli:tq(t)},i;try{i=KS({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(b){return n.close(),e.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
|
|
2439
2439
|
`),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),jv(n);let o=sv(n);o>0&&e.stdout.write(`reconciled ${o} tracked invocation(s) with dead holders to 'aborted'
|
|
2440
2440
|
`);let a;if(r.localWebui!==void 0){let b=VS(r.localWebui.dir,process.env);if(b===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve start --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let x=YS(process.env),{s3:H,commands:F}=sl(x);a={webuiDir:b,rootDir:x,s3:H,commands:F},e.stdout.write(`local webui: serving SPA from ${b}; mailbox store ${x}
|
|
2441
2441
|
`)}let l=r.noDaemon?void 0:Mv({dal:n,intervalMs:di()}),d=a!==void 0?{missing:[],tfstateCandidatesChecked:[]}:pi({env:process.env});d.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${d.missing.join(", ")}; running without cloud sync`+(d.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${d.tfstateCandidatesChecked.length} candidate path${d.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${d.tfstatePathUsed} did not supply the missing fields)`)+`
|
|
@@ -2465,7 +2465,7 @@ ${US.replace(/^error: [^\n]*\n\n/,"")}`),2):XW(t.slice(1),e)}async function XW(t
|
|
|
2465
2465
|
`),0;let o=i,a=o.cycles??o.cycle_count;if(a!==void 0&&e.stdout.write(` cycles ${String(a)}
|
|
2466
2466
|
`),o.enabled_features!==void 0){let l=Array.isArray(o.enabled_features)?o.enabled_features.join(", "):String(o.enabled_features);e.stdout.write(` features ${l}
|
|
2467
2467
|
`)}return o.last_error!==void 0&&o.last_error!==null&&e.stdout.write(` last_error ${String(o.last_error)}
|
|
2468
|
-
`),0}async function VW(t,e){try{let r=t.dal??
|
|
2468
|
+
`),0}async function VW(t,e){try{let r=t.dal??Be({path:ne()}),n=t.dal===void 0,s=null;try{s=Hs(r,process.env,{stdout:{write:()=>{}},stderr:{write:()=>{}}}).token}finally{n&&r.close()}let i={Accept:"application/json"};s!==null&&s.length>0&&(i.Authorization=`Bearer ${s}`);let o=e.bind==="0.0.0.0"||e.bind==="::"||e.bind===""?"127.0.0.1":e.bind,a=new URL(`http://${o.includes(":")?`[${o}]`:o}:${e.port}/api/daemon/state`),l=await fetch(a,{headers:i,signal:AbortSignal.timeout(KW)});return l.ok?await l.json():null}catch{return null}}async function XS(t,e,r={}){let n=r.timeoutMs??zW;if(t.length>0)return e.stderr.write(`error: lmctl serve stop takes no arguments; got: ${t.join(" ")}
|
|
2469
2469
|
`),2;let s=ne(),i=pl(s);if(i.entry===null)return i.corrupt?(is(s),e.stdout.write(`serve: not running (pidfile was unreadable); cleared it
|
|
2470
2470
|
`),0):(e.stdout.write(`serve: not running (no pidfile); nothing to stop
|
|
2471
2471
|
`),0);if(i.stale)return is(s),e.stdout.write(i.staleReason==="pid-reused"?`serve: not running (pid ${i.entry.pid} belongs to a different process \u2014 pid reused); cleared stale pidfile without signalling it
|
|
@@ -2476,7 +2476,7 @@ ${US.replace(/^error: [^\n]*\n\n/,"")}`),2):XW(t.slice(1),e)}async function XW(t
|
|
|
2476
2476
|
or: rm ${Gt(s)} (if it is not)
|
|
2477
2477
|
`),1;try{process.kill(o,"SIGTERM")}catch(d){return(d!==null&&typeof d=="object"&&"code"in d?d.code:void 0)==="ESRCH"?(is(s),e.stdout.write(`serve: not running (pid ${o} already gone); cleared stale pidfile
|
|
2478
2478
|
`),0):(e.stderr.write(`error: could not signal pid ${o}: ${d instanceof Error?d.message:String(d)}
|
|
2479
|
-
`),1)}let l=Date.now()+n;for(;Date.now()<l;){if(!
|
|
2479
|
+
`),1)}let l=Date.now()+n;for(;Date.now()<l;){if(!Fe(o))return is(s),e.stdout.write(`serve: stopped (pid ${o}, port ${a})
|
|
2480
2480
|
`),0;await new Promise(d=>setTimeout(d,YW))}return e.stderr.write(`error: pid ${o} did not exit within ${n/1e3}s of SIGTERM; it may be shutting down slowly. Re-run \`lmctl serve stop\`, or \`kill -9 ${o}\` if it is wedged
|
|
2481
2481
|
`),1}function ZW(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function JS(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().filter(r=>WS(r.teamfile_path)).map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
|
|
2482
2482
|
`)}}async function GS(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await RS({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
@@ -2486,7 +2486,7 @@ ${US.replace(/^error: [^\n]*\n\n/,"")}`),2):XW(t.slice(1),e)}async function XW(t
|
|
|
2486
2486
|
`)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] WARNING: cloud mailbox auto-delivery is DISABLED; daemon continues without remote inbox relay: ${n}
|
|
2487
2487
|
`)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function KS(t){let{dal:e,cli:r,env:n,parsed:s,io:i}=t,o=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let d,c=e.getConfig("api.token");n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(d=n.LMCTL_API_TOKEN,c===null?o.push("api.token"):c!==d&&i.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this serve process.
|
|
2488
2488
|
`)):c!==null?d=c:(d=WW(32).toString("hex"),e.setConfig("api.token",d),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=e.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,e.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${QW(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
|
|
2489
|
-
`);return{port:a,apiUrl:u,apiToken:d}}function QW(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 eq(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new $a({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function VS(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=qS(r)?r:Yf(process.cwd(),r);return WS(`${n}/index.html`)?n:null}function YS(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?qS(e)?e:Yf(process.cwd(),e):Yf(qW(),".lmctl","local-mailbox")}function tq(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function zS(t,e=process.env){let r=nq(t);return typeof r=="string"?r:!rq(r.bind)&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${r.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:r}function rq(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let r=e.slice(7);return FS(r)===4&&r.split(".")[0]==="127"}return FS(e)===4&&e.split(".")[0]==="127"}function nq(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var BW,US,zf,KW,YW,zW,QS=w(()=>{"use strict";dt();zT();wf();Pv();Ha();au();qf();bf();Yu();zu();CS();Kf();ze();
|
|
2489
|
+
`);return{port:a,apiUrl:u,apiToken:d}}function QW(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 eq(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new $a({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function VS(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=qS(r)?r:Yf(process.cwd(),r);return WS(`${n}/index.html`)?n:null}function YS(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?qS(e)?e:Yf(process.cwd(),e):Yf(qW(),".lmctl","local-mailbox")}function tq(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function zS(t,e=process.env){let r=nq(t);return typeof r=="string"?r:!rq(r.bind)&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${r.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:r}function rq(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let r=e.slice(7);return FS(r)===4&&r.split(".")[0]==="127"}return FS(e)===4&&e.split(".")[0]==="127"}function nq(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var BW,US,zf,KW,YW,zW,QS=w(()=>{"use strict";dt();zT();wf();Pv();Ha();au();qf();bf();Yu();zu();CS();Kf();ze();wr();Bc();PS();BW=`usage: lmctl serve <start|status|stop> [options]
|
|
2490
2490
|
|
|
2491
2491
|
Manage the local lmctl daemon: HTTP API, web UI, queue daemon, terminal
|
|
2492
2492
|
manager, and agent services. A subcommand is REQUIRED \u2014 bare \`lmctl serve\`
|
|
@@ -2542,8 +2542,8 @@ unauthenticated daemon.
|
|
|
2542
2542
|
lmctl serve stop
|
|
2543
2543
|
|
|
2544
2544
|
Run 'lmctl serve --help' for details.
|
|
2545
|
-
`;zf=!1;KW=2e3;YW=100,zW=1e4});import{existsSync as sq,mkdirSync as iq,readFileSync as oq,renameSync as aq,unlinkSync as lq,writeFileSync as dq}from"node:fs";import{homedir as tb}from"node:os";import{dirname as _i,join as Ye,resolve as cq}from"node:path";function as(t,e,r){let n=_i(cq(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())Kt(Ye(o,".mcp.json"),"mcpServers",[
|
|
2546
|
-
`,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function mq(t,e){mt.mkdirSync(_i(t),{recursive:!0});let r=Ye(_i(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{mt.writeFileSync(r,e,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function Kt(t,e,r){try{if(!mt.existsSync(t))return;let n=JSON.parse(mt.readFileSync(t,"utf8"));if(!os(n)||!os(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,fq(t,n),D({event:"mcp_cleanup",path:t,removed:i})}catch{}}function
|
|
2545
|
+
`;zf=!1;KW=2e3;YW=100,zW=1e4});import{existsSync as sq,mkdirSync as iq,readFileSync as oq,renameSync as aq,unlinkSync as lq,writeFileSync as dq}from"node:fs";import{homedir as tb}from"node:os";import{dirname as _i,join as Ye,resolve as cq}from"node:path";function as(t,e,r){let n=_i(cq(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())Kt(Ye(o,".mcp.json"),"mcpServers",[Fr(),Ur()]),a.has("opencode")&&Kt(Ye(o,".opencode","opencode.json"),"mcp",[nb(),sb()]),a.has("kimi")&&Kt(Ye(o,".kimi-code","mcp.json"),"mcpServers",[Fr(),Ur()]);for(let o of s)pq(o)}function rb(t=Zf??tb()){return Ye(t,".copilot","mcp-config.json")}function fq(t,e){mt.mkdirSync(_i(t),{recursive:!0});let r=Ye(_i(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{mt.writeFileSync(r,`${JSON.stringify(e,null,2)}
|
|
2546
|
+
`,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function mq(t,e){mt.mkdirSync(_i(t),{recursive:!0});let r=Ye(_i(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{mt.writeFileSync(r,e,"utf8"),mt.renameSync(r,t)}catch(n){try{mt.unlinkSync(r)}catch{}throw n}}function Kt(t,e,r){try{if(!mt.existsSync(t))return;let n=JSON.parse(mt.readFileSync(t,"utf8"));if(!os(n)||!os(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,fq(t,n),D({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Fr(){return{name:hl,shouldRemove:vq}}function nb(){return{name:hl,shouldRemove:Sq}}function Ur(){return{name:_l,shouldRemove:wq}}function sb(){return{name:_l,shouldRemove:Tq}}function pq(t){let e=Zf??tb();switch(t){case"copilot":Kt(rb(e),"mcpServers",[Fr(),Ur()]);return;case"claude":Kt(Ye(e,".claude.json"),"mcpServers",[Fr(),Ur()]);return;case"gemini":Kt(Ye(e,".gemini","settings.json"),"mcpServers",[Fr(),Ur()]);return;case"qwen":Kt(Ye(e,".qwen","settings.json"),"mcpServers",[Fr(),Ur()]);return;case"agy":Kt(Ye(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Fr(),Ur()]);return;case"opencode":Kt(Ye(e,".config","opencode","opencode.json"),"mcp",[nb(),sb()]);return;case"kimi":Kt(Ye(Zf===void 0?process.env.KIMI_CODE_HOME??Ye(e,".kimi-code"):Ye(e,".kimi-code"),"mcp.json"),"mcpServers",[Fr(),Ur()]);return;case"codex":_q(Ye(e,".codex","config.toml"));return;default:return}}function _q(t){try{if(!mt.existsSync(t))return;let e=mt.readFileSync(t,"utf8"),r=hq(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let d=ib(l);if(d===null)return;if(d!==void 0){if(eb(d,r)){o=!0,a=d[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let c=yq(l);if(c===null)return;if(c!==void 0&&eb(c,r)){i.add(c[1]);continue}s.push(l)}if(i.size===0)return;mq(t,s.join(`
|
|
2547
2547
|
`)),D({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function eb(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function hq(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=ib(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),d=gq(a,r);if(d===null)return null;if(d===void 0||d.length!==3||d[0]!=="mcp_servers"||d[1]!==_l&&d[1]!==hl)continue;let c=e.get(d[1])??{};if(d[2]==="command"){let u=ob(l);if(u===null)return null;c.command=u}else if(d[2]==="args"){let u=Eq(l);if(u===null)return null;c.args=u}e.set(d[1],c)}let n=new Set;for(let[s,i]of e.entries())s===_l&&lb(i.command,i.args)&&n.add(s),s===hl&&db(i.command,i.args)&&n.add(s);return n}function gq(t,e){if(t.startsWith("mcp_servers"))return gl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=gl(t);return r===null?null:[...e,...r]}function ib(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:gl(e[1])}function yq(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 gl(r)}function gl(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 ob(t){let e=ab(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function Eq(t){let e=ab(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=>ob(s.trim()));return n.some(s=>s===null)?null:n}function ab(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 wq(t){return os(t)?t.type==="stdio"&&typeof t.command=="string"&&lb(t.command,t.args):!1}function Tq(t){return!os(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&ub(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"&&cb(t.command[0],[t.command[1],t.command[2]])}function vq(t){return os(t)?t.type==="stdio"&&db(t.command,t.args):!1}function Sq(t){return!os(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&fb(t.command[0])&&t.command[1]==="mcp"}function lb(t,e){return ub(t)&&mb(e)||cb(t,e)}function db(t,e){return fb(t)&&mb(e)}function cb(t,e){return bq(t)&&Array.isArray(e)&&e.length===2&&kq(e[0])&&e[1]==="mcp"}function ub(t){return typeof t=="string"&&Qf(t)==="lmctl"}function fb(t){return typeof t=="string"&&Qf(t)==="lmctl0"}function bq(t){if(typeof t!="string")return!1;let e=Qf(t).toLowerCase();return e==="node"||e==="node.exe"}function kq(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 Qf(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function mb(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function os(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var _l,hl,uq,mt,Zf,hi=w(()=>{"use strict";pe();_l="lmctl",hl="lmctl0",uq={existsSync:sq,mkdirSync:iq,readFileSync:oq,writeFileSync:dq,renameSync:aq,unlinkSync:lq},mt=uq});function hb(t){let e=pb(t.registry,t.fromTeamfile);if(e===void 0)return ls(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!_b(e,t.fromAlias))return ls(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=pb(t.registry,t.toTeamfile);return r===void 0?ls(`target team is not registered in policy graph: ${t.toTeamfile}`):_b(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?ls(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?ls(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:ls(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function pb(t,e){return t.teams.find(r=>r.teamfile===e)}function _b(t,e){return t.aliases.some(r=>r===e)}function ls(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var gb=w(()=>{"use strict"});import{randomUUID as Iq}from"node:crypto";import{hostname as yb,networkInterfaces as Nq}from"node:os";function Eb(t){let e=(t.now??new Date).toISOString();return{lock_id:Iq(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??yb(),holder_ips:t.ips??Oq(),started_at:e,last_heartbeat:e}}function wb(t=process.env){return Tb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,Aq)}function Rq(t=process.env){return Tb(t.LMCTL_TERMINAL_LOCK_STALE_MS,xq)}function em(t,e={}){let r=e.now??new Date,n=e.localHost??yb(),s=e.staleMs??Rq();if(t.holder_host===n)return(e.isProcessAlive??Lq)(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 tm(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Tb(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 Lq(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 Oq(){let t=new Set;for(let e of Object.values(Nq()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var Aq,xq,rm=w(()=>{"use strict";Aq=15e3,xq=12e4});function nm(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2548
2548
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
2549
2549
|
not officially supported.
|
|
@@ -2552,7 +2552,7 @@ The session marker may be stale or the team may not be registered in this lmctl
|
|
|
2552
2552
|
Consulted ${hs(ne())}
|
|
2553
2553
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function vb(t){return`unknown option --from
|
|
2554
2554
|
${nm(t)}`}function Sb(t,e){let r=un(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function un(t,e){let r=t[Rs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=Ve(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var gi=w(()=>{"use strict";yt();ze();mr()});function je(t){let e=dn(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var yl=w(()=>{"use strict";at()});async function Tl(t){let e=t.onEvent??(()=>{}),r=Cq(t.io,e),n=null,s=null,i=null,o,a,l=null,d=!1,c=null,u=t.prompt;try{let f=await O(r,R=>Ne(t.teamfile,t.alias,R)),m=f.teamfile,p=await O(r,R=>qq(R,t.env??process.env)),h=p.sender,_=await Bq(r,{explicitRoot:t.rootFlag,sender:h,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),g=h===null?null:await Hq(r,{rootTeamfile:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias});g!==null&&!g.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${g.reason}
|
|
2555
|
-
`}),i=await Dq(r,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=Uq(r,i);try{as(r,ot(m),m)}catch{}n={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:g};let y=await Ab(r,m,f.alias);if(y!==null){let R=tm(y);if(h!==null){let A=await sm(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=El(`enqueued mailbox message ${A.id}`,null),im(A.id,h,m,f.alias)}return ds(i,n,t.prompt,R,"unavailable"),c=om(R,null),{status:"busy",message:R,teamChatLogId:null}}let E=await $q(r,m,f.alias);if(E.busy){if(h!==null){let A=await sm(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=El(`enqueued mailbox message ${A.id}`,null),im(A.id,h,m,f.alias)}let R=await Mq(r,m,f.alias);return ds(i,n,t.prompt,R,"unavailable"),c=om(R,null),{status:"busy",message:R,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let R=await O(r,A=>pv(A,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(R.stop){let A=hv(R.chain);return ds(i,n,t.prompt,A,"cycle"),c=wl(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null,messageId:null}}}let v=await Gq(r,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...E.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!v.acquired){let R=xb(m,f.alias,v.current);if(h!==null){let A=await sm(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=El(`enqueued mailbox message ${A.id}`,null),im(A.id,h,m,f.alias)}return ds(i,n,t.prompt,R,"unavailable"),c=om(R,null),{status:"busy",message:R,teamChatLogId:null}}s={row:v.lease,leaseId:v.leaseId},a=wr(R=>O(r,A=>A.heartbeatAgentInflight(s.row,s.leaseId,R)),{intervalMs:Nb,onError:R=>{le()&&$e(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:R instanceof Error?R.message:String(R)}))}});let b=await es({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:R=>e({kind:"delta",chunk:R}),onProgress:R=>e({kind:"progress",alias:f.alias,event:R}),onPromptBuilt:async R=>{u=R,l===null&&(l=await Vq(r,{...n,message:R}),l!==null&&(t.onAccepted?.(er(l)),i!==null&&await Fq(r,i,l))),i!==null&&await Pq(r,i,R)}});u=b.prompt;let x=b.status==="stalled",H=null,F=x?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:b.status==="error"?b.error??b.receipt:n.policy?.outOfPolicy===!0?n.policy.reason:null,$=x||b.status==="error"?"error":n.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await Ib(r,l,{...n,message:u,response:b.receipt,status:$,error_detail:F}),d=!0,H=l):H=await zq(r,{...n,message:u,response:b.receipt,status:$,error_detail:F}),x){let R=F;ds(i,n,u,R,"error"),c=wl(R,H,b.receipt)}else c=El(b.receipt,H);return{status:x?"stalled":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:H,messageId:H===null?null:er(H),durationMs:b.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!d&&n!==null&&(await Ib(r,l,{...n,message:u,response:null,status:"error",error_detail:m}),d=!0),ds(i,n,u,m,"error"),c=wl(m,l),{status:"error",errorKind:f instanceof ke?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:er(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await Yq(r,n,er(l)),s!==null&&await Kq(r,s.row,s.leaseId),i!==null&&await jq(r,i,c??wl("chat turn exited without a terminal outcome",null))}}function Cq(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function $q(t,e,r){let n=await O(t,i=>(Ba(i,e,r),_t(i,e,r)));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>ns(i,n,e,r));return{busy:!s,idleReclaim:s}}async function Mq(t,e,r){let n=await Ab(t,e,r);if(n!==null)return tm(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?xb(e,r,s):`${r} is busy; wait and retry`}async function sm(t,e){return await Ga(t,t.env??process.env),await O(t,r=>{let n=Ne(e.sender.teamfile,e.sender.alias,r);return r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,sender_provider:n.provider,sender_session_id:n.sessionid,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,receiver_provider:e.receiverProvider,receiver_session_id:e.receiverSessionId,root_teamfile:e.rootTeamfile,payload:e.payload})})}function im(t,e,r,n){let s=`${r}:${n}`,i=Me(t);return{status:"enqueued",id:t,message:`mailbox message ${i} enqueued to ${s}`,teamChatLogId:null,messageId:i,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function Dq(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:Wq(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 le()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function jq(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){le()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function Pq(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){le()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function Fq(t,e,r){try{await O(t,n=>{n.linkTrackedInvocationMessage(e,r)})}catch(n){le()&&$e(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:r,error:n instanceof Error?n.message:String(n)}))}}function Uq(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{le()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},Nb);return r.unref?.(),r}function El(t,e){return{status:"done",result_summary:yi(t),error:null,team_chat_log_id:e}}function om(t,e){return{status:"busy",result_summary:yi(t),error:t,team_chat_log_id:e}}function wl(t,e,r){return{status:"error",result_summary:yi(r===void 0?t:r),error:t,team_chat_log_id:e}}function yi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Wq(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function qq(t,e){let r=Sb(e,t);if(r.ok)return{sender:je(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(pr("chat"))}async function Bq(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>be(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>_v(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function Hq(t,e){return await O(t,r=>hb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:Xq(r,e.sender.teamfile,e.receiverTeamfile)}))}function Xq(t,e,r){return{teams:[e,r].map(s=>Jq(s,t))}}function Jq(t,e){let r=Ve(t,e),n=Xt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function Gq(t,e){return await O(t,r=>{let n=le(),s=Ot(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Bt(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&$e(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:kb(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(n&&$e(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:kb(s.current)})),{acquired:!1,current:s.current})})}async function Ab(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(em(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:em(s).live?s:null})}function kb(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 Kq(t,e,r){try{await O(t,n=>{n.releaseAgentInflight(e,r)})}catch(n){t.stderr.write(`warning: failed to release chat in-flight slot: ${n instanceof Error?n.message:String(n)}
|
|
2555
|
+
`}),i=await Dq(r,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=Uq(r,i);try{as(r,ot(m),m)}catch{}n={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:g};let y=await Ab(r,m,f.alias);if(y!==null){let R=tm(y);if(h!==null){let A=await sm(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=El(`enqueued mailbox message ${A.id}`,null),im(A.id,h,m,f.alias)}return ds(i,n,t.prompt,R,"unavailable"),c=om(R,null),{status:"busy",message:R,teamChatLogId:null}}let E=await $q(r,m,f.alias);if(E.busy){if(h!==null){let A=await sm(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=El(`enqueued mailbox message ${A.id}`,null),im(A.id,h,m,f.alias)}let R=await Mq(r,m,f.alias);return ds(i,n,t.prompt,R,"unavailable"),c=om(R,null),{status:"busy",message:R,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let R=await O(r,A=>pv(A,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(R.stop){let A=hv(R.chain);return ds(i,n,t.prompt,A,"cycle"),c=wl(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null,messageId:null}}}let v=await Gq(r,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...E.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!v.acquired){let R=xb(m,f.alias,v.current);if(h!==null){let A=await sm(r,{sender:h,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:_,payload:t.prompt});return c=El(`enqueued mailbox message ${A.id}`,null),im(A.id,h,m,f.alias)}return ds(i,n,t.prompt,R,"unavailable"),c=om(R,null),{status:"busy",message:R,teamChatLogId:null}}s={row:v.lease,leaseId:v.leaseId},a=Tr(R=>O(r,A=>A.heartbeatAgentInflight(s.row,s.leaseId,R)),{intervalMs:Nb,onError:R=>{le()&&$e(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:R instanceof Error?R.message:String(R)}))}});let b=await es({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:R=>e({kind:"delta",chunk:R}),onProgress:R=>e({kind:"progress",alias:f.alias,event:R}),onPromptBuilt:async R=>{u=R,l===null&&(l=await Vq(r,{...n,message:R}),l!==null&&(t.onAccepted?.(er(l)),i!==null&&await Fq(r,i,l))),i!==null&&await Pq(r,i,R)}});u=b.prompt;let x=b.status==="stalled",H=null,F=x?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:b.status==="error"?b.error??b.receipt:n.policy?.outOfPolicy===!0?n.policy.reason:null,$=x||b.status==="error"?"error":n.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await Ib(r,l,{...n,message:u,response:b.receipt,status:$,error_detail:F}),d=!0,H=l):H=await zq(r,{...n,message:u,response:b.receipt,status:$,error_detail:F}),x){let R=F;ds(i,n,u,R,"error"),c=wl(R,H,b.receipt)}else c=El(b.receipt,H);return{status:x?"stalled":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:H,messageId:H===null?null:er(H),durationMs:b.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!d&&n!==null&&(await Ib(r,l,{...n,message:u,response:null,status:"error",error_detail:m}),d=!0),ds(i,n,u,m,"error"),c=wl(m,l),{status:"error",errorKind:f instanceof ke?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:er(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await Yq(r,n,er(l)),s!==null&&await Kq(r,s.row,s.leaseId),i!==null&&await jq(r,i,c??wl("chat turn exited without a terminal outcome",null))}}function Cq(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function $q(t,e,r){let n=await O(t,i=>(Ba(i,e,r),_t(i,e,r)));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>ns(i,n,e,r));return{busy:!s,idleReclaim:s}}async function Mq(t,e,r){let n=await Ab(t,e,r);if(n!==null)return tm(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?xb(e,r,s):`${r} is busy; wait and retry`}async function sm(t,e){return await Ga(t,t.env??process.env),await O(t,r=>{let n=Ne(e.sender.teamfile,e.sender.alias,r);return r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,sender_provider:n.provider,sender_session_id:n.sessionid,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,receiver_provider:e.receiverProvider,receiver_session_id:e.receiverSessionId,root_teamfile:e.rootTeamfile,payload:e.payload})})}function im(t,e,r,n){let s=`${r}:${n}`,i=Me(t);return{status:"enqueued",id:t,message:`mailbox message ${i} enqueued to ${s}`,teamChatLogId:null,messageId:i,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function Dq(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:Wq(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 le()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function jq(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){le()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function Pq(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){le()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function Fq(t,e,r){try{await O(t,n=>{n.linkTrackedInvocationMessage(e,r)})}catch(n){le()&&$e(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:r,error:n instanceof Error?n.message:String(n)}))}}function Uq(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{le()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},Nb);return r.unref?.(),r}function El(t,e){return{status:"done",result_summary:yi(t),error:null,team_chat_log_id:e}}function om(t,e){return{status:"busy",result_summary:yi(t),error:t,team_chat_log_id:e}}function wl(t,e,r){return{status:"error",result_summary:yi(r===void 0?t:r),error:t,team_chat_log_id:e}}function yi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Wq(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function qq(t,e){let r=Sb(e,t);if(r.ok)return{sender:je(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(pr("chat"))}async function Bq(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>be(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>_v(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function Hq(t,e){return await O(t,r=>hb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:Xq(r,e.sender.teamfile,e.receiverTeamfile)}))}function Xq(t,e,r){return{teams:[e,r].map(s=>Jq(s,t))}}function Jq(t,e){let r=Ve(t,e),n=Xt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function Gq(t,e){return await O(t,r=>{let n=le(),s=Ot(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Bt(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&$e(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:kb(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(n&&$e(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:kb(s.current)})),{acquired:!1,current:s.current})})}async function Ab(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(em(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:em(s).live?s:null})}function kb(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 Kq(t,e,r){try{await O(t,n=>{n.releaseAgentInflight(e,r)})}catch(n){t.stderr.write(`warning: failed to release chat in-flight slot: ${n instanceof Error?n.message:String(n)}
|
|
2556
2556
|
`)}}function xb(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 Vq(t,e){let r=Ei(e.message);try{return await O(t,n=>n.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:r.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:r.truncated?1:0,created_at:new Date().toISOString()}))}catch(n){return t.stderr.write(`warning: failed to begin chat log: ${n instanceof Error?n.message:String(n)}
|
|
2557
2557
|
`),null}}async function Ib(t,e,r){let n=Ei(r.message),s=r.response===null?null:Ei(r.response);try{await O(t,i=>i.finishTeamChatLog(e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,receiver_provider:r.receiver_provider,receiver_session_id:r.receiver_session_id,provider_prompt:r.message,message:n.text,response:s?.text??null,origin:r.origin,status:r.status,error_detail:r.error_detail,truncated:n.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
|
|
2558
2558
|
`)}}async function Yq(t,e,r){if(e!==null)try{await O(t,n=>{n.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,r)})}catch(n){t.stderr.write(`warning: failed to clear chat causal pointer: ${n instanceof Error?n.message:String(n)}
|
|
@@ -2571,7 +2571,7 @@ ${Lb}
|
|
|
2571
2571
|
`),1;let _=f.resumeInteractive(h.step_id,n.prompt,n.done===!0);return _.resumed===!0?(e.stdout.write(`run ${u}: interactive resumed (step ${h.step_id}${n.done===!0?", done":""})
|
|
2572
2572
|
`),0):(e.stderr.write(`error: run ${u}: resumeInteractive failed (${_.reason})
|
|
2573
2573
|
`),1)}return e.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
|
|
2574
|
-
`),1})}let s=
|
|
2574
|
+
`),1})}let s=Pr(Qq,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
|
|
2575
2575
|
`),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
|
|
2576
2576
|
`),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
|
|
2577
2577
|
`),2;let u=await Tl({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>{n.json===!0&&f.kind==="delta"||sB(e,f)},...n.json===!0?{onAccepted:f=>{e.stdout.write(`${JSON.stringify({status:"accepted",message_id:f})}
|
|
@@ -2627,8 +2627,8 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
|
|
|
2627
2627
|
|
|
2628
2628
|
${dm}`);if(n.positionals.length===0)return N(e,`recover requires a <teamfile>
|
|
2629
2629
|
|
|
2630
|
-
${dm}`);if(n.positionals.length>2)return N(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=dn(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return N(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(
|
|
2631
|
-
`)}return m.errors>0?1:0}async function _B(t,e,r){return await O(t,n=>{let s=be(e,n);if(r!==void 0){let i=Ve(s,n);if(i.parseErrors.length>0)throw new ke(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=za(i,r);return o?.teamfile!==void 0?cm(Ub(Fb(s),o.teamfile),n,new Set):[Ne(e,r,n)]}return cm(s,n,new Set)})}function cm(t,e,r){let n=be(t,e);if(r.has(n))return[];r.add(n);let s=Ve(n,e);if(s.parseErrors.length>0)throw new ke(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...cm(Ub(Fb(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(Ne(n,o.alias,e))}return i}async function hB(t,e,r){let n;try{let a=await
|
|
2630
|
+
${dm}`);if(n.positionals.length>2)return N(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=dn(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return N(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(K(n,"--all")&&l!==void 0)return N(e,"recover --all is mutually exclusive with <alias>");let d;try{d=await _B(e,o,l)}catch(p){if(p instanceof ke)return N(e,p.message);throw p}let c=r.now??new Date,u=K(n,"--dry-run"),f=[];for(let p of d)f.push(await hB(e,p,{now:c,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(K(n,"--json"))ee(e,{dryRun:u,now:c.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(gB(p));e.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
|
|
2631
|
+
`)}return m.errors>0?1:0}async function _B(t,e,r){return await O(t,n=>{let s=be(e,n);if(r!==void 0){let i=Ve(s,n);if(i.parseErrors.length>0)throw new ke(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=za(i,r);return o?.teamfile!==void 0?cm(Ub(Fb(s),o.teamfile),n,new Set):[Ne(e,r,n)]}return cm(s,n,new Set)})}function cm(t,e,r){let n=be(t,e);if(r.has(n))return[];r.add(n);let s=Ve(n,e);if(s.parseErrors.length>0)throw new ke(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...cm(Ub(Fb(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(Ne(n,o.alias,e))}return i}async function hB(t,e,r){let n;try{let a=await We(e.sessionid,e.provider);if(a===null)return Vt(e,"session_not_found",null,"session detail not found");n=wi(a.messages)}catch(a){return Vt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Vt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Vt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Vt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Vt(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 Vt(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Vt(e,"would_recover",n,null);let o=await Tl({teamfile:e.teamfile,alias:e.alias,prompt:mB,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?Vt(e,"recovered",n,null):Vt(e,o.status==="busy"?"busy":"send_error",n,o.message)}function Vt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function gB(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
|
|
2632
2632
|
`}var mB,dm,qb=w(()=>{"use strict";lm();Jt();fr();mr();at();am();De();mB="Your session limit reset time has passed. Continue your work from the last actionable point.",dm=["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(`
|
|
2633
2633
|
`)});var Ti,dte,um=w(()=>{"use strict";Ti=[{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}],dte=Ti.length});import{spawn as yB}from"node:child_process";async function Hb(t,e,r){let n=wB.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return TB(n.name,s)}function TB(t,e){return t==="lmctl_chat"?vB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function vB(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 le()&&$e(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),SB(s,process.cwd())}function SB(t,e){return new Promise(r=>{let n=!1,s,i=c=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(c))},o=yB("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=bB(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",d="";o.stdout?.on("data",c=>{l+=c.toString("utf8")}),o.stderr?.on("data",c=>{d+=c.toString("utf8")}),o.on("error",c=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${c.message}`})}),o.on("exit",c=>{if(c===0){le()&&$e(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2634
2634
|
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:c??1,message:d.trim()||`lmctl chat exited with code ${c}`})})})}function bB(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Bb;let r=Number(e);return!Number.isFinite(r)||r<=0?Bb:r}function fm(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:EB),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 EB,Bb,wB,mm=w(()=>{"use strict";um();pe();EB="http://127.0.0.1:8787",Bb=30*60*1e3,wB=new Map(Ti.map(t=>[t.name,t]))});async function AB(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(pm({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:kB,capabilities:{tools:{listChanged:!1}},serverInfo:{name:IB,version:NB}}}};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:Ti.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 Hb(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 pm(t){return`${JSON.stringify(t)}
|
|
@@ -2636,7 +2636,7 @@ ${dm}`);if(n.positionals.length>2)return N(e,`unexpected argument: ${n.positiona
|
|
|
2636
2636
|
`);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&d(0)}),u=n.indexOf(`
|
|
2637
2637
|
`)}};e.setEncoding("utf8"),e.on("data",u=>{n+=u,c()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>d(0))}),e.on("error",u=>{t.io.log?.(`mcp: stdin error: ${u.message}
|
|
2638
2638
|
`),a.finally(()=>d(1))})})}var kB,IB,NB,Jb=w(()=>{"use strict";um();mm();kB="2025-06-18",IB="lmctl",NB="0.0.1"});var Kb={};he(Kb,{runMcp:()=>RB});async function RB(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(xB),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
2639
|
-
`),2;D({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??LB(),i=1;try{let o=s===void 0?fm({getConfig:()=>null},process.env):fm(s,process.env);return i=await Xb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{D({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function LB(){let t=ne(),e=3;for(let r=1;r<=e;r+=1)try{return
|
|
2639
|
+
`),2;D({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??LB(),i=1;try{let o=s===void 0?fm({getConfig:()=>null},process.env):fm(s,process.env);return i=await Xb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{D({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function LB(){let t=ne(),e=3;for(let r=1;r<=e;r+=1)try{return Be({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(D({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Gb(s))OB(50*r);else if(!Gb(s))break}}function Gb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function OB(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var xB,Vb=w(()=>{"use strict";dt();mm();Jb();pe();ze();xB=`usage: lmctl mcp
|
|
2640
2640
|
|
|
2641
2641
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2642
2642
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
@@ -2670,38 +2670,38 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
|
2670
2670
|
WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2671
2671
|
AND ts >= ?
|
|
2672
2672
|
ORDER BY seq ASC
|
|
2673
|
-
`).all(e.since).map(YB),s=new Map;for(let l of n){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new
|
|
2673
|
+
`).all(e.since).map(YB),s=new Map;for(let l of n){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Wr(`${l.stream_id} ${l.event_type} is missing receiver identity`);let d=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},c=zB(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:d,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:c.message_id,parent_link:c.link,orphaned_to_root:c.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let d=s.get(l.parent_message_id);if(d===void 0){l.orphaned_to_root=!0;continue}d.children.push(l)}let i=e.cursorSeq??null,o=[...s.values()].filter(l=>ek(l,e.root)&&!ZB(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>tk(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function YB(t){try{let e=JSON.parse(t.payload);if(!rk(e))throw new Wr(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Wr?e:new Wr(`message_event seq ${t.seq} payload is invalid JSON`)}}function zB(t){if(t.event_type==="RESPONSE_CREATE"){let n=Zb(t.payload.in_reply_to_message_id);return{message_id:n,link:n===null?null:"in_reply_to_message_id"}}let e=rk(t.payload.causation)?t.payload.causation:null,r=Zb(e?.request_message_id);return{message_id:r,link:r===null?null:"invocation_state.request_message_id"}}function ek(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function ZB(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(ek(i,r))return!0;s=i.parent_message_id}return!1}function tk(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=>tk(o,i))}}function rk(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Zb(t){return typeof t=="string"&&t.length>0?t:null}var Wr,nk=w(()=>{"use strict";Wr=class extends Error{errorKind="data_error"}});var fk={};he(fk,{runMail:()=>_H});import{hostname as QB}from"node:os";async function _H(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(iH),0;let[r,...n]=t,s=Yt(n);try{switch(r){case"sent":return await hH(n,e);case"history":return await gH(n,e);case"seen":return await yH(n,e);case"pending":return await EH(n,e);case"read":return await TH(n,e);case"deliver":return await vH(n,e);case"handle":return await NH(n,e);case"ack":return await IH(n,e);case"tree":return await AH(n,e);default:return te(e,s,"invalid_command",`unknown mail command: ${r}`)}}catch(i){return i instanceof Ee||i instanceof Wr?te(e,s,i.errorKind,i.message):te(e,s,"internal",i instanceof Error?i.message:String(i))}}async function hH(t,e){if(yr(t))return e.stdout.write(oH),0;let r=Yt(t),n=Q(Sl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return te(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=gm(P(n,"--to"));if("error"in s)return te(e,r,"invalid_arguments",s.error);let i=FH(P(n,"--since"));if("error"in i)return te(e,r,"invalid_arguments",i.error);let o=P(n,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return te(e,r,"invalid_arguments","--status must be queued or delivered");let a=Em(P(n,"--limit"));if("error"in a)return te(e,r,"invalid_arguments",a.error);let l=ck(P(n,"--cursor"),"sent");if("error"in l)return te(e,r,"invalid_arguments",l.error);if(l.value!==null&&(P(n,"--to")!==void 0||P(n,"--since")!==void 0||o!==void 0))return te(e,r,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let d=await O(e,c=>{let u=l.value===null?je(ym(c,e,"mail sent")):je(l.value.self),f=l.value===null?s.value:l.value.to===null?null:je(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,h=xH(c,u,f,m,p??void 0,a.value,l.value?.seq??null),_=h.next_seq===null?null:dk({v:1,kind:"sent",seq:h.next_seq,self:u.value,to:f?.value??null,since:m,status:p});return{schema_version:hr,schema:"event-log-v1",identity:u.value,filters:{to:f?.value??null,since:m,status:p},messages:h.messages,next_cursor:_}});if(K(n,"--json"))ee(e,d);else{e.stdout.write(`Messages sent from ${d.identity}
|
|
2674
2674
|
`);for(let c of d.messages)e.stdout.write(`${c.created_at} ${c.message_id} ${c.message_type} ${c.lifecycle_state} -> ${c.receiver.teamfile}:${c.receiver.alias}
|
|
2675
2675
|
`);d.messages.length===0&&e.stdout.write(`(none)
|
|
2676
|
-
`)}return 0}async function gH(t,e){if(yr(t))return e.stdout.write(fH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return
|
|
2676
|
+
`)}return 0}async function gH(t,e){if(yr(t))return e.stdout.write(fH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);let s=cs(n.positionals,"history");if("error"in s)return te(e,r,"invalid_id",s.error);let i=await O(e,a=>ok(a,s.value)),o={schema_version:hr,schema:"event-log-v1",message_id:s.value,events:i};if(K(n,"--json"))ee(e,o);else{e.stdout.write(`History for ${s.value}
|
|
2677
2677
|
`);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
|
|
2678
|
-
`)}return 0}async function yH(t,e){if(yr(t))return e.stdout.write(mH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return
|
|
2678
|
+
`)}return 0}async function yH(t,e){if(yr(t))return e.stdout.write(mH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);let s=cs(n.positionals,"seen");if("error"in s)return te(e,r,"invalid_id",s.error);let i=await O(e,o=>LH(o,s.value));return K(n,"--json")?ee(e,i):(e.stdout.write(`${s.value}
|
|
2679
2679
|
`),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
|
|
2680
2680
|
`),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
|
|
2681
2681
|
`),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
|
|
2682
|
-
`)),0}async function EH(t,e){if(yr(t))return e.stdout.write(aH),0;let r=Yt(t),n=Q(Sl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(n.error!==void 0)return
|
|
2682
|
+
`)),0}async function EH(t,e){if(yr(t))return e.stdout.write(aH),0;let r=Yt(t),n=Q(Sl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return te(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=gm(P(n,"--receiver"));if("error"in s)return te(e,r,"invalid_arguments",s.error);let i=Em(P(n,"--limit"));if("error"in i)return te(e,r,"invalid_arguments",i.error);let o=await O(e,l=>{let d=s.value;if(d===null){let m=un(e.env??process.env,l);if(m.ok)d=je(m.identity);else if(m.reason==="not-found")throw new Ee("self_identity",pr("mail pending"))}let c=d===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",u=d===null?[]:[d.teamfile,d.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
2683
2683
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq
|
|
2684
2684
|
FROM message_pending ${c}
|
|
2685
|
-
ORDER BY created_seq ASC LIMIT ?`).all(...u,i.value);return{receiver:d,messages:f}}),a={schema_version:hr,schema:"event-log-v1",filters:{receiver:o.receiver===null?null:`${o.receiver.teamfile}:${o.receiver.alias}`,limit:i.value},messages:o.messages.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(
|
|
2685
|
+
ORDER BY created_seq ASC LIMIT ?`).all(...u,i.value);return{receiver:d,messages:f}}),a={schema_version:hr,schema:"event-log-v1",filters:{receiver:o.receiver===null?null:`${o.receiver.teamfile}:${o.receiver.alias}`,limit:i.value},messages:o.messages.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(K(n,"--json"))ee(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
|
|
2686
2686
|
`);else for(let l of a.messages){let d=l.sender===null?"operator":`${l.sender.teamfile}:${l.sender.alias}`;e.stdout.write(`${l.message_id} ${l.lifecycle_state} ${d} -> ${l.receiver.teamfile}:${l.receiver.alias}
|
|
2687
2687
|
`)}return 0}function wH(t,e){let r=t.db.prepare(`SELECT event_type, payload FROM message_event
|
|
2688
2688
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2689
|
-
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ee("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:hr,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function TH(t,e){if(yr(t))return e.stdout.write(lH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return
|
|
2689
|
+
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ee("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:hr,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function TH(t,e){if(yr(t))return e.stdout.write(lH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);let s=cs(n.positionals,"read");if("error"in s)return te(e,r,"invalid_id",s.error);let i=await O(e,o=>wH(o,s.value));if(K(n,"--json"))ee(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}`})
|
|
2690
2690
|
`),e.stdout.write(`from: ${o}
|
|
2691
2691
|
`),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
|
|
2692
2692
|
`),e.stdout.write(`state: ${i.pending_state??"terminal"}
|
|
2693
2693
|
`),e.stdout.write(`---
|
|
2694
2694
|
${i.content}
|
|
2695
|
-
`)}return 0}async function vH(t,e){if(yr(t))return e.stdout.write(dH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return
|
|
2695
|
+
`)}return 0}async function vH(t,e){if(yr(t))return e.stdout.write(dH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);let s=cs(n.positionals,"deliver");if("error"in s)return te(e,r,"invalid_id",s.error);let i=await O(e,async a=>{let l=SH(a,s.value),d=await bH(a,e,l);return{pending:l,delivery:d}}),o={schema_version:hr,schema:"event-log-v1",message_id:i.pending.messageId,message_type:i.pending.messageType,receiver:i.pending.receiver,outcome:i.delivery.outcome,provider_status:i.delivery.providerStatus,message:i.delivery.message};return K(n,"--json")?ee(e,o):e.stdout.write(`${o.message_id} ${o.outcome} -> ${o.receiver.teamfile}:${o.receiver.alias}${o.message===null?"":` ${o.message}`}
|
|
2696
2696
|
`),0}function SH(t,e){let r=t.db.prepare(`SELECT * FROM message_event
|
|
2697
2697
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2698
2698
|
ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ee("not_found",`no such message: ${e}`);let n=vl(r),s=t.db.prepare(`SELECT message_type, lifecycle_state
|
|
2699
|
-
FROM message_pending WHERE message_id = ?`).get(e);if(s===void 0)throw new Ee("invalid_state",`${e} is not pending`);if(s.lifecycle_state!=="queued")throw new Ee("invalid_state",`${e} is ${s.lifecycle_state}; only queued messages can be delivered`);let i=fn(n.payload.legacy)?n.payload.legacy:null,o=uk(i?.id);if(i?.table!=="agent_mailbox"||o===null||!Number.isSafeInteger(o)||o<1)throw new Ee("data_error",`${e} does not reference a deliverable agent_mailbox row`);let a=t.getMailboxMessage(o);if(a===null)throw new Ee("data_error",`${e} references missing mailbox row ${o}`);if(a.message_type!==s.message_type||a.receiver_teamfile!==n.receiver_teamfile||a.receiver_alias!==n.receiver_alias)throw new Ee("data_error",`${e} mailbox/event identity does not match`);if(a.delivered_at!==null||a.delivering_at!==null)throw new Ee("invalid_state",`${e} legacy delivery state is not queued`);if(n.receiver_teamfile===null||n.receiver_alias===null)throw new Ee("data_error",`${e} is missing receiver identity`);return{row:a,messageId:e,messageType:s.message_type,receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias},leaseSender:a.sender_teamfile===null||a.sender_alias===null?{teamfile:a.receiver_teamfile,alias:"operator"}:{teamfile:a.sender_teamfile,alias:a.sender_alias}}}async function bH(t,e,r){let n=_t(t,r.receiver.teamfile,r.receiver.alias),s=!1;if(n.busy){if(n.reason==="terminal-held")return{outcome:"skipped_terminal",providerStatus:null,message:"receiver is terminal-held"};if(!await ns(t,n,r.receiver.teamfile,r.receiver.alias))return{outcome:"skipped_busy",providerStatus:null,message:"receiver is busy"};s=!0}let i=Ne(r.receiver.teamfile,r.receiver.alias,t),o=Ot(t,{receiver_teamfile:r.receiver.teamfile,receiver_alias:r.receiver.alias,sender_teamfile:r.leaseSender.teamfile,sender_alias:r.leaseSender.alias,ttlMs:Bt(),...s?{force:!0,reclaimReason:"session-idle"}:{}});if(!o.acquired)return{outcome:"skipped_busy",providerStatus:null,message:"receiver lease was acquired elsewhere"};let a={row:o.lease,leaseId:o.leaseId},l=e.env??process.env,d=
|
|
2700
|
-
${t.receipt}`:`relay delivery error: ${t.error}`}async function IH(t,e){if(yr(t))return e.stdout.write(cH),0;let r=Yt(t),n=Q(Sl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(n.error!==void 0)return
|
|
2701
|
-
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ee("not_found",`no such message: ${s.value}`);let c=un(e.env??process.env,l);if(!c.ok&&c.reason==="not-found")throw new Ee("self_identity",pr("mail ack"));let u=c.ok?c.identity:"operator",f=l.db.transaction(()=>{let m=a_(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:QB(),terminalizePending:
|
|
2702
|
-
`),0}async function NH(t,e){if(yr(t))return e.stdout.write(uH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return
|
|
2703
|
-
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ee("not_found",`no such message: ${s.value}`);let d=je(ym(a,e,"mail handle"));return{identity:d,handling:o_(a.db,{messageId:s.value,handlingBy:d.value,handlingTeamfile:d.teamfile,handlingAlias:d.alias})}}),o={schema_version:hr,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return
|
|
2704
|
-
`),0}async function AH(t,e){if(yr(t))return e.stdout.write(pH),0;let r=Yt(t),n=Q(Sl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(n.error!==void 0)return
|
|
2699
|
+
FROM message_pending WHERE message_id = ?`).get(e);if(s===void 0)throw new Ee("invalid_state",`${e} is not pending`);if(s.lifecycle_state!=="queued")throw new Ee("invalid_state",`${e} is ${s.lifecycle_state}; only queued messages can be delivered`);let i=fn(n.payload.legacy)?n.payload.legacy:null,o=uk(i?.id);if(i?.table!=="agent_mailbox"||o===null||!Number.isSafeInteger(o)||o<1)throw new Ee("data_error",`${e} does not reference a deliverable agent_mailbox row`);let a=t.getMailboxMessage(o);if(a===null)throw new Ee("data_error",`${e} references missing mailbox row ${o}`);if(a.message_type!==s.message_type||a.receiver_teamfile!==n.receiver_teamfile||a.receiver_alias!==n.receiver_alias)throw new Ee("data_error",`${e} mailbox/event identity does not match`);if(a.delivered_at!==null||a.delivering_at!==null)throw new Ee("invalid_state",`${e} legacy delivery state is not queued`);if(n.receiver_teamfile===null||n.receiver_alias===null)throw new Ee("data_error",`${e} is missing receiver identity`);return{row:a,messageId:e,messageType:s.message_type,receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias},leaseSender:a.sender_teamfile===null||a.sender_alias===null?{teamfile:a.receiver_teamfile,alias:"operator"}:{teamfile:a.sender_teamfile,alias:a.sender_alias}}}async function bH(t,e,r){let n=_t(t,r.receiver.teamfile,r.receiver.alias),s=!1;if(n.busy){if(n.reason==="terminal-held")return{outcome:"skipped_terminal",providerStatus:null,message:"receiver is terminal-held"};if(!await ns(t,n,r.receiver.teamfile,r.receiver.alias))return{outcome:"skipped_busy",providerStatus:null,message:"receiver is busy"};s=!0}let i=Ne(r.receiver.teamfile,r.receiver.alias,t),o=Ot(t,{receiver_teamfile:r.receiver.teamfile,receiver_alias:r.receiver.alias,sender_teamfile:r.leaseSender.teamfile,sender_alias:r.leaseSender.alias,ttlMs:Bt(),...s?{force:!0,reclaimReason:"session-idle"}:{}});if(!o.acquired)return{outcome:"skipped_busy",providerStatus:null,message:"receiver lease was acquired elsewhere"};let a={row:o.lease,leaseId:o.leaseId},l=e.env??process.env,d=Tr(c=>t.heartbeatAgentInflight(a.row,a.leaseId,c),{intervalMs:En(l)});try{let c={teamfile:r.receiver.teamfile,alias:r.receiver.alias,provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{},...i.isLead!==void 0?{isLead:i.isLead}:{}};if(r.messageType==="response"){let p=await Ja({sender:r.leaseSender,receiver:c,io:e,permissionMode:"yolo",env:l,onlyMailboxId:r.row.id}),h=t.getMailboxMessage(r.row.id),_=h!==null&&h.delivered_at!==null;return p.status==="ok"&&_?{outcome:"delivered",providerStatus:"ok",message:null}:{outcome:"error",providerStatus:p.status,message:p.error??(p.status==="stalled"?"provider stalled during response delivery":"response delivery was not finalized")}}let u=await es({sender:r.leaseSender,receiver:c,io:e,permissionMode:"yolo",env:l,finalize:"caller",onlyMailboxId:r.row.id}),f=kH(u),m=0;try{m=t.markRelayRequestDeliveredAndEnqueueResponses(u.queued,f,new Date().toISOString()).marked}catch(p){return{outcome:"error",providerStatus:u.status,message:`delivery finalization failed: ${p instanceof Error?p.message:String(p)}`}}return u.status==="ok"&&m===1?{outcome:"delivered",providerStatus:"ok",message:null}:{outcome:"error",providerStatus:u.status,message:u.status==="stalled"?"provider stalled during request delivery":u.status==="error"?u.error:"request delivery was not finalized"}}catch(c){throw c instanceof Error&&/^no queued (?:response )?mail to deliver/.test(c.message)?new Ee("invalid_state",`${r.messageId} was no longer queued when delivery claimed it`):c}finally{clearInterval(d);try{t.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function kH(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
|
|
2700
|
+
${t.receipt}`:`relay delivery error: ${t.error}`}async function IH(t,e){if(yr(t))return e.stdout.write(cH),0;let r=Yt(t),n=Q(Sl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);let s=cs(n.positionals,"ack");if("error"in s)return te(e,r,"invalid_id",s.error);let i=P(n,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
|
|
2701
|
+
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ee("not_found",`no such message: ${s.value}`);let c=un(e.env??process.env,l);if(!c.ok&&c.reason==="not-found")throw new Ee("self_identity",pr("mail ack"));let u=c.ok?c.identity:"operator",f=l.db.transaction(()=>{let m=a_(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:QB(),terminalizePending:K(n,"--terminalize-pending")});if(c.ok){let p=je(c.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:u,ack:f}}),a={schema_version:hr,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return K(n,"--json")?ee(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
|
|
2702
|
+
`),0}async function NH(t,e){if(yr(t))return e.stdout.write(uH),0;let r=Yt(t),n=Q(t,[],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);let s=cs(n.positionals,"handle");if("error"in s)return te(e,r,"invalid_id",s.error);let i=await O(e,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
|
|
2703
|
+
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ee("not_found",`no such message: ${s.value}`);let d=je(ym(a,e,"mail handle"));return{identity:d,handling:o_(a.db,{messageId:s.value,handlingBy:d.value,handlingTeamfile:d.teamfile,handlingAlias:d.alias})}}),o={schema_version:hr,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return K(n,"--json")?ee(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
|
|
2704
|
+
`),0}async function AH(t,e){if(yr(t))return e.stdout.write(pH),0;let r=Yt(t),n=Q(Sl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(n.error!==void 0)return te(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return te(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=lk(P(n,"--since"),eH);if("error"in s)return te(e,r,"invalid_arguments",s.error);let i=gm(P(n,"--root"));if("error"in i)return te(e,r,"invalid_arguments",i.error);let o=Em(P(n,"--limit"));if("error"in o)return te(e,r,"invalid_arguments",o.error);let a=ck(P(n,"--cursor"),"tree");if("error"in a)return te(e,r,"invalid_arguments",a.error);if(a.value!==null&&(P(n,"--root")!==void 0||P(n,"--since")!==void 0))return te(e,r,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await O(e,d=>{let c=a.value===null?i.value??je(ym(d,e,"mail tree")):je(a.value.root),u=a.value?.since??s.iso,f=a.value?.since_label??P(n,"--since")??"24h",m=Qb(d,{root:{teamfile:c.teamfile,alias:c.alias},since:u,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:dk({v:1,kind:"tree",seq:m.next_seq,root:c.value,since:u,since_label:f});return{schema_version:hr,schema:"event-log-v1",root:{teamfile:c.teamfile,alias:c.alias},since:f,since_timestamp:u,sent:m.sent,next_cursor:p,orphan_policy:"Missing causal linkage, including a genuinely fresh or unprompted send before any inbound delivery, is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"External composition is causally linked by calling mail handle before a reactive send. A send remains an orphan root when no handle was declared or the handling pointer exceeded its one-hour TTL."}});if(K(n,"--json"))ee(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
|
|
2705
2705
|
`);for(let d of l.sent)ak(e,d,0);l.sent.length===0&&e.stdout.write(`(none)
|
|
2706
2706
|
`),e.stdout.write(`
|
|
2707
2707
|
Note: ${l.orphan_policy}
|
|
@@ -2723,7 +2723,7 @@ Note: ${l.orphan_policy}
|
|
|
2723
2723
|
SELECT * FROM message_event
|
|
2724
2724
|
WHERE stream_id = ? AND event_type = 'INVOCATION_START'
|
|
2725
2725
|
ORDER BY seq ASC
|
|
2726
|
-
`).all(s.invocation_id);for(let o of i){let a=ik(vl(o).payload,s.invocation_id);if(a!==null)return a}}return null}function ik(t,e){let r=fn(t.receiver)?t.receiver:null,n=fn(t.session)?t.session:null,s=vi(r?.provider,n?.provider,t.provider),i=vi(r?.session_id,n?.session_id,t.session_id);return s===null||!WH(s)||i===null?null:{provider:s,session_id:i,invocation_id:e}}async function CH(t,e){if(t===null)return{checked:!1,matched_index:null,seen_at:null,reason:"historical-session-not-recorded",messages:null};try{let r=await
|
|
2726
|
+
`).all(s.invocation_id);for(let o of i){let a=ik(vl(o).payload,s.invocation_id);if(a!==null)return a}}return null}function ik(t,e){let r=fn(t.receiver)?t.receiver:null,n=fn(t.session)?t.session:null,s=vi(r?.provider,n?.provider,t.provider),i=vi(r?.session_id,n?.session_id,t.session_id);return s===null||!WH(s)||i===null?null:{provider:s,session_id:i,invocation_id:e}}async function CH(t,e){if(t===null)return{checked:!1,matched_index:null,seen_at:null,reason:"historical-session-not-recorded",messages:null};try{let r=await We(t.session_id,t.provider);if(r===null)return{checked:!0,matched_index:null,seen_at:null,reason:"session-not-found",messages:null};let n=$H(r.messages,e);return{checked:!0,matched_index:n<0?null:n,seen_at:n<0?null:r.messages[n].timestamp.toISOString(),reason:n<0?"message-id-not-found":null,messages:r.messages}}catch(r){return{checked:!0,matched_index:null,seen_at:null,reason:`read-error: ${r instanceof Error?r.message:String(r)}`,messages:null}}}function $H(t,e){let r=e.evidenceAt===null?Number.NaN:Date.parse(e.evidenceAt),s=t.map((a,l)=>({message:a,index:l})).filter(({message:a})=>a.role==="user").filter(({message:a})=>!Number.isFinite(r)||a.timestamp.getTime()<=r),i=s.find(({message:a})=>qH(a.content,e.messageId));if(i!==void 0)return i.index;if(e.legacyMailboxId!==null){let a=e.legacyMailboxId,l=[...s].reverse().find(({message:d})=>BH(d.content,a));if(l!==void 0)return l.index}return e.providerPrompt===null?-1:[...s].reverse().find(({message:a})=>a.content.includes(e.providerPrompt))?.index??-1}function MH(t){let e=fn(t.legacy)?t.legacy:null;return e?.table==="agent_mailbox"&&typeof e.id=="number"&&Number.isSafeInteger(e.id)&&e.id>0?e.id:null}function DH(t,e){for(let r of t.slice(e+1)){if(r.role==="user")return null;if(r.role==="assistant"&&r.content.trim().length>0)return r}return null}function jH(t,e){let r=t.db.prepare(`
|
|
2727
2727
|
SELECT response.* FROM message_event AS response
|
|
2728
2728
|
WHERE response.event_type = 'RESPONSE_CREATE'
|
|
2729
2729
|
AND (
|
|
@@ -2740,7 +2740,7 @@ Note: ${l.orphan_policy}
|
|
|
2740
2740
|
ORDER BY response.seq ASC
|
|
2741
2741
|
LIMIT 1
|
|
2742
2742
|
`).get(e,e);return r===void 0?null:vl(r)}function PH(t){let e=fn(t.delivered_by)?t.delivered_by:null;return{lease_id:vi(e?.lease_id,t.lease_id),pid:uk(e?.pid,t.pid,t.holder_pid),host:vi(e?.host,t.host,t.holder_host)}}function ak(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]":""}
|
|
2743
|
-
`);for(let i of e.children)ak(t,i,r+1)}function cs(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return rH.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function gm(t){if(t===void 0)return{value:null};try{return{value:je(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Sl(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 FH(t){return t===void 0?{iso:null}:lk(t,null)}function lk(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 ym(t,e,r){let n=un(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ee("self_identity",pr(r)):new Ee("self_identity",nm(r))}function yr(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function Yt(t){return t.includes("--json")}function
|
|
2743
|
+
`);for(let i of e.children)ak(t,i,r+1)}function cs(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return rH.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function gm(t){if(t===void 0)return{value:null};try{return{value:je(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Sl(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 FH(t){return t===void 0?{iso:null}:lk(t,null)}function lk(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 ym(t,e,r){let n=un(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ee("self_identity",pr(r)):new Ee("self_identity",nm(r))}function yr(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function Yt(t){return t.includes("--json")}function te(t,e,r,n){return e?(ee(t,{status:"error",errorKind:r,message:n}),1):N(t,n)}function Em(t){if(t===void 0)return{value:tH};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>sk?{error:`invalid --limit value: ${t}; expected 1..${sk}`}:{value:e}}function dk(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function ck(t,e){if(t===void 0)return{value:null};try{let r=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!fn(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"||!hm(r.self)||!(r.to===null||typeof r.to=="string"&&hm(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"||!hm(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 hm(t){try{return je(t),!0}catch{return!1}}function UH(t){return nH.includes(t)}function WH(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","ClaudeMock"].includes(t)}function fn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function qH(t,e){let r=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${r}(?:$|[^A-Za-z0-9_-])`).test(t)}function BH(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function vi(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function uk(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var eH,tH,sk,hr,rH,nH,sH,gr,iH,oH,aH,lH,dH,cH,uH,fH,mH,pH,Ee,mk=w(()=>{"use strict";li();ht();kn();Jt();nk();De();Ka();nl();yl();gi();at();eH=24*60*60*1e3,tH=100,sk=1e3,hr=1,rH=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,nH=["CREATE","RESPONSE_CREATE"],sH=["DELIVERED","RESPONSE_DELIVERED"],gr=`schema_version is the output-contract version consumers must switch on.
|
|
2744
2744
|
schema identifies the backing event-log substrate; it is not a second output version.`,iH=`usage:
|
|
2745
2745
|
lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
|
|
2746
2746
|
lmctl mail history <message_id> [--json]
|
|
@@ -2974,8 +2974,8 @@ With --json, the stable external contract is:
|
|
|
2974
2974
|
"incomplete_capture_note":"..."}
|
|
2975
2975
|
${gr}
|
|
2976
2976
|
Default text output is human-readable and may change without notice.
|
|
2977
|
-
`,Ee=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as pk,mkdirSync as HH,readdirSync as XH,readFileSync as _k,writeFileSync as JH}from"node:fs";import{join as us}from"node:path";import{fileURLToPath as GH}from"node:url";function VH(t){try{return KH.some(e=>pk(us(t,e)))}catch{return!1}}function YH(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 hk(t,e){t.durable_memory_mode!=="db"?zH(t):ZH(t,e)}function gk(t){let e=VH(t),r;try{r=XH(bl).filter(n=>n.endsWith(".template")).sort()}catch(n){return D({event:"bootstrap_templates_unreadable",path:bl,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 zH(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),D({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=us(e,"durable-memory");try{HH(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),D({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=gk(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=us(r,o);if(!pk(a))try{let l=_k(us(bl,i),"utf8");JH(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),D({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 ZH(t,e){let r=t.local_path??"",n=gk(r),s=[];for(let i of n){let o=us(bl,i),a;try{a=_k(o,"utf8")}catch(d){console.error(`[bootstrap] failed to read ${i}:`,d),D({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:d instanceof Error?d.message:String(d)});continue}let l=YH(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),D({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path:o});continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(d){console.error(`[bootstrap] failed to upsert ${l.name}:`,d),D({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:d instanceof Error?d.message:String(d)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var bl,KH,yk=w(()=>{"use strict";pe();bl=us(GH(import.meta.url),"../../config/durable_memory_templates"),KH=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as QH}from"node:crypto";import{existsSync as e2,mkdirSync as t2,writeFileSync as r2}from"node:fs";import{dirname as n2,join as fs}from"node:path";function wm(t){return typeof t=="string"&&t.startsWith(Ek)}function d2(t){if(!wm(t))throw new Nt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Ek.length),r=e.indexOf("/");if(r<=0)throw new Nt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!a2.has(n))throw new Nt(`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 Nt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new Nt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function c2(t,e,r){if(t==="workflow")return da(e,r);let n=t==="mcp"?fs("templates","mcp",`${e}.json`):fs("templates","skills",e,"SKILL.md");for(let s of Eu(r)){let i=fs(s,n);if(e2(i))return i}return null}function u2(t,e,r){let n=fs(yu(r),i2,t);return t==="skill"?fs(n,e,"SKILL.md"):fs(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function f2(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 wk(t,e){let{kind:r,name:n,ref:s}=d2(t),i=c2(r,n,e);if(i!==null)return i;let o=`${s2}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(o2)})}catch(c){throw new Nt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${c instanceof Error?c.message:String(c)}). Failing closed.`,"missing")}if(!a.ok)throw new Nt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let c=l2.exec(s);if(c!==null){let u=QH("sha256").update(l).digest("hex");if(u.toLowerCase()!==c[1].toLowerCase())throw new Nt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${c[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!f2(r,l))throw new Nt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let d=u2(r,n,e);return t2(n2(d),{recursive:!0}),r2(d,l,"utf8"),d}var Ek,s2,i2,o2,a2,Nt,l2,Tk=w(()=>{"use strict";wu();Ek="lmctl://",s2="https://lmctl.com/templates/",i2=".cache",o2=8e3,a2=new Set(["workflow","mcp","skill"]),Nt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},l2=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as m2}from"node:child_process";import{cpSync as vk,existsSync as p2,mkdirSync as _2,mkdtempSync as h2,readFileSync as lre,statSync as g2,writeFileSync as Sk}from"node:fs";import{homedir as y2,tmpdir as E2}from"node:os";import{basename as bk,join as At}from"node:path";function Tm(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function vm(t,e,r){if(Array.isArray(t)){for(let n of t)vm(n,e,r);return}if(Tm(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))vm(n,e,r)}}function S2(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(!(!Tm(a)||!Array.isArray(a.steps)))for(let l of a.steps)Tm(l)&&l.members!==void 0&&vm(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(v2(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function b2(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function k2(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(w2)})}catch(s){throw new
|
|
2978
|
-
`)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(T2.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=h2(At(E2(),`lmctl-skill-${r.alias}-`));for(let d of s.skills){let c=typeof d=="string"&&!Ak.test(d)?d:(await Ik(d,l,r.alias)).dir;I2(i,["skills","install",c,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(Nk[i]!==void 0){let l=Nk[i]();for(let d of s.skills)await Ik(d,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var
|
|
2977
|
+
`,Ee=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as pk,mkdirSync as HH,readdirSync as XH,readFileSync as _k,writeFileSync as JH}from"node:fs";import{join as us}from"node:path";import{fileURLToPath as GH}from"node:url";function VH(t){try{return KH.some(e=>pk(us(t,e)))}catch{return!1}}function YH(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 hk(t,e){t.durable_memory_mode!=="db"?zH(t):ZH(t,e)}function gk(t){let e=VH(t),r;try{r=XH(bl).filter(n=>n.endsWith(".template")).sort()}catch(n){return D({event:"bootstrap_templates_unreadable",path:bl,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 zH(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),D({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=us(e,"durable-memory");try{HH(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),D({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=gk(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=us(r,o);if(!pk(a))try{let l=_k(us(bl,i),"utf8");JH(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),D({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 ZH(t,e){let r=t.local_path??"",n=gk(r),s=[];for(let i of n){let o=us(bl,i),a;try{a=_k(o,"utf8")}catch(d){console.error(`[bootstrap] failed to read ${i}:`,d),D({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:d instanceof Error?d.message:String(d)});continue}let l=YH(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),D({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path:o});continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(d){console.error(`[bootstrap] failed to upsert ${l.name}:`,d),D({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:d instanceof Error?d.message:String(d)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var bl,KH,yk=w(()=>{"use strict";pe();bl=us(GH(import.meta.url),"../../config/durable_memory_templates"),KH=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as QH}from"node:crypto";import{existsSync as e2,mkdirSync as t2,writeFileSync as r2}from"node:fs";import{dirname as n2,join as fs}from"node:path";function wm(t){return typeof t=="string"&&t.startsWith(Ek)}function d2(t){if(!wm(t))throw new Nt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Ek.length),r=e.indexOf("/");if(r<=0)throw new Nt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!a2.has(n))throw new Nt(`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 Nt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new Nt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function c2(t,e,r){if(t==="workflow")return da(e,r);let n=t==="mcp"?fs("templates","mcp",`${e}.json`):fs("templates","skills",e,"SKILL.md");for(let s of Eu(r)){let i=fs(s,n);if(e2(i))return i}return null}function u2(t,e,r){let n=fs(yu(r),i2,t);return t==="skill"?fs(n,e,"SKILL.md"):fs(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function f2(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 wk(t,e){let{kind:r,name:n,ref:s}=d2(t),i=c2(r,n,e);if(i!==null)return i;let o=`${s2}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(o2)})}catch(c){throw new Nt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${c instanceof Error?c.message:String(c)}). Failing closed.`,"missing")}if(!a.ok)throw new Nt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let c=l2.exec(s);if(c!==null){let u=QH("sha256").update(l).digest("hex");if(u.toLowerCase()!==c[1].toLowerCase())throw new Nt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${c[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!f2(r,l))throw new Nt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let d=u2(r,n,e);return t2(n2(d),{recursive:!0}),r2(d,l,"utf8"),d}var Ek,s2,i2,o2,a2,Nt,l2,Tk=w(()=>{"use strict";wu();Ek="lmctl://",s2="https://lmctl.com/templates/",i2=".cache",o2=8e3,a2=new Set(["workflow","mcp","skill"]),Nt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},l2=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as m2}from"node:child_process";import{cpSync as vk,existsSync as p2,mkdirSync as _2,mkdtempSync as h2,readFileSync as lre,statSync as g2,writeFileSync as Sk}from"node:fs";import{homedir as y2,tmpdir as E2}from"node:os";import{basename as bk,join as At}from"node:path";function Tm(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function vm(t,e,r){if(Array.isArray(t)){for(let n of t)vm(n,e,r);return}if(Tm(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))vm(n,e,r)}}function S2(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(!(!Tm(a)||!Array.isArray(a.steps)))for(let l of a.steps)Tm(l)&&l.members!==void 0&&vm(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(v2(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function b2(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function k2(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(w2)})}catch(s){throw new qr(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new qr(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>kk)throw new qr(e,`fetched ${t} exceeds ${kk} bytes`);return n}function I2(t,e,r,n){let s=m2(t,e,{cwd:r,env:Sr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new qr(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new qr(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function N2(t){if(typeof t!="string")return t.name;let e=bk(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?bk(t.replace(/\/skill\.md$/i,"")):e}async function Ik(t,e,r){let n=N2(t),s=At(e,n);if(_2(s,{recursive:!0}),typeof t!="string")return Sk(At(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(wm(t)&&(t=await wk(t)),Ak.test(t))return Sk(At(s,"SKILL.md"),await k2(t,r),"utf8"),{name:n,dir:s};if(!p2(t))throw new qr(r,`skill path not found: ${t}`);return g2(t).isDirectory()?(vk(t,s,{recursive:!0}),{name:n,dir:s}):(vk(t,At(s,"SKILL.md")),{name:n,dir:s})}async function xk(t){let{dal:e,member:r,stderr:n}=t,s=S2(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Qe(r),o=r.sessiondir||t.baseDir||b2(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
2978
|
+
`)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(T2.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=h2(At(E2(),`lmctl-skill-${r.alias}-`));for(let d of s.skills){let c=typeof d=="string"&&!Ak.test(d)?d:(await Ik(d,l,r.alias)).dir;I2(i,["skills","install",c,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(Nk[i]!==void 0){let l=Nk[i]();for(let d of s.skills)await Ik(d,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var qr,Ak,w2,kk,T2,v2,Si,Nk,Rk=w(()=>{"use strict";dt();Tk();yt();hi();qr=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Ak=/^https?:\/\//i,w2=8e3,kk=1e6,T2=new Set(["opencode"]),v2=t=>JSON.stringify(t),Si=()=>process.env.HOME??y2();Nk={claude:()=>At(Si(),".claude","skills"),qwen:()=>At(Si(),".qwen","skills"),codex:()=>At(Si(),".codex","skills"),copilot:()=>At(Si(),".copilot","skills"),kimi:()=>At(process.env.KIMI_CODE_HOME??At(Si(),".kimi-code"),"skills")}});var Sm,Lk=w(()=>{"use strict";Sm=`---
|
|
2979
2979
|
|
|
2980
2980
|
# Durable memory \u2014 how to use it
|
|
2981
2981
|
|
|
@@ -2986,20 +2986,20 @@ ON EVERY NEW TASK:
|
|
|
2986
2986
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
2987
2987
|
3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
|
|
2988
2988
|
|
|
2989
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var Ck={};he(Ck,{runTeam:()=>L2});import{existsSync as A2}from"node:fs";import{join as x2}from"node:path";async function L2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(R2),0;try{return await O(e,async s=>{switch(r){case"create":return C2(n,e,s);case"list":return $2(n,e,s);case"show":return M2(n,e,s);case"add-member":return D2(n,e,s);case"seed":return Ok(n,e,s,!1);case"refresh":return Ok(n,e,s,!0);case"companion":return P2(n,e,s);case"list-roots":return O2(n,e,s);default:return N(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return Ke(e,s)}}function O2(t,e,r){let n=Q(t,[]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,"usage: team list-roots [--json]");let s=r.listRootTeams().map(i=>({...i,missing_on_disk:!A2(i.teamfile_path)||void 0}));return
|
|
2989
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var Ck={};he(Ck,{runTeam:()=>L2});import{existsSync as A2}from"node:fs";import{join as x2}from"node:path";async function L2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(R2),0;try{return await O(e,async s=>{switch(r){case"create":return C2(n,e,s);case"list":return $2(n,e,s);case"show":return M2(n,e,s);case"add-member":return D2(n,e,s);case"seed":return Ok(n,e,s,!1);case"refresh":return Ok(n,e,s,!0);case"companion":return P2(n,e,s);case"list-roots":return O2(n,e,s);default:return N(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return Ke(e,s)}}function O2(t,e,r){let n=Q(t,[]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,"usage: team list-roots [--json]");let s=r.listRootTeams().map(i=>({...i,missing_on_disk:!A2(i.teamfile_path)||void 0}));return K(n,"--json")?ee(e,s):e.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}${i.missing_on_disk?" MISSING (file deleted or renamed)":""}`).join(`
|
|
2990
2990
|
`)+(s.length>0?`
|
|
2991
2991
|
`:"")),0}function C2(t,e,r){let[n]=t;if(n===void 0)return N(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
2992
|
-
`),0}function $2(t,e,r){let n=Q(t,[]);if(n.error!==void 0)return N(e,n.error);let s=r.listTeams();return
|
|
2992
|
+
`),0}function $2(t,e,r){let n=Q(t,[]);if(n.error!==void 0)return N(e,n.error);let s=r.listTeams();return K(n,"--json")?ee(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
|
|
2993
2993
|
`)}${s.length>0?`
|
|
2994
|
-
`:""}`),0}function M2(t,e,r){let n=Q(t,[]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(
|
|
2994
|
+
`:""}`),0}function M2(t,e,r){let n=Q(t,[]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(K(n,"--json"))ee(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
|
|
2995
2995
|
`);for(let a of o)e.stdout.write(`- ${a.alias} ${Qe(a)} ${a.sessionid??"(unseeded)"}
|
|
2996
|
-
`)}return 0}function D2(t,e,r){let n=Q(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(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 N(e,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return N(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??x2(Oi(),"sessions",i.name,o)});return
|
|
2996
|
+
`)}return 0}function D2(t,e,r){let n=Q(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(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 N(e,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return N(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??x2(Oi(),"sessions",i.name,o)});return K(n,"--json")?ee(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
|
|
2997
2997
|
`),0}async function Ok(t,e,r,n){let s=Q(t,["--alias"]);if(s.error!==void 0)return N(e,s.error);let[i]=s.positionals;if(i===void 0)return N(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 N(e,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return N(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return N(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=j2(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return N(e,`member not found or already seeded: ${a}`);if(n&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return N(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let d=r.listProjects().filter(m=>m.team_id===o.id),c=new Set;for(let m of d){if(c.has(m.workflow_name))continue;c.add(m.workflow_name);let p=r.getWorkflowByName(m.workflow_name);if(p===null)continue;let h=Sw(m.workflow_name,p.definition);if(h.status==="FAIL")return N(e,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of d)hk(m,r);let u=[],f=!1;for(let m of l){let p=await ko({member:m,dal:r}),h=r.updateTeamMemberSession(m.id,p.sessionid);if(h!==null){let _=h.role_prompt??"",g=_.length>0?`${_}
|
|
2998
2998
|
|
|
2999
2999
|
${Sm}`:Sm;r.setMemberPromptSnapshot(m.id,g),u.push(h);let y=rl(Qe(h),p.sessionid);y!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
|
|
3000
3000
|
${y}
|
|
3001
3001
|
`);try{await xk({dal:r,member:h,stderr:e.stderr})}catch(E){f=!0,e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
3002
|
-
`)}}}return
|
|
3002
|
+
`)}}}return K(s,"--json")?ee(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
3003
3003
|
`),f?1:0}function j2(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function P2(t,e,r){let n=Q(t,["--interpreter","--of"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(d=>d.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return N(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return N(e,`member not found: ${o}`);for(let d of a){let c=r.findTeamMemberByAlias(i.id,d);if(c===null)return N(e,`member not found: ${d}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:c.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
3004
3004
|
`),0}var R2,$k=w(()=>{"use strict";ze();Oc();yk();dt();Jt();Rk();Ea();De();Lk();R2=`usage: lmctl team create <name>
|
|
3005
3005
|
lmctl team list [--json]
|
|
@@ -3014,8 +3014,8 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
|
3014
3014
|
refresh to create/update native provider sessions for team members.
|
|
3015
3015
|
team refresh rejects Lead members (alias matching is case-insensitive).
|
|
3016
3016
|
`});var Wk={};he(Wk,{applyMaxBytes:()=>kl,renderMessage:()=>Fk,runTail:()=>B2});async function B2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${q2}
|
|
3017
|
-
`),0;let r=Q(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return N(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return N(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?U2:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return N(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=
|
|
3018
|
-
`)}},h=setInterval(()=>{p()},l*1e3),_=()=>{clearInterval(h),m(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function Mk(t,e,r,n,s){let i;try{i=await
|
|
3017
|
+
`),0;let r=Q(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return N(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return N(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?U2:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return N(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=K(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?W2:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return N(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let d=P(r,"--run");if(d!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return N(e,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(d,10);if(!Number.isFinite(m)||m<=0||String(m)!==d)return N(e,`invalid --run "${d}" (expected a positive integer run id)`);try{return await O(e,async p=>H2(e,p,m,i,o,l))}catch(p){return Ke(e,p)}}let c=Pr(F2,{target:r.positionals[0],alias:r.positionals[1],flags:{session:P(r,"--session"),provider:P(r,"--provider")}});if(c.mode==="error")return N(e,c.message);if(c.mode==="managed")return N(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let m;try{m=await O(e,_=>be(c.teamfile,_))}catch(_){return N(e,`tail: ${_ instanceof Error?_.message:String(_)}`)}let p;try{p=ot(m)}catch(_){return N(e,`tail: ${_ instanceof Error?_.message:String(_)}`)}let h=Xt(p);if(h===void 0)return N(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let _=await O(e,g=>Ne(c.teamfile,h.alias,g));u={provider:_.provider,sessionId:_.sessionid,cwd:_.sessiondir}}catch(_){return _ instanceof ke?N(e,_.message):Ke(e,_)}}else try{let m=await O(e,p=>Ne(c.teamfile,c.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ke?N(e,m.message):Ke(e,m)}else{let m=c.sessionid,p=c.provider;if(p===void 0){let h=await rs(m);if(h.length===0)return N(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return N(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:m}}let f=await Mk(e,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let g=await Mk(e,u.provider,u.sessionId,i,f);g>=0&&(f=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
|
|
3018
|
+
`)}},h=setInterval(()=>{p()},l*1e3),_=()=>{clearInterval(h),m(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function Mk(t,e,r,n,s){let i;try{i=await We(r,e)}catch(d){return t.stderr.write(`tail: failed to load session: ${d instanceof Error?d.message:String(d)}
|
|
3019
3019
|
`),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
3020
3020
|
`),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let d=a;d<o.length;d+=1)l+=`${Fk(o[d])}
|
|
3021
3021
|
`;return t.stdout.write(n.kind==="bytes"?kl(l,n.maxBytes):l),o.length-1}function Fk(t){let e=Uk(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
|
|
@@ -3034,8 +3034,8 @@ ${o.map(a=>` ${a}`).join(`
|
|
|
3034
3034
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
3035
3035
|
A bare <teamfile> with no alias tails that team's Lead member.
|
|
3036
3036
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Dk=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
3037
|
-
`});var Bk,Hk=w(()=>{"use strict";Bk=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"])});var Zk={};he(Zk,{buildSessionInspection:()=>Vk,runSession:()=>Y2});import{readFile as X2}from"node:fs/promises";async function Y2(t,e,r=G2){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return re(e,{schema_version:km,usage:Gk}),0;let n=Q(t,["--query-file"],[]);if(n.error!==void 0)return qr(e,n.error,!0);if(n.positionals.length>0)return qr(e,"positional and inline JSON arguments are not supported; use --query-file",!0);let s=P(n,"--query-file");if(s===void 0)return qr(e,"missing required --query-file",!0);let i;try{i=s==="-"?await uX(e.stdin??process.stdin):await X2(s,"utf8")}catch(u){return qr(e,`cannot read query file ${JSON.stringify(s)}: ${bi(u)}`)}let o;try{o=Z2(i)}catch(u){return qr(e,bi(u))}let a,l,d;try{if(o.teamfile!==void 0&&o.alias!==void 0){let u=await r.resolveTeamTarget(o.teamfile,o.alias,e);a=u.provider,l=u.sessionid,d=u.alias}else a=o.provider,l=o.sessionId}catch(u){return qr(e,bi(u))}let c;try{c=await r.loadSession(l,a)}catch(u){return qr(e,`failed to load session: ${bi(u)}`)}return c===null?qr(e,`session not found: ${l} (provider=${a})`):(re(e,Vk(c,d)),0)}function Vk(t,e){let r=lX(t.messages),n=dX(r,J2),s=nX(t,r!==null),i=Q2(t),o=e?.toLowerCase()==="lead",a=i.filter(u=>u.kind==="file_write").length,l=i.filter(u=>u.kind==="file_edit").length,d=ki[t.provider],c=e===void 0?d==="none"?"none":"partial":d;return{schema_version:km,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:n.text,lastPromptTruncated:n.truncated,handled:s.value,handledSignal:s.signal,tokens:sX(t),toolCalls:i,authorship:{alias:e??null,isLeadAlias:o,selfFileWriteCount:a,selfFileEditCount:l,flag:o&&a+l>0?"lead_self_authoring":null},coverage:{toolCalls:ki[t.provider],resultPairing:Kk[t.provider],backgroundTaskCorrelation:z2(t.provider),authorship:c,tokens:K2[t.provider],handled:s.coverage}}}function z2(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Z2(t){let e;try{e=JSON.parse(t)}catch(l){throw new Error(`query is not valid JSON: ${bi(l)}`)}if(!zk(e))throw new Error("query must be a JSON object");let r=Il(e.teamfile),n=Il(e.alias),s=Il(e.provider),i=Il(e.sessionId),o=r!==void 0||n!==void 0,a=s!==void 0||i!==void 0;if(o&&a)throw new Error("query must use exactly one target form: teamfile+alias or provider+sessionId");if(o){if(r===void 0||n===void 0)throw new Error("team target requires both teamfile and alias");return{teamfile:r,alias:n}}if(a){if(s===void 0||i===void 0)throw new Error("raw target requires both provider and sessionId");if(!Bk.has(s))throw new Error(`invalid provider ${JSON.stringify(s)}`);return{provider:s,sessionId:i}}throw new Error("query requires teamfile+alias or provider+sessionId")}function Q2(t){if(ki[t.provider]==="none")return[];let e=V2[t.provider]??{},r=new Set,n=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??cX(i.toolInput),l=o===void 0?void 0:eX(o,a),d=rX(t.messages,s,i.toolCallId,r,t.provider==="agy"),c=d===void 0?void 0:t.messages[d];d!==void 0&&r.add(d);let u=o===void 0?[]:tX(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)n.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:c?.timestamp.toISOString()??null,result:c===void 0?null:c.toolDetailedContent??c.content})}return n}function eX(t,e){if(e!==void 0)for(let r of[t.inputKey,...t.fallbackInputKeys??[]]){let n=bm(e[r]);if(n!==void 0)return n}}function tX(t,e){if(t.multi===void 0||e===void 0)return[];let r=e[t.multi.pathsKey],n=e[t.multi.kindsKey];if(!Array.isArray(r)||!Array.isArray(n))return[];let s=[];for(let i=0;i<Math.min(r.length,n.length);i+=1){let o=bm(r[i]),a=bm(n[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function rX(t,e,r,n,s){if(r===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!n.has(o)&&a.role==="tool_result"&&a.toolCallId===r)return o}}function nX(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let r=Yk(t.messages,"user");return{value:r>=0&&t.messages.slice(r+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function sX(t){let e=t.lastTokenUsage,r=oX(t),n=aX(t.provider);return{lastTurn:iX(e),aggregate:{input:r,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:n}}function iX(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function oX(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function aX(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function lX(t){let e=Yk(t,"user");return e<0?null:t[e].content}function Yk(t,e){for(let r=t.length-1;r>=0;r-=1)if(t[r].role===e)return r;return-1}function dX(t,e){if(t===null)return{text:null,truncated:!1};let r=Buffer.from(t,"utf8");if(r.length<=e)return{text:t,truncated:!1};let n=e;for(;n>0&&(r[n]&192)===128;)n-=1;return{text:r.subarray(0,n).toString("utf8"),truncated:!0}}function cX(t){if(t!==void 0)try{let e=JSON.parse(t);return zk(e)?e:void 0}catch{return}}function zk(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Il(t){return typeof t=="string"&&t.trim().length>0?t:void 0}function bm(t){return typeof t=="string"?t:void 0}async function uX(t){let e="";for await(let r of t)e+=Buffer.isBuffer(r)?r.toString("utf8"):String(r);return e}function qr(t,e,r=!1){return re(t,{schema_version:km,error:e,...r?{usage:Gk}:{}}),1}function bi(t){return t instanceof Error?t.message:String(t)}var km,J2,Gk,G2,ki,Kk,Xk,K2,Jk,V2,Qk=w(()=>{"use strict";Hk();Jt();De();at();km=1,J2=32*1024,Gk="usage: lmctl session --query-file <path> (- reads JSON from stdin)",G2={loadSession:Ue,resolveTeamTarget:(t,e,r)=>O(r,n=>Ne(t,e,n))},ki={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Kk={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},Xk={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(ki))if(Xk[Kk[t]]>Xk[ki[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);K2={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Jk={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},V2={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:Jk,lmplayer:Jk,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});var aI={};he(aI,{runInfo:()=>hX});import{execFileSync as Im}from"node:child_process";import{dirname as eI,resolve as fX}from"node:path";function _X(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function hX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${pX}
|
|
3038
|
-
`),0;let r=Q(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=
|
|
3037
|
+
`});var Bk,Hk=w(()=>{"use strict";Bk=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"])});var Zk={};he(Zk,{buildSessionInspection:()=>Vk,runSession:()=>Y2});import{readFile as X2}from"node:fs/promises";async function Y2(t,e,r=G2){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return ee(e,{schema_version:km,usage:Gk}),0;let n=Q(t,["--query-file"],[]);if(n.error!==void 0)return Br(e,n.error,!0);if(n.positionals.length>0)return Br(e,"positional and inline JSON arguments are not supported; use --query-file",!0);let s=P(n,"--query-file");if(s===void 0)return Br(e,"missing required --query-file",!0);let i;try{i=s==="-"?await uX(e.stdin??process.stdin):await X2(s,"utf8")}catch(u){return Br(e,`cannot read query file ${JSON.stringify(s)}: ${bi(u)}`)}let o;try{o=Z2(i)}catch(u){return Br(e,bi(u))}let a,l,d;try{if(o.teamfile!==void 0&&o.alias!==void 0){let u=await r.resolveTeamTarget(o.teamfile,o.alias,e);a=u.provider,l=u.sessionid,d=u.alias}else a=o.provider,l=o.sessionId}catch(u){return Br(e,bi(u))}let c;try{c=await r.loadSession(l,a)}catch(u){return Br(e,`failed to load session: ${bi(u)}`)}return c===null?Br(e,`session not found: ${l} (provider=${a})`):(ee(e,Vk(c,d)),0)}function Vk(t,e){let r=lX(t.messages),n=dX(r,J2),s=nX(t,r!==null),i=Q2(t),o=e?.toLowerCase()==="lead",a=i.filter(u=>u.kind==="file_write").length,l=i.filter(u=>u.kind==="file_edit").length,d=ki[t.provider],c=e===void 0?d==="none"?"none":"partial":d;return{schema_version:km,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:n.text,lastPromptTruncated:n.truncated,handled:s.value,handledSignal:s.signal,tokens:sX(t),toolCalls:i,authorship:{alias:e??null,isLeadAlias:o,selfFileWriteCount:a,selfFileEditCount:l,flag:o&&a+l>0?"lead_self_authoring":null},coverage:{toolCalls:ki[t.provider],resultPairing:Kk[t.provider],backgroundTaskCorrelation:z2(t.provider),authorship:c,tokens:K2[t.provider],handled:s.coverage}}}function z2(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Z2(t){let e;try{e=JSON.parse(t)}catch(l){throw new Error(`query is not valid JSON: ${bi(l)}`)}if(!zk(e))throw new Error("query must be a JSON object");let r=Il(e.teamfile),n=Il(e.alias),s=Il(e.provider),i=Il(e.sessionId),o=r!==void 0||n!==void 0,a=s!==void 0||i!==void 0;if(o&&a)throw new Error("query must use exactly one target form: teamfile+alias or provider+sessionId");if(o){if(r===void 0||n===void 0)throw new Error("team target requires both teamfile and alias");return{teamfile:r,alias:n}}if(a){if(s===void 0||i===void 0)throw new Error("raw target requires both provider and sessionId");if(!Bk.has(s))throw new Error(`invalid provider ${JSON.stringify(s)}`);return{provider:s,sessionId:i}}throw new Error("query requires teamfile+alias or provider+sessionId")}function Q2(t){if(ki[t.provider]==="none")return[];let e=V2[t.provider]??{},r=new Set,n=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??cX(i.toolInput),l=o===void 0?void 0:eX(o,a),d=rX(t.messages,s,i.toolCallId,r,t.provider==="agy"),c=d===void 0?void 0:t.messages[d];d!==void 0&&r.add(d);let u=o===void 0?[]:tX(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)n.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:c?.timestamp.toISOString()??null,result:c===void 0?null:c.toolDetailedContent??c.content})}return n}function eX(t,e){if(e!==void 0)for(let r of[t.inputKey,...t.fallbackInputKeys??[]]){let n=bm(e[r]);if(n!==void 0)return n}}function tX(t,e){if(t.multi===void 0||e===void 0)return[];let r=e[t.multi.pathsKey],n=e[t.multi.kindsKey];if(!Array.isArray(r)||!Array.isArray(n))return[];let s=[];for(let i=0;i<Math.min(r.length,n.length);i+=1){let o=bm(r[i]),a=bm(n[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function rX(t,e,r,n,s){if(r===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!n.has(o)&&a.role==="tool_result"&&a.toolCallId===r)return o}}function nX(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let r=Yk(t.messages,"user");return{value:r>=0&&t.messages.slice(r+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function sX(t){let e=t.lastTokenUsage,r=oX(t),n=aX(t.provider);return{lastTurn:iX(e),aggregate:{input:r,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:n}}function iX(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function oX(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function aX(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function lX(t){let e=Yk(t,"user");return e<0?null:t[e].content}function Yk(t,e){for(let r=t.length-1;r>=0;r-=1)if(t[r].role===e)return r;return-1}function dX(t,e){if(t===null)return{text:null,truncated:!1};let r=Buffer.from(t,"utf8");if(r.length<=e)return{text:t,truncated:!1};let n=e;for(;n>0&&(r[n]&192)===128;)n-=1;return{text:r.subarray(0,n).toString("utf8"),truncated:!0}}function cX(t){if(t!==void 0)try{let e=JSON.parse(t);return zk(e)?e:void 0}catch{return}}function zk(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Il(t){return typeof t=="string"&&t.trim().length>0?t:void 0}function bm(t){return typeof t=="string"?t:void 0}async function uX(t){let e="";for await(let r of t)e+=Buffer.isBuffer(r)?r.toString("utf8"):String(r);return e}function Br(t,e,r=!1){return ee(t,{schema_version:km,error:e,...r?{usage:Gk}:{}}),1}function bi(t){return t instanceof Error?t.message:String(t)}var km,J2,Gk,G2,ki,Kk,Xk,K2,Jk,V2,Qk=w(()=>{"use strict";Hk();Jt();De();at();km=1,J2=32*1024,Gk="usage: lmctl session --query-file <path> (- reads JSON from stdin)",G2={loadSession:We,resolveTeamTarget:(t,e,r)=>O(r,n=>Ne(t,e,n))},ki={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Kk={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},Xk={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(ki))if(Xk[Kk[t]]>Xk[ki[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);K2={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Jk={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},V2={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:Jk,lmplayer:Jk,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});var aI={};he(aI,{runInfo:()=>hX});import{execFileSync as Im}from"node:child_process";import{dirname as eI,resolve as fX}from"node:path";function _X(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function hX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${pX}
|
|
3038
|
+
`),0;let r=Q(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=K(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return N(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>yX(e,u,c,n))}catch(u){return Ke(e,u)}}let i=Pr(mX,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return N(e,i.message);if(i.mode==="managed")return N(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let c;try{c=await O(e,u=>be(i.teamfile,u))}catch(u){return N(e,`health: ${u instanceof Error?u.message:String(u)}`)}return EX(e,c,n)}let o,a,l,d;if(i.mode==="ai-team")try{let c=await O(e,u=>Ne(i.teamfile,i.alias,u));o=c.provider,a=c.sessionid,l=c.alias,d={teamfile:c.teamfile,alias:c.alias}}catch(c){return c instanceof ke?N(e,c.message):Ke(e,c)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let c=await rs(a);if(c.length===0)return N(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return N(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);o=c[0]}return gX(e,o,a,l,n,d)}async function gX(t,e,r,n,s,i){let o;try{o=await We(r,e)}catch(c){return N(t,`health: failed to load session: ${c instanceof Error?c.message:String(c)}`)}if(o===null)return N(t,`health: session not found: ${r} (provider=${e})`);let a=wi(o.messages),l=i===void 0?null:await wX(t,i,o),d={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ee(t,d),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
3039
3039
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
3040
3040
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
3041
3041
|
`),l!==null&&t.stdout.write(` Liveness: ${Nm(l.liveness)}
|
|
@@ -3049,7 +3049,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
3049
3049
|
`),a!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${nI(a)}
|
|
3050
3050
|
`),t.stdout.write(` Created: ${d.createdAt}
|
|
3051
3051
|
`),t.stdout.write(` Modified: ${d.modifiedAt}
|
|
3052
|
-
`),0)}async function yX(t,e,r,n){let s=Qr(e,r);if(s===null)return N(t,`health: run ${r}: not found`);let i=Pn(e,r),o=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let d=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(d,(a.get(d)??0)+1)}return n?(
|
|
3052
|
+
`),0)}async function yX(t,e,r,n){let s=Qr(e,r);if(s===null)return N(t,`health: run ${r}: not found`);let i=Pn(e,r),o=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let d=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(d,(a.get(d)??0)+1)}return n?(ee(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
|
|
3053
3053
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
3054
3054
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
3055
3055
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -3059,8 +3059,8 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
3059
3059
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
3060
3060
|
`),t.stdout.write(` AgentCalls: ${o.agentCallCount}
|
|
3061
3061
|
`),t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
|
|
3062
|
-
`),0)}async function EX(t,e,r){let n,s;try{let E=await O(t,v=>{let b=Ve(e,v);if(b.parseErrors.length>0)throw new Error(b.parseErrors.join("; "));return{teamName:b.name,targets:tI(e,v,new Set,[])}});s=E.teamName,n=E.targets}catch(E){return N(t,`health: ${E instanceof Error?E.message:String(E)}`)}let i=sI(e),o=i.kind==="repo"?i:null,a=await rI(t,n),l=[],d=0,c=o===null?void 0:0,u=o===null?void 0:0;for(let E of n){let v=null;try{v=await
|
|
3063
|
-
`)}let b=v?.messageCount,x=o===null?void 0:v===null?null:iI(v,o.since),H=o===null?void 0:v===null?null:oI(v)??"n/a",F=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:E.alias,reportPath:E.reportPath,teamfile:E.teamfile,provider:E.provider,sessionid:E.sessionid,messageCount:b??null,model:v?.model??"(unknown)",lastContext:v?.lastInputTokens,detailLoaded:v!==null,liveness:a.get(Am(E.teamfile,E.alias))??xm(),sessionLimit:v===null?null:wi(v.messages),...o!==null?{activitySinceLastCommit:F,cumulativeTokens:H}:{}}),b===void 0?d=void 0:d!==void 0&&(d+=b),o!==null&&(x==null?c=void 0:c!==void 0&&(c+=x),H==null||H==="n/a"?u=void 0:u!==void 0&&(u+=H))}if(r)return
|
|
3062
|
+
`),0)}async function EX(t,e,r){let n,s;try{let E=await O(t,v=>{let b=Ve(e,v);if(b.parseErrors.length>0)throw new Error(b.parseErrors.join("; "));return{teamName:b.name,targets:tI(e,v,new Set,[])}});s=E.teamName,n=E.targets}catch(E){return N(t,`health: ${E instanceof Error?E.message:String(E)}`)}let i=sI(e),o=i.kind==="repo"?i:null,a=await rI(t,n),l=[],d=0,c=o===null?void 0:0,u=o===null?void 0:0;for(let E of n){let v=null;try{v=await We(E.sessionid,E.provider)}catch($){t.stderr.write(`warning: failed to load session "${E.sessionid}" for ${E.reportPath} (${E.provider}): ${$ instanceof Error?$.message:String($)}
|
|
3063
|
+
`)}let b=v?.messageCount,x=o===null?void 0:v===null?null:iI(v,o.since),H=o===null?void 0:v===null?null:oI(v)??"n/a",F=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:E.alias,reportPath:E.reportPath,teamfile:E.teamfile,provider:E.provider,sessionid:E.sessionid,messageCount:b??null,model:v?.model??"(unknown)",lastContext:v?.lastInputTokens,detailLoaded:v!==null,liveness:a.get(Am(E.teamfile,E.alias))??xm(),sessionLimit:v===null?null:wi(v.messages),...o!==null?{activitySinceLastCommit:F,cumulativeTokens:H}:{}}),b===void 0?d=void 0:d!==void 0&&(d+=b),o!==null&&(x==null?c=void 0:c!==void 0&&(c+=x),H==null||H==="n/a"?u=void 0:u!==void 0&&(u+=H))}if(r)return ee(t,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(E=>({ref:E.ref,timestamp:E.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:E,cumulativeTokens:v,...b})=>({...b,lastContext:b.lastContext??null,...v!==void 0?{cumulativeTokens:v==="n/a"?null:v}:{}})),total:{messageCount:d??null}}),0;let f=Math.max(7,...l.map(E=>E.sessionid.length)),m=Math.max(5,...l.map(E=>E.reportPath.length))+1,p=Math.max(8,...l.map(E=>E.provider.length))+1,h=Math.max(5,...l.map(E=>E.model.length))+1,_=Math.max(4,...l.map(E=>Nm(E.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
|
|
3064
3064
|
`),i.kind==="repo"){t.stdout.write(`Git progress:
|
|
3065
3065
|
`);for(let E of i.commits)t.stdout.write(` ${E.ref}: ${E.timestamp.toISOString()}
|
|
3066
3066
|
`);t.stdout.write(` Uncommitted: ${xt(i.working.uncommittedTracked)} changed (tracked), ${xt(i.working.untracked)} untracked
|
|
@@ -3083,23 +3083,23 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
3083
3083
|
[--json]
|
|
3084
3084
|
|
|
3085
3085
|
Show provider session details, team rollups, or managed run state/token totals.`});var cI={};he(cI,{runLs:()=>AX});import{resolve as Rm}from"node:path";function NX(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function AX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${kX}
|
|
3086
|
-
`),0;let r=Q(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>0)return N(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=
|
|
3086
|
+
`),0;let r=Q(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>0)return N(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=K(r,"--json");if(K(r,"--runs")){for(let g of["--provider","--sessiondir"])if(P(r,g)!==void 0)return N(e,`--runs is mutually exclusive with ${g}`);for(let g of["--recursive","--all"])if(K(r,g))return N(e,`--runs is mutually exclusive with ${g}`);if(n==="teamfile")return N(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),h=IX;if(p!==void 0){let g=Number.parseInt(p,10);if(!Number.isFinite(g)||g<1||String(g)!==p)return N(e,`invalid --limit "${p}" (expected a positive integer)`);if(g>dI)return N(e,`--limit ${g} exceeds maximum (${dI})`);h=g}let _=n==="json"||s===!0?"json":"table";try{return await O(e,async g=>xX(e,g,h,_))}catch(g){return Ke(e,g)}}let o=RX(n,s);if("error"in o)return N(e,o.error);let a=o.format,l=P(r,"--provider"),d=P(r,"--sessiondir"),c=K(r,"--recursive"),u=K(r,"--all"),f;try{f=await bc(l?{provider:l}:{})}catch(p){return N(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=d!==void 0?Rm(d):Rm(process.cwd());f=f.filter(h=>{let _=Rm(h.cwd);return c?_===p||_.startsWith(`${p}/`):_===p})}if(f=NX(f),a==="json")return ee(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":d??process.cwd(),h=c?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
|
|
3087
3087
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
3088
3088
|
`);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
|
|
3089
3089
|
`);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
3090
|
-
`)}return 0}async function xX(t,e,r,n){let s=jn(e,{limit:r});if(n==="json")return
|
|
3090
|
+
`)}return 0}async function xX(t,e,r,n){let s=jn(e,{limit:r});if(n==="json")return ee(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.
|
|
3091
3091
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
3092
3092
|
`);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}
|
|
3093
3093
|
`)}return 0}function RX(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 kX,IX,dI,uI=w(()=>{"use strict";Ft();De();ir();kX=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
3094
3094
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
3095
3095
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
3096
3096
|
|
|
3097
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,IX=50,dI=500});import{existsSync as ms,readFileSync as Cm}from"node:fs";import{homedir as mI}from"node:os";import{dirname as pI,resolve as Br}from"node:path";import{fileURLToPath as LX}from"node:url";function $m(t,e={}){let r=[],n=$X(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=qX(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(d=>d.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(i==="kimi"){if(!s.model)continue;let a=UX(e.kimiConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${fI(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Al??"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: ${fI(o)}`)}return r}function $X(t){if(!t&&Ii)return Ii;let e=new Map,r,n=t??MX();if(!ms(n))return r=`${n} not found`,t||Lm(e),t||(Ii=e),t||(Al=r),e;let s;try{s=Cm(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Lm(e),t||(Ii=e),t||(Al=r),e}for(let[i,o]of Object.entries(OX)){let a=PX(s,o),l=FX(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Lm(e),t||(Ii=e),t||(Al=r),e}function MX(){return DX(pI(LX(import.meta.url)))}function DX(t){let e=jX(t);if(e){let n=Br(e,"durable-memory","model_selection.md");if(ms(n))return n}let r=[Br(t,"..","..","durable-memory","model_selection.md"),Br(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(ms(n))return n;return r[r.length-1]}function jX(t){let e=Br(t);for(;;){if(ms(Br(e,"package.json")))return e;let r=pI(e);if(r===e)return null;e=r}}function Lm(t){for(let[e,r]of Object.entries(CX))t.set(e,r)}function PX(t,e){let n=new RegExp(`^## ${HX(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 FX(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 UX(t){let e=process.env.KIMI_CODE_HOME||Br(mI(),".kimi-code"),r=t??Br(e,"config.toml");if(!ms(r))return{available:!1,models:[],reason:`${r} not found`};let n;try{n=Cm(r,"utf-8")}catch(i){return{available:!1,models:[],reason:`${r} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of n.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${r} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=WX(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${r} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${r} has no [models] entries`}:{available:!0,models:[...s].sort()}}function WX(t){let e=[],r=0;for(;r<t.length;){for(;/\s/.test(t[r]??"");)r++;if(r>=t.length)break;let n="",s=t[r]==='"'||t[r]==="'"?t[r++]:void 0;if(s){for(;r<t.length&&t[r]!==s;)s==='"'&&t[r]==="\\"&&r+1<t.length&&r++,n+=t[r++];if(t[r]!==s)return null;r++}else{for(;r<t.length&&t[r]!==".";)n+=t[r++];n=n.trim()}if(!n)return null;for(e.push(n);/\s/.test(t[r]??"");)r++;if(r>=t.length)break;if(t[r]!==".")return null;r++}return e.length>0?e:null}function qX(t){let e=t??Br(mI(),".config","opencode","opencode.json");if(!ms(e))return{available:!0,models:[]};let r;try{r=JSON.parse(Cm(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:BX(r)}}function BX(t){if(!Om(t))return[];let e=Nl(t.provider)??Nl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Om(s))continue;let i=Nl(s.models)??Nl(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Nl(t){return Om(t)?t:null}function Om(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function fI(t){return t.length>0?t.join(", "):"(none)"}function HX(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var OX,CX,Ii,Al,_I=w(()=>{"use strict";OX={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},CX={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Ii=null});import{homedir as XX}from"node:os";import{basename as JX}from"node:path";function xl(t,e){let r=new Set;return{text:t.replace(KX,(s,i)=>{let o=i.trim(),a=GX[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function Rl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:VX(t.date)}}function VX(t){return t.toISOString().slice(0,10)}var GX,KX,Mm=w(()=>{"use strict";GX={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=JX(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>XX(),date:t=>t.date},KX=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var xi={};he(xi,{GEMINI_PROVIDER_NOTICE:()=>EI,_setLintOpenCodeConfigProbeForTests:()=>sJ,_setLintSessiondirFsOpsForTests:()=>nJ,_setTeamfileSeedForTests:()=>rJ,buildRootTeamRegistrationRow:()=>kI,registerRootTeam:()=>II,runHire:()=>mJ,runLint:()=>fJ,runRefresh:()=>pJ,runSeed:()=>SI,sha256Text:()=>bI});import{createHash as YX}from"node:crypto";import{accessSync as zX,constants as hI,existsSync as ZX,readFileSync as Cl,realpathSync as Pm,statSync as QX,writeFileSync as Ol}from"node:fs";import{dirname as Hr,resolve as yI}from"node:path";function rJ(t){wI=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Ft(),Ic)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function nJ(t){mn=t===null?Fm:{...Fm,...t}}function sJ(t){TI=t??Ld}async function iJ(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 TI({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 oJ(t,e){let r=Hr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=yI(o);if(n.has(a))continue;let l=aJ(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 aJ(t){try{if(mn.existsSync(t)){if(!mn.statSync(t).isDirectory())return"ENOTDIR";mn.accessSync(t,hI.W_OK);return}let e=cJ(t);if(e===void 0)return;if(!mn.statSync(e).isDirectory())return"ENOTDIR";mn.accessSync(e,hI.W_OK);return}catch(e){return uJ(e)??"permission check failed"}}function lJ(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||vI(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function dJ(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!vI(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=NI(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function vI(t,e){return gI(t)===gI(e)}function gI(t){let e=yI(t);try{return Pm(e)}catch{return e}}function cJ(t){let e=t;for(;;){try{if(mn.existsSync(e))return e}catch{return}let r=Hr(e);if(r===e)return;e=r}}function uJ(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 fJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eJ),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3098
|
-
`),2;let r=t[0],n;try{n=await O(e,d=>be(r,d))}catch(d){return
|
|
3097
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,IX=50,dI=500});import{existsSync as ms,readFileSync as Cm}from"node:fs";import{homedir as mI}from"node:os";import{dirname as pI,resolve as Hr}from"node:path";import{fileURLToPath as LX}from"node:url";function $m(t,e={}){let r=[],n=$X(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=qX(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(d=>d.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(i==="kimi"){if(!s.model)continue;let a=UX(e.kimiConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${fI(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Al??"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: ${fI(o)}`)}return r}function $X(t){if(!t&&Ii)return Ii;let e=new Map,r,n=t??MX();if(!ms(n))return r=`${n} not found`,t||Lm(e),t||(Ii=e),t||(Al=r),e;let s;try{s=Cm(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Lm(e),t||(Ii=e),t||(Al=r),e}for(let[i,o]of Object.entries(OX)){let a=PX(s,o),l=FX(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Lm(e),t||(Ii=e),t||(Al=r),e}function MX(){return DX(pI(LX(import.meta.url)))}function DX(t){let e=jX(t);if(e){let n=Hr(e,"durable-memory","model_selection.md");if(ms(n))return n}let r=[Hr(t,"..","..","durable-memory","model_selection.md"),Hr(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(ms(n))return n;return r[r.length-1]}function jX(t){let e=Hr(t);for(;;){if(ms(Hr(e,"package.json")))return e;let r=pI(e);if(r===e)return null;e=r}}function Lm(t){for(let[e,r]of Object.entries(CX))t.set(e,r)}function PX(t,e){let n=new RegExp(`^## ${HX(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 FX(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 UX(t){let e=process.env.KIMI_CODE_HOME||Hr(mI(),".kimi-code"),r=t??Hr(e,"config.toml");if(!ms(r))return{available:!1,models:[],reason:`${r} not found`};let n;try{n=Cm(r,"utf-8")}catch(i){return{available:!1,models:[],reason:`${r} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of n.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${r} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=WX(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${r} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${r} has no [models] entries`}:{available:!0,models:[...s].sort()}}function WX(t){let e=[],r=0;for(;r<t.length;){for(;/\s/.test(t[r]??"");)r++;if(r>=t.length)break;let n="",s=t[r]==='"'||t[r]==="'"?t[r++]:void 0;if(s){for(;r<t.length&&t[r]!==s;)s==='"'&&t[r]==="\\"&&r+1<t.length&&r++,n+=t[r++];if(t[r]!==s)return null;r++}else{for(;r<t.length&&t[r]!==".";)n+=t[r++];n=n.trim()}if(!n)return null;for(e.push(n);/\s/.test(t[r]??"");)r++;if(r>=t.length)break;if(t[r]!==".")return null;r++}return e.length>0?e:null}function qX(t){let e=t??Hr(mI(),".config","opencode","opencode.json");if(!ms(e))return{available:!0,models:[]};let r;try{r=JSON.parse(Cm(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:BX(r)}}function BX(t){if(!Om(t))return[];let e=Nl(t.provider)??Nl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Om(s))continue;let i=Nl(s.models)??Nl(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Nl(t){return Om(t)?t:null}function Om(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function fI(t){return t.length>0?t.join(", "):"(none)"}function HX(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var OX,CX,Ii,Al,_I=w(()=>{"use strict";OX={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},CX={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Ii=null});import{homedir as XX}from"node:os";import{basename as JX}from"node:path";function xl(t,e){let r=new Set;return{text:t.replace(KX,(s,i)=>{let o=i.trim(),a=GX[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function Rl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:VX(t.date)}}function VX(t){return t.toISOString().slice(0,10)}var GX,KX,Mm=w(()=>{"use strict";GX={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=JX(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>XX(),date:t=>t.date},KX=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var xi={};he(xi,{GEMINI_PROVIDER_NOTICE:()=>EI,_setLintOpenCodeConfigProbeForTests:()=>sJ,_setLintSessiondirFsOpsForTests:()=>nJ,_setTeamfileSeedForTests:()=>rJ,buildRootTeamRegistrationRow:()=>kI,registerRootTeam:()=>II,runHire:()=>mJ,runLint:()=>fJ,runRefresh:()=>pJ,runSeed:()=>SI,sha256Text:()=>bI});import{createHash as YX}from"node:crypto";import{accessSync as zX,constants as hI,existsSync as ZX,readFileSync as Cl,realpathSync as Pm,statSync as QX,writeFileSync as Ol}from"node:fs";import{dirname as Xr,resolve as yI}from"node:path";function rJ(t){wI=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Ft(),Ic)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function nJ(t){mn=t===null?Fm:{...Fm,...t}}function sJ(t){TI=t??Ld}async function iJ(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 TI({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 oJ(t,e){let r=Xr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=yI(o);if(n.has(a))continue;let l=aJ(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 aJ(t){try{if(mn.existsSync(t)){if(!mn.statSync(t).isDirectory())return"ENOTDIR";mn.accessSync(t,hI.W_OK);return}let e=cJ(t);if(e===void 0)return;if(!mn.statSync(e).isDirectory())return"ENOTDIR";mn.accessSync(e,hI.W_OK);return}catch(e){return uJ(e)??"permission check failed"}}function lJ(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||vI(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function dJ(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!vI(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=NI(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function vI(t,e){return gI(t)===gI(e)}function gI(t){let e=yI(t);try{return Pm(e)}catch{return e}}function cJ(t){let e=t;for(;;){try{if(mn.existsSync(e))return e}catch{return}let r=Xr(e);if(r===e)return;e=r}}function uJ(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 fJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eJ),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3098
|
+
`),2;let r=t[0],n;try{n=await O(e,d=>be(r,d))}catch(d){return qe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let s;try{s=ot(n)}catch(d){return qe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=ff(s,Xr(n)),o=$m(s.members),a=Cl(n,"utf8"),l=xl(a,Rl({workdir:Xr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(d=>`{{${d}}}`).join(", ")}`),o.push(...Nd(s.members,Xr(n))),o.push(...oJ(s.members,n)),o.push(...lJ(s.members,Xr(n))),o.push(...await iJ(s.members,Xr(n),e.env));for(let d of i)e.stderr.write(`error: ${d.field}: ${d.message}
|
|
3099
3099
|
`);for(let d of s.members)Wm([d],e),d.session!==void 0&&d.session.length<Ni&&o.push(`${d.alias}: sessionid is shorter than ${Ni} chars; run lmctl seed to refresh it`);for(let d of o)e.stderr.write(`warning: ${d}
|
|
3100
3100
|
`);return i.length>0?1:(e.stdout.write(`ok
|
|
3101
3101
|
`),0)}async function SI(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(tJ),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
3102
|
-
`),2;let r=t[0],n;try{n=await O(e,g=>be(r,g))}catch(g){return
|
|
3102
|
+
`),2;let r=t[0],n;try{n=await O(e,g=>be(r,g))}catch(g){return qe(e,`${r}: ${g instanceof Error?g.message:String(g)}`)}let s;try{s=Pm(n)}catch(g){return qe(e,`${r}: ${g instanceof Error?g.message:String(g)}`)}let i=Xr(n),o;try{o=ot(n)}catch(g){return qe(e,`${r}: ${g instanceof Error?g.message:String(g)}`)}let l=Cl(n,"utf8").split(`
|
|
3103
3103
|
`),d=gJ(l),c=dJ(o.members,l,d,i),u=ff(o,i);if(u.length>0){Wm(o.members,e);for(let g of u)e.stderr.write(`error: ${g.field}: ${g.message}
|
|
3104
3104
|
`);return 1}try{as(e,o,n)}catch{}Wm(o.members,e);for(let g of $m(o.members))e.stderr.write(`warning: ${g}
|
|
3105
3105
|
`);for(let g of Nd(o.members,i))e.stderr.write(`warning: ${g}
|
|
@@ -3113,10 +3113,10 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
3113
3113
|
`),"utf8"),e.stdout.write(`${g.alias}: seeded ${E.sessionId} provider=${g.provider} sessiondir=${y}
|
|
3114
3114
|
`)}let p=l.join(`
|
|
3115
3115
|
`),h=SJ(p,Pm(n));(h!==p||c)&&Ol(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
|
|
3116
|
-
`);let _=new Date().toISOString();try{await O(e,g=>{II(g,{teamfilePath:s,name:o.name,rawText:h,now:_})})}catch(g){return
|
|
3116
|
+
`);let _=new Date().toISOString();try{await O(e,g=>{II(g,{teamfilePath:s,name:o.name,rawText:h,now:_})})}catch(g){return qe(e,g instanceof Error?g.message:String(g))}return 0}async function mJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ll),0;let r=Q(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return jm(e,r.error,Ll);if(r.positionals.length!==2)return jm(e,"expected <teamfile.lmctl> and <alias>",Ll);let[n,s]=r.positionals;if(!wJ(s))return qe(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return qe(e,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return jm(e,"missing value for --provider",Ll);if(!AI(i))return qe(e,`invalid provider "${i}"`);let o;try{o=await O(e,u=>be(n,u))}catch(u){return qe(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Cl(o,"utf8")}catch(u){return qe(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(EJ(a,s))return qe(e,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),d=[`_MEMBER_ alias=${Um(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Um(l)}`]].join(" "),c=vJ(a,d);return Ol(o,c,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
|
|
3117
3117
|
`),e.stdout.write(`Run: lmctl seed ${o}
|
|
3118
|
-
`),0}async function pJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Dm),0;let r,n;if(t.length===1){let u=dn(t[0]);if(u===null)return e.stderr.write(Dm),2;r=u.teamfile,n=u.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Dm),2;let s;try{s=await O(e,u=>be(r,u))}catch(u){return
|
|
3119
|
-
`),a=yJ(o,n);if(a===void 0)return
|
|
3118
|
+
`),0}async function pJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Dm),0;let r,n;if(t.length===1){let u=dn(t[0]);if(u===null)return e.stderr.write(Dm),2;r=u.teamfile,n=u.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Dm),2;let s;try{s=await O(e,u=>be(r,u))}catch(u){return qe(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Cl(s,"utf8")}catch(u){return qe(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
|
|
3119
|
+
`),a=yJ(o,n);if(a===void 0)return qe(e,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Ai(l,"teamfile")!==void 0)return qe(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let d=(e.env??process.env)[Rs],c=Ai(l,"sessionid");return d!==void 0&&d.length>0&&c===d?qe(e,`${n}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=NI(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Ol(s,o.join(`
|
|
3120
3120
|
`),"utf8"),SI([s],e))}function bI(t){return YX("sha256").update(t).digest("hex")}function kI(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:bI(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function II(t,e){let r=Qa(e.rawText,e.teamfilePath);hf(t,e.teamfilePath,r);let n=kI(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(n),n}function _J(t,e,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
|
|
3121
3121
|
`):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=hJ(i,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <path>`,"- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
|
|
3122
3122
|
`)}function hJ(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";case"kimi":return"- Kimi note: use Kimi native background tools when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function gJ(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Ai(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function yJ(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Ai(s,"alias")?.toLowerCase()===r)return n}}function EJ(t,e){for(let r of t.split(`
|
|
@@ -3133,7 +3133,7 @@ ${o}`:`
|
|
|
3133
3133
|
${i}`:`${r}
|
|
3134
3134
|
`:t.length>0?`${r}
|
|
3135
3135
|
${t}`:`${r}
|
|
3136
|
-
`}function AI(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="kimi"||t==="ClaudeMock"}function
|
|
3136
|
+
`}function AI(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="kimi"||t==="ClaudeMock"}function qe(t,e){return t.stderr.write(`error: ${e}
|
|
3137
3137
|
`),1}function jm(t,e,r){return t.stderr.write(`error: ${e}
|
|
3138
3138
|
${r}`),2}function Wm(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_
|
|
3139
3139
|
`),r.provider==="gemini"&&e.stderr.write(`${EI.replace("%s",r.alias)}
|
|
@@ -3215,8 +3215,8 @@ Examples:
|
|
|
3215
3215
|
|
|
3216
3216
|
# Same shape, codex for the Lead and Reviewer2
|
|
3217
3217
|
lmctl plan ./backend --provider codex
|
|
3218
|
-
`});import{execFileSync as KJ}from"node:child_process";import{resolve as UI}from"node:path";function VJ(t){return t.filter(e=>e.state!=="retired")}function WI(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?N(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=KJ("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return N(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=UI(s),o=e.listProjects().find(a=>UI(a.local_path)===i);return o===void 0?N(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function qI(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?N(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?N(t,`project ${r.name} has no assigned team; use --team <name>`):s}function BI(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?N(t,`member not found: ${n}`):i}let s=VJ(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?N(t,`team ${r.name} has no active agent member`):s}var HI=w(()=>{"use strict";De()});var GI={};he(GI,{SIZE_WARN_EST_TOKENS:()=>Li,estimateTokens:()=>JI,runTerminal:()=>QJ});import{spawn as YJ}from"node:child_process";import{statSync as zJ}from"node:fs";async function QJ(t,e){if(t.includes("--help")||t.includes("-h"))return o4(e);let r=Q(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return N(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?
|
|
3219
|
-
`),Pe({event:"model_ignored",provider:d.provider,model:d.model,reason:d.reason})}});if(o===null||o.length===0)return N(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(d=>{let c=YJ(a,l,{stdio:"inherit",cwd:s,env:Je(process.env,s,n,"terminal")});c.on("error",u=>{d(N(t,`failed to launch ${a}: ${u.message}`))}),c.on("exit",u=>d(u??0))})}function n4(t,e,r){let n=P(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?N(t,`team not found: ${n}`):o}let s=WI(t,e,P(r,"--project"));return typeof s=="number"?s:qI(t,e,s,void 0)}async function s4(t,e,r,n){let s=BI(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?N(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Bm(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function JI(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=zJ(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 i4(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return N(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let d=Qe(a),c=a.model??null,u=null;tl(d)&&(u=await
|
|
3218
|
+
`});import{execFileSync as KJ}from"node:child_process";import{resolve as UI}from"node:path";function VJ(t){return t.filter(e=>e.state!=="retired")}function WI(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?N(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=KJ("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return N(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=UI(s),o=e.listProjects().find(a=>UI(a.local_path)===i);return o===void 0?N(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function qI(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?N(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?N(t,`project ${r.name} has no assigned team; use --team <name>`):s}function BI(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?N(t,`member not found: ${n}`):i}let s=VJ(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?N(t,`team ${r.name} has no active agent member`):s}var HI=w(()=>{"use strict";De()});var GI={};he(GI,{SIZE_WARN_EST_TOKENS:()=>Li,estimateTokens:()=>JI,runTerminal:()=>QJ});import{spawn as YJ}from"node:child_process";import{statSync as zJ}from"node:fs";async function QJ(t,e){if(t.includes("--help")||t.includes("-h"))return o4(e);let r=Q(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return N(e,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return N(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?K(r,o):P(r,o)!==void 0)return N(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=P(r,"--alias"),l=ST(o,s,a);return"err"in l?N(e,l.err):Bm(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Ke(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?K(r,l):P(r,l)!==void 0)return N(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=Pr(ZJ,{target:i,alias:o,flags:{}});return a.mode==="error"?N(e,a.message):a.mode!=="ai-team"?N(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?N(e,"terminal: alias required for the teamfile target"):await O(e,l=>e4(e,a.teamfile,a.alias,l,K(r,"--json")))}try{return await O(e,async s=>{let i=n4(e,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return K(r,"--size")?i4(e,s,i,o,K(r,"--json")):s4(e,s,i,o)})}catch(s){return Ke(e,s)}}async function e4(t,e,r,n,s){let i;try{i=Ne(e,r,n)}catch(u){return u instanceof ke?N(t,u.message):Ke(t,u)}let o=Ot(n,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:Bt()});if(!o.acquired){let u=o.current.holder_pid,f=u===null?null:Fe(u)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(u===null?"(holder_pid=unavailable)":`(holder_pid=${u}, ${f})`);return s?(ee(t,{status:"error",errorKind:"busy",message:m,holder_pid:u,holder_liveness:f}),1):N(t,m)}let a=Eb({teamfile:i.teamfile,alias:i.alias}),l=null,d=null,c=null;try{n.setTerminalLock(a),d=t4(n,i),l=setInterval(()=>{try{let u=new Date().toISOString(),f=n.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,u);f&&n.heartbeatAgentInflight(o.lease,o.leaseId,u),!f&&l!==null&&(clearInterval(l),l=null)}catch{}},wb()),l.unref?.();try{as(t,ot(i.teamfile),i.teamfile)}catch{}return c=await Bm(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),c}finally{l!==null&&clearInterval(l),n.clearTerminalLock(a.teamfile,a.alias,a.lock_id),n.releaseAgentInflight(o.lease,o.leaseId),r4(n,d,c)}}function t4(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 r4(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 Bm(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!tl(r))return N(t,`no resume incantation for provider "${r}"`);if(!Av.test(n))return N(t,"refusing to resume: malformed sessionid");let o=Ef(r,n,{isLead:e.isLead,model:i,onModelIgnored:d=>{let c=`warning: ${d.provider} terminal ignored model=${d.model}: ${d.reason}`;t.stderr.write(`${c}
|
|
3219
|
+
`),Pe({event:"model_ignored",provider:d.provider,model:d.model,reason:d.reason})}});if(o===null||o.length===0)return N(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(d=>{let c=YJ(a,l,{stdio:"inherit",cwd:s,env:Je(process.env,s,n,"terminal")});c.on("error",u=>{d(N(t,`failed to launch ${a}: ${u.message}`))}),c.on("exit",u=>d(u??0))})}function n4(t,e,r){let n=P(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?N(t,`team not found: ${n}`):o}let s=WI(t,e,P(r,"--project"));return typeof s=="number"?s:qI(t,e,s,void 0)}async function s4(t,e,r,n){let s=BI(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?N(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Bm(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function JI(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=zJ(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 i4(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return N(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let d=Qe(a),c=a.model??null,u=null;tl(d)&&(u=await We(l,d));let f=JI(u),m=f.est>Li;o.push({alias:a.alias,provider:d,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:c,resume_incantation:m?rl(d,l,c!==null?{model:c}:{}):null})}if(s)return ee(t,{estimate:!0,legend:XI,guide_tokens:Li,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
3220
3220
|
`),t.stdout.write(`${XI}
|
|
3221
3221
|
`);for(let a of o){let l=a.messages===null?"?":String(a.messages),d=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${d} ~${a.est_tokens} tok (rough estimate)
|
|
3222
3222
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -3224,8 +3224,8 @@ Examples:
|
|
|
3224
3224
|
session yourself:
|
|
3225
3225
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
3226
3226
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
3227
|
-
`)}return 0}function o4(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
3228
|
-
lmctl terminal <teamfile> <alias>
|
|
3227
|
+
`)}return 0}function o4(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias> [--json]
|
|
3228
|
+
lmctl terminal <teamfile> <alias> [--json]
|
|
3229
3229
|
lmctl terminal --run <id> [--alias A]
|
|
3230
3230
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
3231
3231
|
|
|
@@ -3233,7 +3233,7 @@ Examples:
|
|
|
3233
3233
|
<teamfile>:<alias> or <teamfile> <alias> (lmctl0 parity).
|
|
3234
3234
|
Bare sessionid is REJECTED (a sessionid carries no provider
|
|
3235
3235
|
resume incantation). Mutually exclusive with --team/--project/
|
|
3236
|
-
--size/--alias
|
|
3236
|
+
--size/--alias.
|
|
3237
3237
|
|
|
3238
3238
|
--run <id> managed mode \u2014 resolve the run's latest agent_call to the
|
|
3239
3239
|
team member's provider session and step into it. Mutually
|
|
@@ -3244,6 +3244,8 @@ Examples:
|
|
|
3244
3244
|
(no --size) step into the member's native provider TUI (YOLO resume)
|
|
3245
3245
|
for manual compact / skills / MCP \u2014 out of orchestration
|
|
3246
3246
|
scope. Spawns ONLY the provider CLI (never lmctl).
|
|
3247
|
+
--json positional mode: emit structured pre-launch errors; a
|
|
3248
|
+
successful step-in remains the native interactive TUI.
|
|
3247
3249
|
--size informational session-size readout (replaces \`compact\`):
|
|
3248
3250
|
message count + transcript bytes + a LOCAL token ESTIMATE
|
|
3249
3251
|
(~4 chars/token heuristic \u2014 no provider round-trip, no
|
|
@@ -3255,7 +3257,7 @@ Examples:
|
|
|
3255
3257
|
tokens it surfaces the resume incantation so YOU can
|
|
3256
3258
|
open & self-compact. Nothing is ever changed
|
|
3257
3259
|
automatically; ${Li} is a guide, not a gate.
|
|
3258
|
-
`),0}var ZJ,Li,XI,KI=w(()=>{"use strict";dt();Jt();De();HI();at();fr();yt();hi();ht();li();rm();ja();pe();ZJ={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Li=2e5,XI="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as a4,randomBytes as l4}from"node:crypto";import{readFile as d4}from"node:fs/promises";function VI(t=new Date,e=l4(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function c4(t){return a4("sha256").update(t).digest("hex")}async function YI(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await d4(n);return{path:r,sha256:c4(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function zI(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Hm=w(()=>{"use strict"});import{spawnSync as ZI}from"node:child_process";import{mkdir as Xm,writeFile as QI,readFile as u4,rm as eN}from"node:fs/promises";import{tmpdir as f4}from"node:os";import{dirname as tN,join as Jm}from"node:path";async function rN(t){let e=t.stagingDir??Jm(f4(),`lmctl-diag-${t.ticketId}`),r=Jm(e,`diagnostic-${t.ticketId}`);await Xm(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Jm(r,u);if(await Xm(tN(m),{recursive:!0}),typeof f=="string")await QI(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await QI(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
|
|
3260
|
+
`),0}var ZJ,Li,XI,KI=w(()=>{"use strict";dt();Jt();De();HI();at();fr();yt();hi();ht();li();rm();ja();pe();wr();ZJ={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Li=2e5,XI="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as a4,randomBytes as l4}from"node:crypto";import{readFile as d4}from"node:fs/promises";function VI(t=new Date,e=l4(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function c4(t){return a4("sha256").update(t).digest("hex")}async function YI(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await d4(n);return{path:r,sha256:c4(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function zI(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Hm=w(()=>{"use strict"});import{spawnSync as ZI}from"node:child_process";import{mkdir as Xm,writeFile as QI,readFile as u4,rm as eN}from"node:fs/promises";import{tmpdir as f4}from"node:os";import{dirname as tN,join as Jm}from"node:path";async function rN(t){let e=t.stagingDir??Jm(f4(),`lmctl-diag-${t.ticketId}`),r=Jm(e,`diagnostic-${t.ticketId}`);await Xm(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Jm(r,u);if(await Xm(tN(m),{recursive:!0}),typeof f=="string")await QI(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await QI(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
|
|
3259
3261
|
`;if(t.data.serve!==void 0){let u=t.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
|
|
3260
3262
|
`:`${u.pid}
|
|
3261
3263
|
# source=${u.pid_source} alive=${String(u.pid_alive)}
|
|
@@ -3273,12 +3275,12 @@ Examples:
|
|
|
3273
3275
|
`:`# source=${f}
|
|
3274
3276
|
# tail_lines=${u.tail_lines}
|
|
3275
3277
|
`;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
|
|
3276
|
-
`:""}`)}if(await s("README.md",m4(t)),t.sanitized)for(let u of n){let f=await u4(u.absPath);try{up(u.bundlePath,f.toString("utf8"))}catch(m){throw await eN(e,{recursive:!0,force:!0}),m instanceof
|
|
3278
|
+
`:""}`)}if(await s("README.md",m4(t)),t.sanitized)for(let u of n){let f=await u4(u.absPath);try{up(u.bundlePath,f.toString("utf8"))}catch(m){throw await eN(e,{recursive:!0,force:!0}),m instanceof Jr,m}}let o=await YI(n),a=zI({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 Xm(tN(t.outputPath),{recursive:!0});let l=ZI("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 d=ZI("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),c=Number.parseInt((d.stdout??"0").trim(),10)||0;return await eN(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:c}}function m4(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(`
|
|
3277
3279
|
`)}var nN=w(()=>{"use strict";Hm();Ci()});import{spawnSync as p4}from"node:child_process";import{stat as _4}from"node:fs/promises";async function sN(t){try{if(!(await _4(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 h4(t);case"hq":return g4(t)}}function h4(t){let r=p4("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 g4(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 iN=w(()=>{"use strict"});var aN={};he(aN,{parseDiagnoseArgs:()=>oN,runDiagnose:()=>w4});import{tmpdir as y4}from"node:os";import{join as E4}from"node:path";async function w4(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${S4()}
|
|
3278
3280
|
`),0;let r=oN(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
3279
3281
|
`),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)
|
|
3280
3282
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
3281
|
-
`),2;let n=VI(),s=r.outputPath??v4(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async o=>{let a=await mp({dal:o,include:r.include,dbPath:ne(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await rN({ticketId:n,data:a,outputPath:s,lmctlNextVersion:Rt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof
|
|
3283
|
+
`),2;let n=VI(),s=r.outputPath??v4(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async o=>{let a=await mp({dal:o,include:r.include,dbPath:ne(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await rN({ticketId:n,data:a,outputPath:s,lmctlNextVersion:Rt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof Jr)return e.stderr.write(`sanitization failed: ${u.message}
|
|
3282
3284
|
`),2;throw u}let d=await sN({mode:i,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),c={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:d,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
3283
3285
|
`):(e.stdout.write(`ticket: ${n}
|
|
3284
3286
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
@@ -3295,7 +3297,7 @@ Examples:
|
|
|
3295
3297
|
`),2;let n=r[0];try{return await O(e,s=>(e.stdout.write(cN(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
3296
3298
|
`),1}}function Gm(){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(`
|
|
3297
3299
|
`)}var dN,Km,Vm,_N=w(()=>{"use strict";wf();De();dN=["Coder","Reviewer1","Polisher"],Km=3e4,Vm=new Set(["attention_needed","paused","escalation"])});var PN={};he(PN,{appendIntent:()=>xN,resolveIntentLogPath:()=>AN,runStatus:()=>P4});import{appendFileSync as N4,existsSync as A4,mkdirSync as x4}from"node:fs";import{homedir as R4,hostname as hN}from"node:os";import{basename as L4,dirname as NN,isAbsolute as O4,join as C4,resolve as $4}from"node:path";function AN(){return process.env.LMCTL_INTENT_LOG??C4(R4(),".lmctl","recent-intents.log")}function xN(t){try{let e=AN();x4(NN(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});N4(e,`${r}
|
|
3298
|
-
`)}catch{}}async function P4(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(M4),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return N(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(t,["--since"],["--json"]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,`unknown argument: ${n.positionals[0]}`);let s=
|
|
3300
|
+
`)}catch{}}async function P4(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(M4),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return N(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(t,["--since"],["--json"]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,`unknown argument: ${n.positionals[0]}`);let s=K(n,"--json"),i=hG(P(n,"--since"));if("error"in i)return N(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>TN(l,o));ee(e,a)}else{let a=await O(e,async l=>tG(await TN(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return xN({verb:"status",args:t}),0}catch(o){return N(e,o instanceof Error?o.message:String(o))}}async function TN(t,e){let r=un(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(pr("status"));return await U4(t)}return await F4(t,r.identity)}async function F4(t,e){let r=je(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(pr("status"));let s=Ve(n.teamfile_path,t),i=zm(Ml(t,{from:r.value})),o=zm(Ml(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=H4([...Ym(t,{from:r.value}),...Ym(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...RN(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>q4(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>Zm(l,t)),to_me:o.map(l=>Zm(l,t))},transcript_harvest:await ON(a),mailbox:{outbound:Dl(X4(t,r.teamfile,r.alias),"outbound"),inbound_pending:Dl(J4(t,r.teamfile,r.alias),"inbound")},waiting_on:G4(t,r.teamfile,r.alias).map(l=>LN(l,t))}}function RN(){let t=null;try{t=O_(L_())}catch{}return{db_path:ne(),site_name:t}}async function U4(t){let e=t.listRootTeams();return{scope:"db",identity:null,...RN(),teams:e.map(r=>W4(t,r)),activity:zm(Ml(t)).map(r=>Zm(r,t)),transcript_harvest:await ON(Ym(t)),mailbox:{pending_outbound:Dl(vN(t,"sender"),"outbound"),pending_inbound:Dl(vN(t,"receiver"),"inbound")},waiting_on:K4(t).map(r=>LN(r,t))}}function W4(t,e){if(!A4(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let r=0;try{r=Ve(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function q4(t,e,r){let n=r.teamfile===void 0?null:be(O4(r.teamfile)?r.teamfile:$4(NN(e),r.teamfile),t),s=_t(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?B4(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function B4(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
|
|
3299
3301
|
SELECT * FROM tracked_invocation
|
|
3300
3302
|
WHERE kind = 'chat'
|
|
3301
3303
|
AND status = 'running'
|
|
@@ -3372,7 +3374,7 @@ Examples:
|
|
|
3372
3374
|
ELSE delivered_at
|
|
3373
3375
|
END ASC,
|
|
3374
3376
|
id ASC
|
|
3375
|
-
`).all()}function zm(t){return t.filter(e=>wn(e)!=="dead")}function LN(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:jN(t.payload),receiver_availability:V4(_t(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function V4(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${lt(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===hN()?"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===hN()?"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 ON(t){let e=[];for(let r of t)e.push(await Y4(r));return e}async function Y4(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 pn(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return pn(r,"missing-request-payload",null,null);let n=z4(t.meta);if(n.provider===null||n.sessionid===null)return pn(r,"missing-session-metadata",n.provider,n.sessionid);if(!Z4(n.provider))return pn(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await
|
|
3377
|
+
`).all()}function zm(t){return t.filter(e=>wn(e)!=="dead")}function LN(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:jN(t.payload),receiver_availability:V4(_t(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function V4(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${lt(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===hN()?"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===hN()?"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 ON(t){let e=[];for(let r of t)e.push(await Y4(r));return e}async function Y4(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 pn(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return pn(r,"missing-request-payload",null,null);let n=z4(t.meta);if(n.provider===null||n.sessionid===null)return pn(r,"missing-session-metadata",n.provider,n.sessionid);if(!Z4(n.provider))return pn(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await We(n.sessionid,n.provider)}catch{return pn(r,"read-error",n.provider,n.sessionid)}if(s===null)return pn(r,"session-not-found",n.provider,n.sessionid);let i=Q4(t.request_payload,s.messages);return i.state!=="completed"?pn(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:DN(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function pn(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 z4(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 Z4(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","ClaudeMock"].includes(t)}function Q4(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(`
|
|
3376
3378
|
|
|
3377
3379
|
`),assistantTimestamp:eG(s[s.length-1]?.timestamp)}}function eG(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function Zm(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:wn(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:IN(t.result_summary),error:IN(t.error)};return r.mailbox_delivery=cG(r,e),r}function Dl(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 tG(t,e){return t.scope==="self"?nG(t,e):sG(t,e)}function rG(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",r=t.reason==="dead-pid"?"appears dead":"stale";return`idle (reclaimable lock: ${e} ${r})`}function nG(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"?rG(n.reclaimable):`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),$N(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),MN(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Qm(r,ep(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Qm(r,ep(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Pl(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Pl(r,t.mailbox.inbound_pending),r.push(""),r.push(CN(t)),r.join(`
|
|
3378
3380
|
`)}function sG(t,e){let r=[];r.push("scope: db"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),$N(r,t.waiting_on,"db"),r.push(""),r.push("transcript harvest:"),MN(r,t.transcript_harvest,"db"),r.push(""),r.push("recent activity:"),Qm(r,ep(t.activity,e.sinceIso),"db"),r.push(""),r.push("mailbox pending outbound:"),Pl(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Pl(r,t.mailbox.pending_inbound),r.push(""),r.push(CN(t)),r.join(`
|