@lmctl-ai/lmctl 0.1.0

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.
Files changed (29) hide show
  1. package/LICENSE +36 -0
  2. package/README.md +36 -0
  3. package/bin/lmctl +4 -0
  4. package/dist/cli/index.js +2180 -0
  5. package/dist/cli/schema.sql +660 -0
  6. package/dist/cli/side_effect_classifier.json +19 -0
  7. package/dist/config/ai_test_templates/example-test.md.template +50 -0
  8. package/dist/config/ai_test_templates/index.md.template +27 -0
  9. package/dist/config/durable_memory_templates/index.md.template +29 -0
  10. package/dist/config/durable_memory_templates/skills_general.md.template +42 -0
  11. package/dist/config/durable_memory_templates/skills_lmdebug.md.template +31 -0
  12. package/dist/config/durable_memory_templates/skills_lmprobe.md.template +31 -0
  13. package/package.json +42 -0
  14. package/workflows/bugfix-extended-v2.compound.json +1018 -0
  15. package/workflows/bugfix-v2.compound.json +856 -0
  16. package/workflows/claim-check-spike-v2.compound.json +136 -0
  17. package/workflows/document-creation.compound.json +200 -0
  18. package/workflows/durable-memory-consolidation-v2.compound.json +185 -0
  19. package/workflows/example-v2.compound.json +200 -0
  20. package/workflows/image-qa.compound.json +128 -0
  21. package/workflows/index.jsonl +15 -0
  22. package/workflows/info-qa.compound.json +120 -0
  23. package/workflows/newspaper.compound.json +129 -0
  24. package/workflows/pr-fix.compound.json +183 -0
  25. package/workflows/pr-followup-v2.compound.json +969 -0
  26. package/workflows/provider-probe.compound.json +107 -0
  27. package/workflows/qa-suite.compound.json +186 -0
  28. package/workflows/spec-driven-task.compound.json +460 -0
  29. package/workflows/triage-v2.compound.json +721 -0
@@ -0,0 +1,2180 @@
1
+ var RE=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)RE(t,r,{get:e[r],enumerable:!0})};import{existsSync as hr,readdirSync as CE,readFileSync as LE}from"node:fs";import{homedir as ME,platform as ku}from"node:os";import{join as mt}from"node:path";function Xt(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:mt(ME(),DE)}function sn(){return mt(Xt(),vu)}function Gt(){return mt(Xt(),PE)}function _t(t){return mt(Gt(),t)}function Nt(t){return mt(_t(t),vu)}function Fi(){let t=[],e=new Set,r=o=>{hr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:sn(),kind:"legacy"});let n=Gt();if(!hr(n))return t;let s;try{s=CE(n)}catch{return t}for(let o of s.sort())Me(o)&&r({workspace_name:o,db_path:Nt(o),kind:"workspace"});return t}function Ui(t){return mt(_t(t),"projects")}function ts(){return mt(Xt(),FE)}function Me(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function rs(){let t=ts();if(!hr(t))return null;try{let e=LE(t,"utf8").trim();return e.length===0||!Me(e)?null:e}catch{return null}}function on(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Me(t)?t:rs()}function de(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=on();if(e!==null)return Nt(e);let r=sn();return hr(r)||!hr(Gt())?r:Nt(Iu)}function BE(t,e=ku()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function ju(t,e=process.stderr,r=ku()){BE(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function Wi(){return mt(Xt(),UE)}function Nu(){return mt(Xt(),WE)}function qE(){try{return hr(Wi())}catch{return!1}}function $u(t=process.stderr){qE()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var DE,vu,PE,FE,Iu,UE,WE,Vt,Be=T(()=>{"use strict";DE=".lmctl",vu="state.db",PE="workspaces",FE="active-workspace",Iu="default",UE="profiles",WE="active-profile";Vt={default:Iu}});function GE(t){for(let e of XE)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 VE(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function zE(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 an(t){let e=t;for(let{re:r,replacement:n}of JE)e=e.replace(r,n);return e=e.replace(YE,r=>!zE(r)||GE(r)?r:xu),e=e.replace(KE,r=>VE(r)?r:xu),e}function ln(t){return t.split(`
4
+ `).map(e=>an(e)).join(`
5
+ `)}function Au(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:Ke}:{key:t,value:an(e)}}function $t(t){if(typeof t=="string")return an(t);if(Array.isArray(t))return t.map(e=>$t(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"?Ke:$t(n):e[r]=$t(n)}return e}return t}function Ou(t,e){for(let{name:r,re:n}of ZE){let s=e.match(n);if(s!==null&&!s[0].includes(Ke))throw new Yt(t,r)}}var Ke,HE,xu,Ru,JE,XE,YE,KE,ZE,Yt,ns=T(()=>{"use strict";Ke="[REDACTED]",HE="[REDACTED_EMAIL]",xu="[REDACTED_IP]",Ru="[USER]",JE=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${Ke}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${Ke}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${Ke}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:Ke},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:Ke},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:Ke},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:Ke},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${Ke}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Ru}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Ru}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:HE}],XE=["127.","10.","192.168.","0.0.0.0"];YE=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,KE=/\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;ZE=[{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"'`]+/}],Yt=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 Bi}from"node:child_process";import{readFileSync as QE}from"node:fs";import{readFile as Hi,stat as Cu}from"node:fs/promises";import{homedir as eb}from"node:os";import{join as tb}from"node:path";import{fileURLToPath as rb}from"node:url";function Kt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(QE(rb(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Lu(t){let e=new Set(t.include??ss),r={};return e.has("serve")&&(r.serve=await sb(t)),e.has("db")&&(r.db=ob(t)),e.has("runs")&&(r.runs=ib(t)),e.has("jobs")&&(r.jobs=ab(t)),e.has("attentions")&&(r.attentions=lb(t)),e.has("env")&&(r.env=await cb(t)),e.has("intents")&&(r.intents=await db(t)),r}async function sb(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await Hi(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await Hi(r,"utf8")).split(`
6
+ `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=ln(f.join(`
7
+ `))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:o,pid_alive:i,log_tail_lines:c,log_tail:a,log_note:l}}function ob(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
+ `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function ib(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${qi} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${qi} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${qi} FROM run
9
+ WHERE terminal_state IS NULL
10
+ AND started_at < ?
11
+ ORDER BY started_at ASC LIMIT 50`,s);return{last_50:$t(o),stale:$t(a),paused:$t(i)}}function ab(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:i,c:a}of r)i==="queued"?n.pending+=a:i==="running"?n.running+=a:i==="done"||i==="succeeded"?n.done+=a:i==="failed"?n.failed+=a:i==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),o=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(i=>i.id),running_ids:o.map(i=>i.id)}}function lb(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:$t(r)}}async function cb(t){let e=Kt(),r=process.version,n=Bi("uname",["-a"],{encoding:"utf8"}),s=ln((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Cu(i);let u=Bi("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Cu(a);let u=Bi("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":ln(o.join(`
13
+ `)),c=[];for(let u of nb){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Au(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function ub(){return process.env.LMCTL_INTENT_LOG??tb(eb(),".lmctl","recent-intents.log")}async function db(t){let e=t.intentLog??ub(),r=t.intentLogTailLines??500;try{let s=(await Hi(e,"utf8")).split(`
14
+ `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:ln(o.join(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var ss,nb,qi,os=T(()=>{"use strict";ns();ss=["serve","db","runs","jobs","attentions","env","intents"];nb=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];qi=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import fb from"better-sqlite3";import{existsSync as pb,mkdirSync as mb,readFileSync as _b}from"node:fs";import{homedir as hb}from"node:os";import{dirname as Mu,join as gb,resolve as Du}from"node:path";import{fileURLToPath as wb,pathToFileURL as yb}from"node:url";function Xi(t){t.dbPath!==":memory:"&&mb(Mu(t.dbPath),{recursive:!0});let e=new fb(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Fu(e);return r===0&&(e.exec(_b(Eb,"utf8")),e.pragma(`user_version = ${Ji}`)),Tb(e,r),e}function Tb(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
16
+ CREATE TABLE IF NOT EXISTS session_size (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ team_name TEXT NOT NULL,
19
+ alias TEXT NOT NULL,
20
+ sessionid TEXT NOT NULL,
21
+ input_tokens INTEGER,
22
+ cache_tokens INTEGER,
23
+ output_tokens INTEGER,
24
+ total_tokens INTEGER,
25
+ observed_at TEXT NOT NULL
26
+ );
27
+ CREATE INDEX IF NOT EXISTS idx_session_size_member ON session_size(team_name, alias, observed_at DESC);
28
+ CREATE INDEX IF NOT EXISTS idx_session_size_session ON session_size(sessionid, observed_at DESC);
29
+ CREATE INDEX IF NOT EXISTS idx_session_size_observed ON session_size(observed_at DESC);
30
+ `),t.pragma("user_version = 2"),r=2),r<3&&r!==0&&(t.prepare("PRAGMA table_info(project)").all().some(s=>s.name==="intake_config")||t.exec("ALTER TABLE project ADD COLUMN intake_config TEXT"),t.pragma("user_version = 3"),r=3),r<4&&r!==0&&(t.prepare("PRAGMA table_info(job)").all().some(s=>s.name==="concurrency_key_resolved")||t.exec("ALTER TABLE job ADD COLUMN concurrency_key_resolved TEXT"),t.exec("CREATE INDEX IF NOT EXISTS idx_job_concurrency_running ON job(concurrency_key_resolved, status)"),t.pragma("user_version = 4"),r=4),r<5&&r!==0&&(t.prepare("PRAGMA table_info(run)").all().some(s=>s.name==="paused_at")||t.exec("ALTER TABLE run ADD COLUMN paused_at TEXT"),t.pragma("user_version = 5"),r=5),r<6&&r!==0&&(t.prepare("PRAGMA table_info(attention)").all().some(s=>s.name==="requires_user")||t.exec("ALTER TABLE attention ADD COLUMN requires_user INTEGER NOT NULL DEFAULT 0"),t.pragma("user_version = 6"),r=6),r<7&&r!==0&&(t.prepare("PRAGMA table_info(project)").all().some(s=>s.name==="test_argv")||t.exec("ALTER TABLE project ADD COLUMN test_argv TEXT"),t.exec(`
31
+ CREATE TABLE IF NOT EXISTS candidate_issue (
32
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
33
+ triage_run_id INTEGER NOT NULL REFERENCES run(id),
34
+ repo TEXT NOT NULL,
35
+ issue_url TEXT NOT NULL,
36
+ issue_number INTEGER NOT NULL,
37
+ title TEXT,
38
+ status TEXT NOT NULL,
39
+ reason TEXT,
40
+ confidence REAL,
41
+ local_path TEXT,
42
+ likely_files TEXT,
43
+ test_command TEXT,
44
+ lmdedup_summary TEXT,
45
+ created_at TEXT NOT NULL,
46
+ approved_at TEXT,
47
+ fix_job_id INTEGER REFERENCES job(id),
48
+ UNIQUE(triage_run_id, issue_url)
49
+ );
50
+ CREATE INDEX IF NOT EXISTS idx_candidate_issue_run ON candidate_issue(triage_run_id);
51
+ CREATE INDEX IF NOT EXISTS idx_candidate_issue_status ON candidate_issue(status);
52
+
53
+ CREATE TABLE IF NOT EXISTS submitted_pr (
54
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
55
+ repo TEXT NOT NULL,
56
+ pr_url TEXT NOT NULL UNIQUE,
57
+ issue_url TEXT,
58
+ local_path TEXT,
59
+ branch TEXT,
60
+ head_sha TEXT,
61
+ status TEXT NOT NULL DEFAULT 'watching',
62
+ submitted_at TEXT NOT NULL,
63
+ last_scanned_at TEXT,
64
+ last_followup_at TEXT,
65
+ last_known_state TEXT,
66
+ last_known_checks TEXT,
67
+ last_known_review TEXT,
68
+ visibility_status TEXT,
69
+ created_by_run_id INTEGER REFERENCES run(id)
70
+ );
71
+ CREATE INDEX IF NOT EXISTS idx_submitted_pr_status ON submitted_pr(status);
72
+ CREATE INDEX IF NOT EXISTS idx_submitted_pr_scanned ON submitted_pr(last_scanned_at);
73
+
74
+ CREATE TABLE IF NOT EXISTS pr_followup_event (
75
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
76
+ submitted_pr_id INTEGER NOT NULL REFERENCES submitted_pr(id),
77
+ run_id INTEGER REFERENCES run(id),
78
+ event_kind TEXT NOT NULL,
79
+ source_url TEXT,
80
+ actor TEXT,
81
+ author_association TEXT,
82
+ body_hash TEXT,
83
+ classification TEXT,
84
+ action_required TEXT,
85
+ created_at TEXT NOT NULL,
86
+ seen_at TEXT,
87
+ resolved_at TEXT,
88
+ UNIQUE(submitted_pr_id, body_hash)
89
+ );
90
+ CREATE INDEX IF NOT EXISTS idx_pr_followup_event_pr ON pr_followup_event(submitted_pr_id);
91
+ CREATE INDEX IF NOT EXISTS idx_pr_followup_event_kind ON pr_followup_event(event_kind);
92
+ `),t.pragma("user_version = 7"),r=7),r<8&&r!==0&&(t.prepare("PRAGMA table_info(step_artifact)").all().some(s=>s.name==="provider_call_mode")||t.exec("ALTER TABLE step_artifact ADD COLUMN provider_call_mode TEXT"),t.pragma("user_version = 8"),r=8),r<9&&r!==0){let n=je(t,"team_member");n.has("state")||t.exec("ALTER TABLE team_member ADD COLUMN state TEXT NOT NULL DEFAULT 'idle' CHECK(state IN ('idle','in_chat','attention_needed','retired'))"),n.has("state_reason")||t.exec("ALTER TABLE team_member ADD COLUMN state_reason TEXT"),n.has("state_updated_at")||t.exec("ALTER TABLE team_member ADD COLUMN state_updated_at TEXT"),n.has("role_prompt")||t.exec("ALTER TABLE team_member ADD COLUMN role_prompt TEXT"),n.has("prompt_snapshot")||t.exec("ALTER TABLE team_member ADD COLUMN prompt_snapshot TEXT"),je(t,"team").has("lead_seed_prompt")||t.exec("ALTER TABLE team ADD COLUMN lead_seed_prompt TEXT"),je(t,"run").has("parent_run_id")||t.exec("ALTER TABLE run ADD COLUMN parent_run_id INTEGER REFERENCES run(id)"),je(t,"project").has("memory_mode")||t.exec("ALTER TABLE project ADD COLUMN memory_mode TEXT NOT NULL DEFAULT 'folder' CHECK(memory_mode IN ('folder','db'))"),t.pragma("user_version = 9"),r=9}if(r<10&&r!==0&&(t.exec(`
93
+ CREATE TABLE IF NOT EXISTS memory (
94
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
95
+ project_id INTEGER NOT NULL REFERENCES project(id),
96
+ type TEXT NOT NULL CHECK (type IN ('user', 'feedback', 'project', 'reference')),
97
+ name TEXT NOT NULL,
98
+ description TEXT,
99
+ body TEXT NOT NULL,
100
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
101
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
102
+ UNIQUE(project_id, name)
103
+ );
104
+ CREATE INDEX IF NOT EXISTS idx_memory_project_type ON memory(project_id, type);
105
+ CREATE INDEX IF NOT EXISTS idx_memory_project_name ON memory(project_id, name);
106
+ `),t.pragma("user_version = 10"),r=10),r<11&&r!==0&&(t.exec(`
107
+ CREATE TABLE IF NOT EXISTS session_event (
108
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
109
+ run_id INTEGER NOT NULL REFERENCES run(id),
110
+ step_id INTEGER REFERENCES step(id),
111
+ kind TEXT NOT NULL,
112
+ timestamp_ms INTEGER NOT NULL,
113
+ payload TEXT NOT NULL,
114
+ payload_truncated INTEGER NOT NULL DEFAULT 0,
115
+ overflow_artifact_id INTEGER REFERENCES step_artifact(id)
116
+ );
117
+ CREATE INDEX IF NOT EXISTS idx_session_event_run ON session_event(run_id);
118
+ CREATE INDEX IF NOT EXISTS idx_session_event_kind_step ON session_event(kind, step_id);
119
+ CREATE INDEX IF NOT EXISTS idx_session_event_timestamp ON session_event(timestamp_ms);
120
+
121
+ CREATE TABLE IF NOT EXISTS rollup_stats (
122
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
123
+ run_id INTEGER NOT NULL REFERENCES run(id),
124
+ step_id INTEGER REFERENCES step(id),
125
+ metric_kind TEXT NOT NULL,
126
+ value REAL NOT NULL,
127
+ bucket_start_ms INTEGER NOT NULL,
128
+ bucket_end_ms INTEGER NOT NULL,
129
+ updated_at INTEGER NOT NULL,
130
+ UNIQUE(run_id, step_id, metric_kind, bucket_start_ms)
131
+ );
132
+ CREATE INDEX IF NOT EXISTS idx_rollup_run_metric ON rollup_stats(run_id, metric_kind);
133
+ CREATE INDEX IF NOT EXISTS idx_rollup_bucket ON rollup_stats(bucket_start_ms);
134
+
135
+ CREATE TABLE IF NOT EXISTS drift_signal (
136
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
137
+ team_member_id INTEGER NOT NULL REFERENCES team_member(id),
138
+ project_id INTEGER REFERENCES project(id),
139
+ signal_kind TEXT NOT NULL,
140
+ severity TEXT NOT NULL CHECK (severity IN ('low', 'medium', 'high')),
141
+ description TEXT NOT NULL,
142
+ detected_at INTEGER NOT NULL,
143
+ expires_at INTEGER,
144
+ acknowledged_at INTEGER,
145
+ payload TEXT
146
+ );
147
+ CREATE INDEX IF NOT EXISTS idx_drift_member ON drift_signal(team_member_id);
148
+ CREATE INDEX IF NOT EXISTS idx_drift_unacked ON drift_signal(team_member_id) WHERE acknowledged_at IS NULL;
149
+
150
+ CREATE TABLE IF NOT EXISTS rollup_cursor (
151
+ key TEXT PRIMARY KEY,
152
+ value INTEGER NOT NULL DEFAULT 0
153
+ );
154
+ `),t.pragma("user_version = 11"),r=11),r<12&&r!==0&&(t.exec(`
155
+ CREATE TABLE IF NOT EXISTS interactive_session (
156
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
157
+ run_id INTEGER NOT NULL REFERENCES run(id),
158
+ step_id INTEGER NOT NULL REFERENCES step(id),
159
+ state_name TEXT NOT NULL,
160
+ turn_count INTEGER NOT NULL DEFAULT 0,
161
+ last_agent_output TEXT,
162
+ last_operator_input TEXT,
163
+ status TEXT NOT NULL CHECK (status IN ('waiting_operator', 'waiting_agent', 'done', 'timeout')),
164
+ started_at INTEGER NOT NULL,
165
+ last_activity_at INTEGER NOT NULL,
166
+ UNIQUE(step_id)
167
+ );
168
+ CREATE INDEX IF NOT EXISTS idx_interactive_status ON interactive_session(status);
169
+ CREATE INDEX IF NOT EXISTS idx_interactive_run_state ON interactive_session(run_id, state_name);
170
+ `),t.pragma("user_version = 12"),r=12),r<13&&r!==0&&(t.exec("ALTER TABLE team DROP COLUMN lead_seed_prompt"),t.pragma("user_version = 13"),r=13),r<14&&r!==0&&(t.exec("ALTER TABLE memory RENAME TO durable_memory"),t.exec("ALTER TABLE project RENAME COLUMN memory_mode TO durable_memory_mode"),t.exec("DROP INDEX IF EXISTS idx_memory_project_type"),t.exec("DROP INDEX IF EXISTS idx_memory_project_name"),t.exec("CREATE INDEX IF NOT EXISTS idx_durable_memory_project_type ON durable_memory(project_id, type)"),t.exec("CREATE INDEX IF NOT EXISTS idx_durable_memory_project_name ON durable_memory(project_id, name)"),t.pragma("user_version = 14"),r=14),r<15&&r!==0&&(t.exec(`
171
+ CREATE TABLE IF NOT EXISTS workflow_version (
172
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
173
+ workflow_id INTEGER NOT NULL REFERENCES workflow(id),
174
+ version INTEGER NOT NULL,
175
+ definition TEXT NOT NULL,
176
+ author TEXT,
177
+ created_at TEXT NOT NULL,
178
+ UNIQUE(workflow_id, version)
179
+ );
180
+ CREATE INDEX IF NOT EXISTS idx_workflow_version_wf ON workflow_version(workflow_id, version DESC);
181
+ `),je(t,"workflow").has("active_version_id")||t.exec("ALTER TABLE workflow ADD COLUMN active_version_id INTEGER REFERENCES workflow_version(id)"),je(t,"run").has("workflow_version_id")||t.exec("ALTER TABLE run ADD COLUMN workflow_version_id INTEGER REFERENCES workflow_version(id)"),t.pragma("user_version = 15"),r=15),r<16&&r!==0&&(t.exec(`
182
+ CREATE TABLE IF NOT EXISTS trigger_instance (
183
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
184
+ workflow_id INTEGER NOT NULL REFERENCES workflow(id),
185
+ trigger_id TEXT NOT NULL,
186
+ trigger_type TEXT NOT NULL,
187
+ parameters TEXT NOT NULL,
188
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK(enabled IN (0,1)),
189
+ cursor TEXT,
190
+ last_poll_at TEXT,
191
+ last_failure_at TEXT,
192
+ last_failure TEXT,
193
+ created_at TEXT NOT NULL,
194
+ UNIQUE(workflow_id, trigger_id)
195
+ );
196
+ CREATE INDEX IF NOT EXISTS idx_trigger_instance_wf ON trigger_instance(workflow_id);
197
+ CREATE INDEX IF NOT EXISTS idx_trigger_instance_enabled ON trigger_instance(enabled) WHERE enabled = 1;
198
+ `),je(t,"step").has("parent_step_id")||t.exec("ALTER TABLE step ADD COLUMN parent_step_id INTEGER REFERENCES step(id)"),t.exec("CREATE INDEX IF NOT EXISTS idx_step_parent ON step(parent_step_id)"),t.pragma("user_version = 16"),r=16),r<17&&r!==0&&(t.exec(`
199
+ CREATE TABLE IF NOT EXISTS project_workflow (
200
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
201
+ project_id INTEGER NOT NULL REFERENCES project(id),
202
+ workflow_id INTEGER NOT NULL REFERENCES workflow(id),
203
+ condition TEXT,
204
+ parameters_override TEXT,
205
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK(enabled IN (0,1)),
206
+ priority INTEGER NOT NULL DEFAULT 100,
207
+ created_at TEXT NOT NULL,
208
+ UNIQUE(project_id, workflow_id, condition)
209
+ );
210
+ CREATE INDEX IF NOT EXISTS idx_project_workflow_project ON project_workflow(project_id, enabled);
211
+ `),je(t,"job").has("workflow_id_override")||t.exec("ALTER TABLE job ADD COLUMN workflow_id_override INTEGER REFERENCES workflow(id)"),t.pragma("user_version = 17"),r=17),r<18&&r!==0&&(t.exec(`
212
+ CREATE TABLE IF NOT EXISTS project_issue (
213
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
214
+ project_id INTEGER NOT NULL REFERENCES project(id),
215
+ title TEXT NOT NULL,
216
+ body TEXT NOT NULL,
217
+ status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open','assigned','closed','reopened')),
218
+ severity TEXT NOT NULL DEFAULT 'medium' CHECK(severity IN ('low','medium','high','critical')),
219
+ labels TEXT,
220
+ ai_test_path TEXT,
221
+ source_run_id INTEGER REFERENCES run(id),
222
+ assigned_run_id INTEGER REFERENCES run(id),
223
+ closed_run_id INTEGER REFERENCES run(id),
224
+ commit_hash TEXT,
225
+ created_at TEXT NOT NULL,
226
+ updated_at TEXT NOT NULL,
227
+ closed_at TEXT
228
+ );
229
+ CREATE INDEX IF NOT EXISTS idx_project_issue_status
230
+ ON project_issue(project_id, status);
231
+ CREATE INDEX IF NOT EXISTS idx_project_issue_ai_test
232
+ ON project_issue(project_id, ai_test_path) WHERE ai_test_path IS NOT NULL;
233
+ `),t.pragma("user_version = 18"),r=18),r<19&&r!==0&&(t.exec(`
234
+ CREATE TABLE IF NOT EXISTS webui_session (
235
+ session_id TEXT PRIMARY KEY,
236
+ user_id TEXT NOT NULL,
237
+ current_node TEXT NOT NULL,
238
+ node_params TEXT,
239
+ prev_node_stack TEXT,
240
+ pending_form TEXT,
241
+ chatbot_session_id TEXT,
242
+ auth_state TEXT NOT NULL,
243
+ last_transition_at TEXT NOT NULL,
244
+ created_at TEXT NOT NULL
245
+ );
246
+ CREATE INDEX IF NOT EXISTS webui_session_user_idx ON webui_session(user_id);
247
+
248
+ CREATE TABLE IF NOT EXISTS chatbot_session (
249
+ chatbot_session_id TEXT PRIMARY KEY,
250
+ user_id TEXT NOT NULL,
251
+ title TEXT,
252
+ created_at TEXT NOT NULL,
253
+ last_active_at TEXT NOT NULL,
254
+ status TEXT NOT NULL DEFAULT 'active'
255
+ );
256
+ CREATE INDEX IF NOT EXISTS chatbot_session_user_idx ON chatbot_session(user_id, last_active_at DESC);
257
+
258
+ CREATE TABLE IF NOT EXISTS chatbot_message (
259
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
260
+ chatbot_session_id TEXT NOT NULL REFERENCES chatbot_session(chatbot_session_id) ON DELETE CASCADE,
261
+ role TEXT NOT NULL,
262
+ content TEXT NOT NULL,
263
+ tool_calls TEXT,
264
+ created_at TEXT NOT NULL
265
+ );
266
+ CREATE INDEX IF NOT EXISTS chatbot_message_session_idx ON chatbot_message(chatbot_session_id, id);
267
+ `),t.pragma("user_version = 19"),r=19),r<20&&r!==0&&(t.exec(`
268
+ CREATE TABLE IF NOT EXISTS lmctl_config (
269
+ key TEXT PRIMARY KEY,
270
+ value TEXT NOT NULL,
271
+ updated_at TEXT NOT NULL
272
+ );
273
+ `),t.pragma("user_version = 20"),r=20),r<21&&r!==0){let n=je(t,"project");n.has("active_run_id")||t.exec("ALTER TABLE project ADD COLUMN active_run_id INTEGER REFERENCES run(id)"),n.has("active_locked_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_at TEXT"),n.has("active_locked_by")||t.exec("ALTER TABLE project ADD COLUMN active_locked_by TEXT"),t.pragma("user_version = 21"),r=21}if(r<22&&r!==0&&(je(t,"project").has("active_locked_expires_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_expires_at TEXT"),t.exec("CREATE INDEX IF NOT EXISTS idx_project_active_lock_expires ON project(active_locked_expires_at) WHERE active_locked_expires_at IS NOT NULL"),t.pragma("user_version = 22"),r=22),r<23&&r!==0){t.exec("DROP INDEX IF EXISTS idx_project_active_lock_expires");let n=je(t,"project");n.has("active_locked_expires_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_expires_at"),n.has("active_locked_by")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_by"),n.has("active_locked_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_at"),n.has("active_run_id")&&t.exec("ALTER TABLE project DROP COLUMN active_run_id"),t.pragma("user_version = 23"),r=23}if(r<24&&r!==0){let n=je(t,"team_member");n.size>0&&!n.has("provider_resolved")&&t.exec("ALTER TABLE team_member ADD COLUMN provider_resolved TEXT"),t.pragma("user_version = 24"),r=24}if(r<25&&r!==0&&(t.exec(`
274
+ CREATE TABLE IF NOT EXISTS composition_unit (
275
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
276
+ name TEXT NOT NULL,
277
+ version INTEGER NOT NULL,
278
+ lang TEXT NOT NULL,
279
+ source TEXT NOT NULL,
280
+ source_sha TEXT NOT NULL,
281
+ compiled_workflow_version_id INTEGER REFERENCES workflow_version(id),
282
+ created_at TEXT NOT NULL,
283
+ UNIQUE(name, version)
284
+ );
285
+ CREATE INDEX IF NOT EXISTS idx_composition_unit_name ON composition_unit(name, version DESC);
286
+ `),t.pragma("user_version = 25"),r=25),r<26&&r!==0){let n=je(t,"workflow");n.size>0&&!n.has("source_uri")&&t.exec("ALTER TABLE workflow ADD COLUMN source_uri TEXT"),n.size>0&&!n.has("source_sha256")&&t.exec("ALTER TABLE workflow ADD COLUMN source_sha256 TEXT"),t.pragma("user_version = 26"),r=26}if(r<27&&r!==0){let n=je(t,"run");n.size>0&&!n.has("pending_escalation_decision")&&t.exec("ALTER TABLE run ADD COLUMN pending_escalation_decision TEXT"),t.pragma("user_version = 27"),r=27}r<28&&r!==0&&(t.exec(`
287
+ CREATE TABLE IF NOT EXISTS prompt_dispatch (
288
+ prompt_id TEXT PRIMARY KEY,
289
+ project_id INTEGER NOT NULL REFERENCES project(id),
290
+ job_id INTEGER NOT NULL REFERENCES job(id),
291
+ text TEXT NOT NULL,
292
+ context_json TEXT,
293
+ created_at TEXT NOT NULL,
294
+ completed_at TEXT
295
+ );
296
+ CREATE INDEX IF NOT EXISTS idx_prompt_dispatch_project ON prompt_dispatch(project_id, created_at DESC);
297
+ CREATE INDEX IF NOT EXISTS idx_prompt_dispatch_job ON prompt_dispatch(job_id);
298
+ `),t.pragma("user_version = 28"),r=28),r<29&&r!==0&&(t.exec(`
299
+ CREATE TABLE IF NOT EXISTS workspace (
300
+ id TEXT PRIMARY KEY,
301
+ name TEXT NOT NULL,
302
+ idle_threshold_ms INTEGER NOT NULL DEFAULT 600000,
303
+ created_at TEXT NOT NULL,
304
+ deleted_at TEXT
305
+ );
306
+ CREATE TABLE IF NOT EXISTS web_project (
307
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
308
+ workspace_id TEXT NOT NULL REFERENCES workspace(id),
309
+ name TEXT NOT NULL,
310
+ repo_path TEXT NOT NULL,
311
+ config_json TEXT,
312
+ linked_v4_project_id INTEGER REFERENCES project(id),
313
+ last_active_at TEXT,
314
+ created_at TEXT NOT NULL,
315
+ deleted_at TEXT
316
+ );
317
+ CREATE INDEX IF NOT EXISTS idx_web_project_workspace ON web_project(workspace_id, deleted_at);
318
+ CREATE INDEX IF NOT EXISTS idx_web_project_v4_link ON web_project(linked_v4_project_id) WHERE linked_v4_project_id IS NOT NULL;
319
+ INSERT OR IGNORE INTO workspace (id, name, idle_threshold_ms, created_at)
320
+ VALUES ('default', 'Default workspace', 600000, '1970-01-01T00:00:00.000Z');
321
+ `),t.pragma("user_version = 29"),r=29),r<30&&r!==0&&(t.exec(`
322
+ CREATE TABLE IF NOT EXISTS mailbox_cursor (
323
+ user_id TEXT PRIMARY KEY,
324
+ last_processed_version_id TEXT,
325
+ last_processed_at TEXT NOT NULL
326
+ );
327
+ `),t.pragma("user_version = 30"),r=30),r<31&&r!==0&&(t.prepare("PRAGMA table_info(project)").all().some(s=>s.name==="test_command")||t.exec("ALTER TABLE project ADD COLUMN test_command TEXT"),t.pragma("user_version = 31"),r=31),r<32&&r!==0&&(t.exec(`
328
+ -- Path-keyed root-team registry (NOT a reuse of team/team_member)
329
+ CREATE TABLE IF NOT EXISTS root_team (
330
+ teamfile_path TEXT PRIMARY KEY,
331
+ name TEXT,
332
+ raw_text TEXT NOT NULL,
333
+ raw_sha256 TEXT NOT NULL,
334
+ registered_at TEXT NOT NULL,
335
+ last_seeded_at TEXT
336
+ );
337
+
338
+ -- Cross-team connection snapshot (from _CONNECT_), captured at seed
339
+ CREATE TABLE IF NOT EXISTS team_connection (
340
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
341
+ source_teamfile TEXT NOT NULL,
342
+ target_name TEXT NOT NULL,
343
+ target_teamfile TEXT NOT NULL,
344
+ created_at TEXT NOT NULL,
345
+ UNIQUE(source_teamfile, target_name)
346
+ );
347
+
348
+ -- One row per request->response exchange
349
+ CREATE TABLE IF NOT EXISTS team_chat_log (
350
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
351
+ root_teamfile TEXT NOT NULL,
352
+ sender_teamfile TEXT NOT NULL,
353
+ sender_alias TEXT NOT NULL,
354
+ receiver_teamfile TEXT NOT NULL,
355
+ receiver_alias TEXT NOT NULL,
356
+ message TEXT NOT NULL,
357
+ response TEXT,
358
+ status TEXT NOT NULL,
359
+ error_detail TEXT,
360
+ truncated INTEGER NOT NULL DEFAULT 0,
361
+ created_at TEXT NOT NULL
362
+ );
363
+ CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
364
+ ON team_chat_log(root_teamfile, created_at);
365
+
366
+ -- Per-receiver in-flight marker for single-sender serialization (\xA75)
367
+ CREATE TABLE IF NOT EXISTS agent_inflight (
368
+ receiver_teamfile TEXT NOT NULL,
369
+ receiver_alias TEXT NOT NULL,
370
+ sender_teamfile TEXT NOT NULL,
371
+ sender_alias TEXT NOT NULL,
372
+ started_at TEXT NOT NULL,
373
+ active_count INTEGER NOT NULL DEFAULT 1,
374
+ PRIMARY KEY(receiver_teamfile, receiver_alias)
375
+ );
376
+ `),t.pragma("user_version = 32"),r=32),r<33&&r!==0&&(je(t,"mailbox_cursor").has("mailbox_key")?t.exec(`
377
+ CREATE TABLE IF NOT EXISTS mailbox_cursor_v33 (
378
+ user_id TEXT NOT NULL,
379
+ mailbox_key TEXT NOT NULL,
380
+ last_processed_version_id TEXT,
381
+ last_processed_at TEXT NOT NULL,
382
+ PRIMARY KEY(user_id, mailbox_key)
383
+ );
384
+ INSERT OR IGNORE INTO mailbox_cursor_v33 (
385
+ user_id,
386
+ mailbox_key,
387
+ last_processed_version_id,
388
+ last_processed_at
389
+ )
390
+ SELECT
391
+ user_id,
392
+ mailbox_key,
393
+ last_processed_version_id,
394
+ last_processed_at
395
+ FROM mailbox_cursor;
396
+ DROP TABLE mailbox_cursor;
397
+ ALTER TABLE mailbox_cursor_v33 RENAME TO mailbox_cursor;
398
+ `):t.exec(`
399
+ CREATE TABLE IF NOT EXISTS mailbox_cursor_v33 (
400
+ user_id TEXT NOT NULL,
401
+ mailbox_key TEXT NOT NULL,
402
+ last_processed_version_id TEXT,
403
+ last_processed_at TEXT NOT NULL,
404
+ PRIMARY KEY(user_id, mailbox_key)
405
+ );
406
+ INSERT OR IGNORE INTO mailbox_cursor_v33 (
407
+ user_id,
408
+ mailbox_key,
409
+ last_processed_version_id,
410
+ last_processed_at
411
+ )
412
+ SELECT
413
+ user_id,
414
+ 'mailbox/' || user_id || '.json',
415
+ last_processed_version_id,
416
+ last_processed_at
417
+ FROM mailbox_cursor;
418
+ DROP TABLE mailbox_cursor;
419
+ ALTER TABLE mailbox_cursor_v33 RENAME TO mailbox_cursor;
420
+ `),t.pragma("user_version = 33"),r=33),r<34&&r!==0&&(t.exec(`
421
+ -- Per-mailbox durable watermark for daemon team_chat_log pushes. First-ever
422
+ -- start seeds this at current MAX(team_chat_log.id) to skip historic backlog;
423
+ -- subsequent restarts resume from the last successfully published id.
424
+ CREATE TABLE IF NOT EXISTS team_chat_log_cursor (
425
+ cursor_key TEXT PRIMARY KEY,
426
+ last_pushed_id INTEGER NOT NULL,
427
+ updated_at TEXT NOT NULL
428
+ );
429
+ `),t.pragma("user_version = 34"),r=34),r<35&&r!==0&&(je(t,"mailbox_cursor").has("last_processed_seq")||t.exec("ALTER TABLE mailbox_cursor ADD COLUMN last_processed_seq INTEGER;"),t.pragma("user_version = 35"),r=35),r<36&&r!==0&&(t.exec(`
430
+ CREATE TABLE IF NOT EXISTS usage_meter (
431
+ user_id TEXT NOT NULL,
432
+ device_id TEXT NOT NULL,
433
+ period TEXT NOT NULL,
434
+ put_count INTEGER NOT NULL DEFAULT 0,
435
+ get_count INTEGER NOT NULL DEFAULT 0,
436
+ list_count INTEGER NOT NULL DEFAULT 0,
437
+ updated_at TEXT NOT NULL,
438
+ PRIMARY KEY(user_id, device_id, period)
439
+ );
440
+ `),t.pragma("user_version = 36"),r=36),pb(bb)}function je(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Fu(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function Sb(){return process.env.LMCTL_DB??gb(hb(),".lmctl","state.db")}var Pu,Eb,bb,Ji,Gi=T(()=>{"use strict";Pu=Mu(wb(import.meta.url)),Eb=Du(Pu,"schema.sql"),bb=Du(Pu,"migrations"),Ji=36;if(process.argv[1]&&import.meta.url===yb(process.argv[1]).href){let t=Xi({dbPath:process.argv[2]??Sb()});try{process.stdout.write(`migrated user_version=${Fu(t)}
441
+ `)}finally{t.close()}}});function gr(t){return typeof t=="string"&&kb.has(t)}function Bu(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: ${is[0]}`,` STANCE: ${is[1]}`,` STANCE: ${is[2]}`,` STANCE: ${Uu}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
442
+ `)}var Uu,is,kb,cn,Wu,Vi,as,un=T(()=>{"use strict";Uu="other",is=["not_enough_information","dont_know","other_work"],kb=new Set([Uu,...is]),cn="@abort",Wu="invalid_decision",Vi="escalation_aborted",as="workflow_escalation"});import{randomUUID as vb}from"node:crypto";function Se(t){return t.provider_resolved??t.provider}function M(){return new Date().toISOString()}function me(t){return new Yi(Xi({dbPath:t.path}))}function qu(t,e,r){let n=Hu(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Hu(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function Hu(t){let e=Ib(t),r=e===null?null:jb(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 Ib(t){try{let e=JSON.parse(t);return Ki(e)?e:null}catch{return null}}function jb(t,e){let r=t[e];return Ki(r)?r:null}function Ki(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Nb(t){return{insertWorkflow:t.prepare(`
443
+ INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
444
+ VALUES (?, ?, ?, ?, ?)
445
+ `),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
446
+ UPDATE workflow
447
+ SET active_version_id = ?,
448
+ definition = ?,
449
+ definition_schema_version = ?
450
+ WHERE id = ?
451
+ `),updateWorkflowActiveVersionDefinitionAndVersion:t.prepare(`
452
+ UPDATE workflow
453
+ SET active_version_id = ?,
454
+ definition = ?,
455
+ definition_schema_version = ?,
456
+ version = ?
457
+ WHERE id = ?
458
+ `),insertWorkflowVersion:t.prepare(`
459
+ INSERT INTO workflow_version (workflow_id, version, definition, author, created_at)
460
+ VALUES (?, ?, ?, ?, ?)
461
+ `),getWorkflowVersion:t.prepare("SELECT * FROM workflow_version WHERE id = ?"),getLatestWorkflowVersion:t.prepare("SELECT version FROM workflow_version WHERE workflow_id = ? ORDER BY version DESC LIMIT 1"),listWorkflowVersions:t.prepare("SELECT * FROM workflow_version WHERE workflow_id = ? ORDER BY version DESC, id DESC"),upsertTriggerInstance:t.prepare(`
462
+ INSERT INTO trigger_instance (workflow_id, trigger_id, trigger_type, parameters, enabled, created_at)
463
+ VALUES (?, ?, ?, ?, ?, ?)
464
+ ON CONFLICT(workflow_id, trigger_id) DO UPDATE SET
465
+ trigger_type = excluded.trigger_type,
466
+ parameters = excluded.parameters,
467
+ enabled = excluded.enabled
468
+ `),getTriggerInstance:t.prepare("SELECT * FROM trigger_instance WHERE id = ?"),getTriggerInstanceByWorkflowAndId:t.prepare("SELECT * FROM trigger_instance WHERE workflow_id = ? AND trigger_id = ?"),listTriggerInstancesForWorkflow:t.prepare("SELECT * FROM trigger_instance WHERE workflow_id = ? ORDER BY trigger_id ASC"),listEnabledTriggerInstances:t.prepare("SELECT * FROM trigger_instance WHERE enabled = 1 ORDER BY id ASC"),setTriggerCursor:t.prepare("UPDATE trigger_instance SET cursor = ?, last_poll_at = ? WHERE id = ?"),setTriggerFailure:t.prepare("UPDATE trigger_instance SET last_failure_at = ?, last_failure = ? WHERE id = ?"),insertTeam:t.prepare("INSERT INTO team (name, created_at) VALUES (?, ?)"),getTeam:t.prepare("SELECT * FROM team WHERE id = ?"),findTeamByName:t.prepare("SELECT * FROM team WHERE name = ?"),listTeams:t.prepare("SELECT * FROM team ORDER BY name ASC, id ASC"),insertTeamMember:t.prepare(`
469
+ INSERT INTO team_member
470
+ (team_id, alias, role, provider, model, sessionid, sessiondir, created_at)
471
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
472
+ `),getTeamMember:t.prepare("SELECT * FROM team_member WHERE id = ?"),listTeamMembers:t.prepare("SELECT * FROM team_member WHERE team_id = ? ORDER BY id ASC"),findTeamMemberByAlias:t.prepare("SELECT * FROM team_member WHERE team_id = ? AND alias = ?"),updateTeamMemberSession:t.prepare("UPDATE team_member SET sessionid = ? WHERE id = ?"),setMemberState:t.prepare("UPDATE team_member SET state = ?, state_reason = ?, state_updated_at = ? WHERE id = ?"),listMembersInState:t.prepare("SELECT * FROM team_member WHERE state = ? ORDER BY id ASC"),setMemberPromptSnapshot:t.prepare("UPDATE team_member SET prompt_snapshot = ? WHERE id = ?"),setMemberProviderResolved:t.prepare("UPDATE team_member SET provider_resolved = ? WHERE id = ?"),setMemberRolePrompt:t.prepare("UPDATE team_member SET role_prompt = ? WHERE id = ?"),updateTeamMemberMeta:t.prepare(`
473
+ UPDATE team_member
474
+ SET role_prompt = ?,
475
+ model = ?,
476
+ provider = ?
477
+ WHERE id = ?
478
+ `),insertTeamMemberCompanion:t.prepare(`
479
+ INSERT INTO team_member_companion (interpreter_id, companion_id, created_at)
480
+ VALUES (?, ?, ?)
481
+ `),getTeamMemberCompanion:t.prepare("SELECT * FROM team_member_companion WHERE id = ?"),insertProject:t.prepare(`
482
+ INSERT INTO project
483
+ (name, description, local_path, workflow_name, team_id, default_branch, intake_config, test_argv, test_command, durable_memory_mode, created_at)
484
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
485
+ `),insertCompositionUnit:t.prepare(`
486
+ INSERT INTO composition_unit
487
+ (name, version, lang, source, source_sha, compiled_workflow_version_id, created_at)
488
+ VALUES (?, ?, ?, ?, ?, ?, ?)
489
+ `),getProject:t.prepare("SELECT * FROM project WHERE id = ?"),findProjectByName:t.prepare("SELECT * FROM project WHERE name = ?"),setProjectIntakeConfig:t.prepare("UPDATE project SET intake_config = ? WHERE id = ?"),updateProjectSettings:t.prepare(`
490
+ UPDATE project
491
+ SET local_path = ?,
492
+ durable_memory_mode = ?,
493
+ default_branch = ?,
494
+ intake_config = ?
495
+ WHERE id = ?
496
+ `),listProjectsWithIntakeConfig:t.prepare("SELECT * FROM project WHERE intake_config IS NOT NULL ORDER BY name ASC, id ASC"),listProjects:t.prepare("SELECT * FROM project ORDER BY name ASC, id ASC"),getProjectByJob:t.prepare(`
497
+ SELECT p.*
498
+ FROM project p
499
+ JOIN job j ON j.project_id = p.id
500
+ WHERE j.id = ?
501
+ `),insertProjectWorkflow:t.prepare(`
502
+ INSERT OR IGNORE INTO project_workflow
503
+ (project_id, workflow_id, condition, parameters_override, enabled, priority, created_at)
504
+ VALUES (?, ?, ?, ?, ?, ?, ?)
505
+ `),getProjectWorkflow:t.prepare("SELECT * FROM project_workflow WHERE id = ?"),findProjectWorkflowUnique:t.prepare(`
506
+ SELECT * FROM project_workflow
507
+ WHERE project_id = ?
508
+ AND workflow_id = ?
509
+ AND condition IS ?
510
+ ORDER BY id ASC
511
+ LIMIT 1
512
+ `),listProjectWorkflows:t.prepare("SELECT * FROM project_workflow WHERE project_id = ? ORDER BY priority ASC, id ASC"),listEnabledProjectWorkflows:t.prepare("SELECT * FROM project_workflow WHERE project_id = ? AND enabled = 1 ORDER BY priority ASC, id ASC"),removeProjectWorkflow:t.prepare("DELETE FROM project_workflow WHERE id = ?"),setProjectWorkflowEnabled:t.prepare("UPDATE project_workflow SET enabled = ? WHERE id = ?"),createIssue:t.prepare(`
513
+ INSERT INTO project_issue
514
+ (project_id, title, body, severity, labels, ai_test_path, source_run_id, created_at, updated_at)
515
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
516
+ `),getIssue:t.prepare("SELECT * FROM project_issue WHERE id = ?"),listIssuesForProject:t.prepare(`
517
+ SELECT * FROM project_issue
518
+ WHERE project_id = ?
519
+ ORDER BY
520
+ CASE severity
521
+ WHEN 'critical' THEN 0
522
+ WHEN 'high' THEN 1
523
+ WHEN 'medium' THEN 2
524
+ WHEN 'low' THEN 3
525
+ ELSE 4
526
+ END,
527
+ created_at ASC,
528
+ id ASC
529
+ `),claimNextIssue:t.prepare(`
530
+ UPDATE project_issue
531
+ SET status = 'assigned',
532
+ assigned_run_id = ?,
533
+ updated_at = ?
534
+ WHERE id = (
535
+ SELECT id FROM project_issue
536
+ WHERE project_id = ?
537
+ AND status IN ('open', 'reopened')
538
+ ORDER BY
539
+ CASE severity
540
+ WHEN 'critical' THEN 0
541
+ WHEN 'high' THEN 1
542
+ WHEN 'medium' THEN 2
543
+ WHEN 'low' THEN 3
544
+ ELSE 4
545
+ END,
546
+ created_at ASC,
547
+ id ASC
548
+ LIMIT 1
549
+ )
550
+ RETURNING *
551
+ `),claimIssue:t.prepare(`
552
+ UPDATE project_issue
553
+ SET status = 'assigned',
554
+ assigned_run_id = ?,
555
+ updated_at = ?
556
+ WHERE id = ?
557
+ AND status IN ('open', 'reopened')
558
+ RETURNING *
559
+ `),closeIssue:t.prepare(`
560
+ UPDATE project_issue
561
+ SET status = 'closed',
562
+ closed_run_id = ?,
563
+ commit_hash = ?,
564
+ closed_at = ?,
565
+ updated_at = ?
566
+ WHERE id = ?
567
+ RETURNING *
568
+ `),reopenIssue:t.prepare(`
569
+ UPDATE project_issue
570
+ SET status = 'reopened',
571
+ source_run_id = ?,
572
+ assigned_run_id = NULL,
573
+ updated_at = ?,
574
+ closed_at = NULL
575
+ WHERE id = ?
576
+ AND status = 'closed'
577
+ RETURNING *
578
+ `),updateIssue:t.prepare(`
579
+ UPDATE project_issue
580
+ SET title = ?,
581
+ body = ?,
582
+ severity = ?,
583
+ labels = ?,
584
+ ai_test_path = ?,
585
+ updated_at = ?
586
+ WHERE id = ?
587
+ RETURNING *
588
+ `),listWorkflows:t.prepare("SELECT * FROM workflow ORDER BY name ASC, version ASC"),upsertDurableMemory:t.prepare(`
589
+ INSERT INTO durable_memory (project_id, type, name, description, body, created_at, updated_at)
590
+ VALUES (?, ?, ?, ?, ?, ?, ?)
591
+ ON CONFLICT(project_id, name) DO UPDATE SET
592
+ type = excluded.type,
593
+ description = excluded.description,
594
+ body = excluded.body,
595
+ updated_at = excluded.updated_at
596
+ `),getDurableMemoryByName:t.prepare("SELECT * FROM durable_memory WHERE project_id = ? AND name = ?"),listDurableMemory:t.prepare("SELECT * FROM durable_memory WHERE project_id = ? ORDER BY name ASC"),listDurableMemoryByType:t.prepare("SELECT * FROM durable_memory WHERE project_id = ? AND type = ? ORDER BY name ASC"),deleteDurableMemory:t.prepare("DELETE FROM durable_memory WHERE project_id = ? AND name = ?"),insertSessionEvent:t.prepare(`
597
+ INSERT INTO session_event (run_id, step_id, kind, timestamp_ms, payload, payload_truncated, overflow_artifact_id)
598
+ VALUES (?, ?, ?, ?, ?, ?, ?)
599
+ `),getSessionEvent:t.prepare("SELECT * FROM session_event WHERE id = ?"),listSessionEvents:t.prepare("SELECT * FROM session_event WHERE run_id = ? ORDER BY id ASC"),listSessionEventsSince:t.prepare("SELECT * FROM session_event WHERE run_id = ? AND id > ? ORDER BY id ASC"),listAllEventsSince:t.prepare("SELECT * FROM session_event WHERE id > ? ORDER BY id ASC LIMIT ?"),upsertRollupStat:t.prepare(`
600
+ INSERT INTO rollup_stats (run_id, step_id, metric_kind, value, bucket_start_ms, bucket_end_ms, updated_at)
601
+ VALUES (?, ?, ?, ?, ?, ?, ?)
602
+ ON CONFLICT(run_id, step_id, metric_kind, bucket_start_ms)
603
+ DO UPDATE SET value = value + excluded.value, updated_at = excluded.updated_at
604
+ `),listRollupStats:t.prepare(`
605
+ SELECT * FROM rollup_stats WHERE run_id = ? ORDER BY step_id ASC, metric_kind ASC, bucket_start_ms ASC
606
+ `),getRollupCursor:t.prepare("SELECT value FROM rollup_cursor WHERE key = ?"),setRollupCursor:t.prepare(`
607
+ INSERT INTO rollup_cursor (key, value) VALUES (?, ?)
608
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value
609
+ `),insertDriftSignal:t.prepare(`
610
+ INSERT INTO drift_signal
611
+ (team_member_id, project_id, signal_kind, severity, description, detected_at, expires_at, payload)
612
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
613
+ `),getDriftSignal:t.prepare("SELECT * FROM drift_signal WHERE id = ?"),listDriftByMember:t.prepare("SELECT * FROM drift_signal WHERE team_member_id = ? ORDER BY detected_at DESC"),listUnackedDriftByMember:t.prepare("SELECT * FROM drift_signal WHERE team_member_id = ? AND acknowledged_at IS NULL ORDER BY detected_at DESC"),listDriftByProject:t.prepare("SELECT * FROM drift_signal WHERE project_id = ? ORDER BY detected_at DESC"),listAllDrift:t.prepare("SELECT * FROM drift_signal ORDER BY detected_at DESC"),findUnackedDrift:t.prepare("SELECT id FROM drift_signal WHERE team_member_id = ? AND project_id IS ? AND signal_kind = ? AND acknowledged_at IS NULL LIMIT 1"),ackDriftSignal:t.prepare("UPDATE drift_signal SET acknowledged_at = COALESCE(acknowledged_at, ?) WHERE id = ?"),insertJob:t.prepare(`
614
+ INSERT OR IGNORE INTO job
615
+ (project_id, workflow_id_override, source, source_ref, payload, priority, available_at, dedupe_key, concurrency_key_resolved, enqueued_at)
616
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
617
+ `),getJob:t.prepare("SELECT * FROM job WHERE id = ?"),findJobByDedupe:t.prepare("SELECT * FROM job WHERE source = ? AND dedupe_key = ? ORDER BY id LIMIT 1"),selectClaimableJob:t.prepare(`
618
+ SELECT id FROM job
619
+ WHERE ((status = 'queued' AND available_at <= ?) OR (status = 'running' AND locked_until < ?))
620
+ AND (locked_until IS NULL OR locked_until < ?)
621
+ ORDER BY priority DESC, available_at ASC, id ASC
622
+ LIMIT 1
623
+ `),selectClaimableJobs:t.prepare(`
624
+ SELECT id FROM job
625
+ WHERE ((status = 'queued' AND available_at <= ?) OR (status = 'running' AND locked_until < ?))
626
+ AND (locked_until IS NULL OR locked_until < ?)
627
+ ORDER BY priority DESC, available_at ASC, id ASC
628
+ `),claimJob:t.prepare(`
629
+ UPDATE job
630
+ SET status = 'running',
631
+ locked_by = ?,
632
+ locked_until = ?,
633
+ attempt_count = attempt_count + 1,
634
+ started_at = COALESCE(started_at, ?)
635
+ WHERE id = ?
636
+ AND ((status = 'queued' AND available_at <= ?) OR (status = 'running' AND locked_until < ?))
637
+ AND (locked_until IS NULL OR locked_until < ?)
638
+ `),setJobConcurrencyKey:t.prepare("UPDATE job SET concurrency_key_resolved = ? WHERE id = ?"),countRunningByConcurrencyKey:t.prepare(`
639
+ SELECT COUNT(*) AS count
640
+ FROM job
641
+ WHERE concurrency_key_resolved = ?
642
+ AND status = 'running'
643
+ AND locked_until > ?
644
+ AND id != ?
645
+ `),releaseJob:t.prepare(`
646
+ UPDATE job
647
+ SET status = ?, last_error = ?, ended_at = ?, locked_by = NULL, locked_until = NULL
648
+ WHERE id = ?
649
+ `),pauseJob:t.prepare(`
650
+ UPDATE job
651
+ SET status = 'paused',
652
+ locked_by = NULL,
653
+ locked_until = NULL,
654
+ ended_at = NULL
655
+ WHERE id = ?
656
+ `),requeuePausedJob:t.prepare(`
657
+ UPDATE job
658
+ SET status = 'queued',
659
+ locked_by = NULL,
660
+ locked_until = NULL,
661
+ available_at = ?,
662
+ ended_at = NULL,
663
+ last_error = NULL
664
+ WHERE id = ?
665
+ `),setJobRun:t.prepare("UPDATE job SET run_id = ? WHERE id = ?"),insertRun:t.prepare(`
666
+ INSERT INTO run (job_id, workflow_id, team_id, current_state, workflow_version_id, parent_run_id, started_at)
667
+ VALUES (?, ?, ?, ?, ?, ?, ?)
668
+ `),getRun:t.prepare("SELECT * FROM run WHERE id = ?"),setRunCurrentState:t.prepare("UPDATE run SET current_state = ?, paused_at = NULL WHERE id = ?"),setRunPausedState:t.prepare("UPDATE run SET current_state = ?, paused_at = ? WHERE id = ?"),resumeRunState:t.prepare("UPDATE run SET current_state = ?, paused_at = NULL WHERE id = ?"),setRunPendingEscalationDecision:t.prepare("UPDATE run SET pending_escalation_decision = ? WHERE id = ?"),setRunTerminalState:t.prepare(`
669
+ UPDATE run SET terminal_state = ?, ended_at = ?, current_state = NULL, paused_at = NULL WHERE id = ?
670
+ `),insertStep:t.prepare(`
671
+ INSERT INTO step (run_id, parent_step_id, state_name, outcome, status_detail, started_at)
672
+ VALUES (?, ?, ?, ?, ?, ?)
673
+ `),getStep:t.prepare("SELECT * FROM step WHERE id = ?"),listStepsForRun:t.prepare("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC"),insertSubmittedPr:t.prepare(`
674
+ INSERT INTO submitted_pr
675
+ (repo, pr_url, issue_url, local_path, branch, head_sha, status, submitted_at, last_known_state, created_by_run_id)
676
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
677
+ `),getSubmittedPr:t.prepare("SELECT * FROM submitted_pr WHERE id = ?"),findSubmittedPrByUrl:t.prepare("SELECT * FROM submitted_pr WHERE pr_url = ?"),listSubmittedPrs:t.prepare("SELECT * FROM submitted_pr ORDER BY submitted_at DESC, id DESC"),listSubmittedPrsByStatus:t.prepare("SELECT * FROM submitted_pr WHERE status = ? ORDER BY submitted_at DESC, id DESC"),listLatestStepOutcomesByState:t.prepare(`
678
+ SELECT state_name, outcome FROM step s1
679
+ WHERE run_id = ?
680
+ AND outcome IS NOT NULL
681
+ AND id = (SELECT MAX(s2.id) FROM step s2 WHERE s2.run_id = s1.run_id AND s2.state_name = s1.state_name AND s2.outcome IS NOT NULL)
682
+ ORDER BY id
683
+ `),finishStep:t.prepare("UPDATE step SET outcome = ?, status_detail = ?, ended_at = ? WHERE id = ?"),finishLatestOpenStepForRunState:t.prepare(`
684
+ UPDATE step
685
+ SET outcome = ?, status_detail = ?, ended_at = ?
686
+ WHERE id = (
687
+ SELECT id FROM step
688
+ WHERE run_id = ? AND state_name = ? AND ended_at IS NULL
689
+ ORDER BY id DESC
690
+ LIMIT 1
691
+ )
692
+ `),insertStepArtifact:t.prepare(`
693
+ INSERT INTO step_artifact (step_id, kind, path, content, sha, provider_call_mode, created_at)
694
+ VALUES (?, ?, ?, ?, ?, ?, ?)
695
+ `),getStepArtifact:t.prepare("SELECT * FROM step_artifact WHERE id = ?"),insertExternalObject:t.prepare(`
696
+ INSERT OR IGNORE INTO external_object
697
+ (type, provider, project_id, run_id, external_id, url, status, metadata, last_seen_at, created_at)
698
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
699
+ `),findExternalObjectByUnique:t.prepare(`
700
+ SELECT * FROM external_object WHERE provider = ? AND type = ? AND external_id = ?
701
+ `),insertExternalSignal:t.prepare(`
702
+ INSERT OR IGNORE INTO external_signal
703
+ (object_id, kind, source, occurred_at, payload, signal_hash, handled_at, created_at)
704
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
705
+ `),getExternalSignal:t.prepare("SELECT * FROM external_signal WHERE id = ?"),findExternalSignalByUnique:t.prepare(`
706
+ SELECT * FROM external_signal WHERE object_id = ? AND kind = ? AND signal_hash = ?
707
+ `),insertAttention:t.prepare(`
708
+ INSERT INTO attention
709
+ (kind, severity, project_id, run_id, external_object_id, requires_user, payload, created_at)
710
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
711
+ `),getAttention:t.prepare("SELECT * FROM attention WHERE id = ?"),ackAttention:t.prepare("UPDATE attention SET acknowledged_at = ? WHERE id = ?"),insertSessionSize:t.prepare(`
712
+ INSERT INTO session_size
713
+ (team_name, alias, sessionid, input_tokens, cache_tokens, output_tokens, total_tokens, observed_at)
714
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
715
+ `),getSessionSize:t.prepare("SELECT * FROM session_size WHERE id = ?"),latestSessionSizes:t.prepare(`
716
+ SELECT s.*
717
+ FROM session_size s
718
+ JOIN (
719
+ SELECT team_name, alias, MAX(id) AS id
720
+ FROM session_size
721
+ GROUP BY team_name, alias
722
+ ) latest ON latest.id = s.id
723
+ ORDER BY s.team_name ASC, s.alias ASC
724
+ `),sessionSizeHistory:t.prepare(`
725
+ SELECT * FROM session_size
726
+ WHERE team_name = ? AND alias = ?
727
+ ORDER BY observed_at DESC, id DESC
728
+ LIMIT ?
729
+ `),insertWebuiSession:t.prepare(`
730
+ INSERT INTO webui_session
731
+ (session_id, user_id, current_node, node_params, prev_node_stack, pending_form, chatbot_session_id, auth_state, last_transition_at, created_at)
732
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
733
+ `),getWebuiSession:t.prepare("SELECT * FROM webui_session WHERE session_id = ?"),updateWebuiSessionTransition:t.prepare(`
734
+ UPDATE webui_session
735
+ SET current_node = ?,
736
+ node_params = ?,
737
+ prev_node_stack = ?,
738
+ pending_form = ?,
739
+ last_transition_at = ?
740
+ WHERE session_id = ?
741
+ `),setWebuiSessionChatbot:t.prepare(`
742
+ UPDATE webui_session
743
+ SET chatbot_session_id = ?,
744
+ last_transition_at = ?
745
+ WHERE session_id = ?
746
+ `),insertChatbotSession:t.prepare(`
747
+ INSERT INTO chatbot_session
748
+ (chatbot_session_id, user_id, title, created_at, last_active_at, status)
749
+ VALUES (?, ?, ?, ?, ?, ?)
750
+ `),getChatbotSession:t.prepare("SELECT * FROM chatbot_session WHERE chatbot_session_id = ?"),listChatbotSessionsForUser:t.prepare(`
751
+ SELECT * FROM chatbot_session
752
+ WHERE user_id = ?
753
+ ORDER BY last_active_at DESC, chatbot_session_id ASC
754
+ `),touchChatbotSession:t.prepare("UPDATE chatbot_session SET last_active_at = ? WHERE chatbot_session_id = ?"),insertChatbotMessage:t.prepare(`
755
+ INSERT INTO chatbot_message (chatbot_session_id, role, content, tool_calls, created_at)
756
+ VALUES (?, ?, ?, ?, ?)
757
+ `),getChatbotMessage:t.prepare("SELECT * FROM chatbot_message WHERE id = ?"),listChatbotMessages:t.prepare(`
758
+ SELECT * FROM chatbot_message
759
+ WHERE chatbot_session_id = ?
760
+ ORDER BY id ASC
761
+ `),getConfig:t.prepare("SELECT value FROM lmctl_config WHERE key = ?"),upsertConfig:t.prepare(`
762
+ INSERT INTO lmctl_config (key, value, updated_at)
763
+ VALUES (?, ?, ?)
764
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
765
+ `),listConfig:t.prepare("SELECT key, value, updated_at FROM lmctl_config ORDER BY key ASC"),insertInteractiveSession:t.prepare(`
766
+ INSERT INTO interactive_session (run_id, step_id, state_name, turn_count, status, started_at, last_activity_at)
767
+ VALUES (?, ?, ?, 0, ?, ?, ?)
768
+ `),getInteractiveSessionByStepId:t.prepare("SELECT * FROM interactive_session WHERE step_id = ?"),getInteractiveSessionByRunAndState:t.prepare("SELECT * FROM interactive_session WHERE run_id = ? AND state_name = ?"),updateInteractiveSession:t.prepare(`
769
+ UPDATE interactive_session SET status = ?, last_operator_input = ?, last_activity_at = ? WHERE id = ?
770
+ `),setInteractiveAgentOutput:t.prepare(`
771
+ UPDATE interactive_session SET last_agent_output = ?, turn_count = turn_count + 1, status = ?, last_activity_at = ? WHERE id = ?
772
+ `),insertPromptDispatch:t.prepare(`
773
+ INSERT INTO prompt_dispatch (prompt_id, project_id, job_id, text, context_json, created_at)
774
+ VALUES (?, ?, ?, ?, ?, ?)
775
+ `),getPromptDispatch:t.prepare("SELECT * FROM prompt_dispatch WHERE prompt_id = ?"),setPromptDispatchCompleted:t.prepare("UPDATE prompt_dispatch SET completed_at = ? WHERE prompt_id = ?"),getWorkspace:t.prepare("SELECT * FROM workspace WHERE id = ? AND deleted_at IS NULL"),ensureWorkspace:t.prepare(`
776
+ INSERT INTO workspace (id, name, idle_threshold_ms, created_at)
777
+ VALUES (?, ?, ?, ?)
778
+ ON CONFLICT(id) DO NOTHING
779
+ `),insertWebProject:t.prepare(`
780
+ INSERT INTO web_project (workspace_id, name, repo_path, config_json, linked_v4_project_id, last_active_at, created_at)
781
+ VALUES (?, ?, ?, ?, ?, ?, ?)
782
+ `),getWebProject:t.prepare("SELECT * FROM web_project WHERE id = ?"),listWebProjectsActive:t.prepare("SELECT * FROM web_project WHERE workspace_id = ? AND deleted_at IS NULL ORDER BY name ASC, id ASC"),updateWebProject:t.prepare(`
783
+ UPDATE web_project
784
+ SET name = ?,
785
+ config_json = ?,
786
+ last_active_at = ?
787
+ WHERE id = ?
788
+ `),setWebProjectLastActive:t.prepare("UPDATE web_project SET last_active_at = ? WHERE id = ?"),softDeleteWebProject:t.prepare("UPDATE web_project SET deleted_at = ? WHERE id = ? AND deleted_at IS NULL"),loadMailboxCursor:t.prepare("SELECT * FROM mailbox_cursor WHERE user_id = ? AND mailbox_key = ?"),saveMailboxCursor:t.prepare(`
789
+ INSERT INTO mailbox_cursor (user_id, mailbox_key, last_processed_version_id, last_processed_seq, last_processed_at)
790
+ VALUES (?, ?, ?, ?, ?)
791
+ ON CONFLICT(user_id, mailbox_key) DO UPDATE SET
792
+ last_processed_version_id = excluded.last_processed_version_id,
793
+ last_processed_seq = excluded.last_processed_seq,
794
+ last_processed_at = excluded.last_processed_at
795
+ `),addUsage:t.prepare(`
796
+ INSERT INTO usage_meter (user_id, device_id, period, put_count, get_count, list_count, updated_at)
797
+ VALUES (?, ?, ?, ?, ?, ?, ?)
798
+ ON CONFLICT(user_id, device_id, period) DO UPDATE SET
799
+ put_count = put_count + excluded.put_count,
800
+ get_count = get_count + excluded.get_count,
801
+ list_count = list_count + excluded.list_count,
802
+ updated_at = excluded.updated_at
803
+ `),loadUsage:t.prepare("SELECT * FROM usage_meter WHERE user_id = ? AND device_id = ? AND period = ?"),sumUsageForPeriod:t.prepare(`
804
+ SELECT COALESCE(SUM(put_count), 0) AS put,
805
+ COALESCE(SUM(get_count), 0) AS get,
806
+ COALESCE(SUM(list_count), 0) AS list
807
+ FROM usage_meter WHERE user_id = ? AND period = ?
808
+ `),upsertRootTeam:t.prepare(`
809
+ INSERT INTO root_team (teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at)
810
+ VALUES (?, ?, ?, ?, ?, ?)
811
+ ON CONFLICT(teamfile_path) DO UPDATE SET
812
+ name = excluded.name,
813
+ raw_text = excluded.raw_text,
814
+ raw_sha256 = excluded.raw_sha256,
815
+ registered_at = excluded.registered_at,
816
+ last_seeded_at = excluded.last_seeded_at
817
+ `),getRootTeam:t.prepare("SELECT * FROM root_team WHERE teamfile_path = ?"),listRootTeams:t.prepare("SELECT * FROM root_team ORDER BY teamfile_path ASC"),deleteTeamConnectionsForSource:t.prepare("DELETE FROM team_connection WHERE source_teamfile = ?"),insertTeamConnection:t.prepare(`
818
+ INSERT INTO team_connection (source_teamfile, target_name, target_teamfile, created_at)
819
+ VALUES (?, ?, ?, ?)
820
+ `),listTeamConnections:t.prepare("SELECT * FROM team_connection WHERE source_teamfile = ? ORDER BY target_name ASC, id ASC"),insertTeamChatLog:t.prepare(`
821
+ INSERT INTO team_chat_log (
822
+ root_teamfile, sender_teamfile, sender_alias, receiver_teamfile, receiver_alias,
823
+ message, response, status, error_detail, truncated, created_at
824
+ )
825
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
826
+ `),listTeamChatLog:t.prepare("SELECT * FROM team_chat_log WHERE root_teamfile = ? ORDER BY created_at ASC, id ASC"),listTeamChatLogSinceId:t.prepare("SELECT * FROM team_chat_log WHERE id > ? ORDER BY id ASC LIMIT ?"),getMaxTeamChatLogId:t.prepare("SELECT COALESCE(MAX(id), 0) AS max_id FROM team_chat_log"),loadTeamChatLogCursor:t.prepare("SELECT * FROM team_chat_log_cursor WHERE cursor_key = ?"),saveTeamChatLogCursor:t.prepare(`
827
+ INSERT INTO team_chat_log_cursor (cursor_key, last_pushed_id, updated_at)
828
+ VALUES (?, ?, ?)
829
+ ON CONFLICT(cursor_key) DO UPDATE SET
830
+ last_pushed_id = excluded.last_pushed_id,
831
+ updated_at = excluded.updated_at
832
+ `),updateTeamChatLogResponse:t.prepare(`
833
+ UPDATE team_chat_log
834
+ SET response = ?,
835
+ status = ?,
836
+ error_detail = ?,
837
+ truncated = ?
838
+ WHERE id = ?
839
+ `),getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),acquireAgentInflight:t.prepare(`
840
+ INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count)
841
+ VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1)
842
+ ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
843
+ sender_teamfile = CASE
844
+ WHEN agent_inflight.sender_teamfile = excluded.sender_teamfile
845
+ AND agent_inflight.sender_alias = excluded.sender_alias
846
+ THEN agent_inflight.sender_teamfile
847
+ WHEN @force = 1
848
+ OR (@stale_before IS NOT NULL AND agent_inflight.started_at < @stale_before)
849
+ THEN excluded.sender_teamfile
850
+ ELSE agent_inflight.sender_teamfile
851
+ END,
852
+ sender_alias = CASE
853
+ WHEN agent_inflight.sender_teamfile = excluded.sender_teamfile
854
+ AND agent_inflight.sender_alias = excluded.sender_alias
855
+ THEN agent_inflight.sender_alias
856
+ WHEN @force = 1
857
+ OR (@stale_before IS NOT NULL AND agent_inflight.started_at < @stale_before)
858
+ THEN excluded.sender_alias
859
+ ELSE agent_inflight.sender_alias
860
+ END,
861
+ started_at = CASE
862
+ WHEN agent_inflight.sender_teamfile = excluded.sender_teamfile
863
+ AND agent_inflight.sender_alias = excluded.sender_alias
864
+ THEN agent_inflight.started_at
865
+ WHEN @force = 1
866
+ OR (@stale_before IS NOT NULL AND agent_inflight.started_at < @stale_before)
867
+ THEN excluded.started_at
868
+ ELSE agent_inflight.started_at
869
+ END,
870
+ active_count = CASE
871
+ WHEN agent_inflight.sender_teamfile = excluded.sender_teamfile
872
+ AND agent_inflight.sender_alias = excluded.sender_alias
873
+ THEN agent_inflight.active_count + 1
874
+ WHEN @force = 1
875
+ OR (@stale_before IS NOT NULL AND agent_inflight.started_at < @stale_before)
876
+ THEN 1
877
+ ELSE agent_inflight.active_count
878
+ END
879
+ WHERE @force = 1
880
+ OR (agent_inflight.sender_teamfile = excluded.sender_teamfile
881
+ AND agent_inflight.sender_alias = excluded.sender_alias)
882
+ OR (@stale_before IS NOT NULL AND agent_inflight.started_at < @stale_before)
883
+ RETURNING *
884
+ `),clearAgentInflight:t.prepare("DELETE FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),clearAgentInflightIfSender:t.prepare(`
885
+ DELETE FROM agent_inflight
886
+ WHERE receiver_teamfile = ?
887
+ AND receiver_alias = ?
888
+ AND sender_teamfile = ?
889
+ AND sender_alias = ?
890
+ `),decrementAgentInflight:t.prepare(`
891
+ UPDATE agent_inflight
892
+ SET active_count = active_count - 1
893
+ WHERE receiver_teamfile = ?
894
+ AND receiver_alias = ?
895
+ AND sender_teamfile = ?
896
+ AND sender_alias = ?
897
+ AND active_count > 1
898
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function $b(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Yi,Oe=T(()=>{"use strict";Gi();un();Yi=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;replaceTeamConnectionsTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Nb(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let m=this.getJob(a.id);return{claimed:!1,reason:m?.locked_until!==null&&m?.locked_until!==void 0&&m.locked_until>=o?"locked":"not_claimable",job_id:r,status:m?.status??a.status,locked_by:m?.locked_by??a.locked_by,locked_until:m?.locked_until??a.locked_until}}let p=this.getJob(a.id);return p===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:p}}),this.resumeRunTxn=e.transaction((r,n,s)=>$b("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==as)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==cn&&!a.includes(n))return{resumed:!1,reason:Wu};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.replaceTeamConnectionsTxn=e.transaction((r,n)=>{this.stmts.deleteTeamConnectionsForSource.run(r);for(let s of n)this.stmts.insertTeamConnection.run(r,s.target_name,s.target_teamfile,s.created_at)}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.stmts.acquireAgentInflight.get({...r,stale_before:n.stale_before??null,force:n.force===!0?1:0}),o=s!==void 0?{acquired:!0,current:s}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){qu(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,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 o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){qu(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,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 o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,M());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,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 o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,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"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,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"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,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(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,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"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,M(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=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,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,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=vb(),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 o=M(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,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),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,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()}replaceTeamConnections(e,r){this.replaceTeamConnectionsTxn(e,r)}listTeamConnections(e){return this.stmts.listTeamConnections.all(e)}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,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:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??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,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,M())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,M())}}});import{realpathSync as xb}from"node:fs";import{resolve as Rb}from"node:path";function zi(t){let e=Rb(t);try{return xb(e)}catch{return e}}var Ju=T(()=>{"use strict"});import{platform as Xu}from"node:os";function it(t){let e=new dn;for(let r of t)e.registerAdapter(r);return e}var dn,Zi=T(()=>{"use strict";Ju();dn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=zi(e.workspace);o=o.filter(a=>zi(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=Xu()==="darwin"||Xu()==="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 Gu}from"node:fs";import{createInterface as Vu}from"node:readline";import{stat as Ab}from"node:fs/promises";import{homedir as Ob}from"node:os";async function*ze(t){let e=Gu(t,{encoding:"utf-8"}),r=Vu({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function De(t,e){let r=[],n=Gu(t,{encoding:"utf-8"}),s=Vu({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Ne(t){let e=await Ab(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ce(t){return t.replace(/\\n/g,`
899
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function Z(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,zt=T(()=>{"use strict";ke=Ob()});import{readdir as ls,stat as Yu,unlink as Cb}from"node:fs/promises";import{join as wr,basename as Ku}from"node:path";function Lb(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function Mb(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ce(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 zu(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of ze(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,p=u.cache_read_input_tokens||0,m=u.output_tokens||0;r+=d+f+p,n+=p,s+=f,o+=m;let h=d+f+p;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:p,outputTokens:m}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var cs,Zu=T(()=>{"use strict";zt();cs=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||wr(ke,".claude"),this.projectsDir=wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await ls(this.projectsDir)}catch{return e}for(let n of r){let s=wr(this.projectsDir,n);if(!(await Yu(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await ls(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ku(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await De(e,50),s=await Ne(e),o="",i,a,l,c,u,d;for(let p of n)if(!Lb(p.type)&&(!o&&p.cwd&&(o=p.cwd),!i&&p.slug&&(i=p.slug),!a&&p.version&&(a=p.version),!d&&p.timestamp&&(d=new Date(p.timestamp)),p.type==="assistant"&&p.message?.model&&(l=p.message.model),p.type==="user"&&!p.isMeta&&p.message)){let m=p.message.content;if(typeof m=="string"){if(m.includes("<command-name>")||m.includes("<local-command-"))continue;c||(c=Z(m.trim(),80)),u=Z(m.trim(),80)}}if(!o)return null;let f=await zu(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ne(r),s=[],o="",i,a,l,c,u,d,f,p=e;for await(let h of ze(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(p=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:Mb(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=Z(_.trim(),80)),d=Z(_.trim(),80),s.push({role:"user",timestamp:g,content:ce(_.trim())})}else if(Array.isArray(_)){for(let E of _)if(E.type==="tool_result"){let v=typeof E.content=="string"?ce(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:g,content:v,toolCallId:E.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let E of _)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:g,content:ce(E.text),model:h.message.model}):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),toolCallId:E.id,model:h.message.model}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:g,content:E.thinking})}}if(!o)return null;let m=await zu(r);return{provider:"claude",sessionId:p,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:m.messageCount,filePath:r,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await Cb(r),!0):!1}async resolveSessionFile(e){let r;try{r=await ls(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=wr(this.projectsDir,i);if(!(await Yu(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ls(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Ku(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:wr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await De(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function us(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Pb(t,e,r){if(!r)return"";let n=t.tools[e]??Qi[e],s=n?.profiles?.[r]?.flags??Qi[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 Qu(t,e){return!!t.tools[e]}function ed(t,e,r,n,s){let o=t.tools[e]??Qi[e],i;if(o?.agent){let l=us(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=Db[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(us).join(" ");i=`printf '%s\\n' ${us(n)} | ${u}`}else i=c.map(us).join(" ")}let a=Pb(t,e,s);return a&&(i+=" "+a),i}var Qi,Db,td=T(()=>{"use strict";Qi={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:""}}}},Db={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"]}}});function rd(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 nd=T(()=>{"use strict"});var Fb,$e,ds,xt=T(()=>{"use strict";Fb="ACK: waiting for explicit lmctl task.",$e=`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: ${Fb}`,ds=`send this exact lmctl seed instruction: "${$e}"`});import{spawn as sd}from"node:child_process";import{mkdirSync as Ub}from"node:fs";var ea,Ce,Zt=T(()=>{"use strict";td();nd();xt();ea=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Ce=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===$e?r:n)}seed(e,r){return Ub(e,{recursive:!0}),new Promise(n=>{let s;try{s=sd(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
900
+ `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ds,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Qu(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:m=>{a+=m,c(),n.onDelta?.(m)},onProgress:m=>{m.kind!=="api_retry"&&c(),n.onProgress?.(m)}},f=this.transportFn(r,d).then(m=>(u(),{...m,status:"ok"})).catch(m=>{throw u(),i==="external"?new ea("Turn cancelled","external"):m}),p=new Promise(m=>{l=m});return Promise.race([f,p])}runOneShotAgent(e,r,n){let s=ed(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=rd(r.env),c=sd(s,{shell:!0,cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),p="",m="";if(c.stdout?.on("data",h=>{let g=h.toString();p+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{m+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:p.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(m.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function ps(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new gt(t,r,e)}var qe,ye,ht,fs,gt,yr=T(()=>{"use strict";qe=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends qe{},ht=class extends qe{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},fs=class extends qe{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},gt=class extends qe{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as ra from"node:child_process";function Bb(t){if(typeof ra.spawnSync=="function")try{ra.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function od(t){return t.exitCode!==null||t.signalCode!==null}function ta(t,e){return od(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function Ze(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??Bb;if(od(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ta(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await ta(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await ta(t,Wb)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Wb,ms=T(()=>{"use strict";Wb=1e3});import{readFileSync as qb,appendFileSync as Hb,mkdirSync as Jb,existsSync as $1,readdirSync as x1,unlinkSync as R1}from"node:fs";import{join as ld,dirname as Xb}from"node:path";import{homedir as cd}from"node:os";function at(){if(ud)return!0;let t=Date.now();return t-ad>=Gb&&(id=zb(),ad=t),id}function Yb(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Rt(t,e){if(e?.verbose){if(!ud)return}else if(!e?.always&&!at())return;try{Kb();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};Hb(_s,JSON.stringify(r)+`
901
+ `)}catch{}}function Kb(){if(!_s){let e=Yb().slice(0,13).replace("T","-");_s=ld(cd(),".lmctl",`debug-${e}.log`)}Jb(Xb(_s),{recursive:!0})}function wt(...t){Rt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Rt(t,{always:!0})}function zb(){try{let t=qb(Vb,"utf-8");for(let e of t.split(`
902
+ `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}var ud,id,ad,Gb,Vb,_s,He=T(()=>{"use strict";ud=!1,id=!1,ad=0,Gb=5e3,Vb=ld(cd(),".lmctl","config.toml");_s=null});function Er(t,e){let r=Qb[t];if(r)return r[e]??r.yolo}function tT(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 br(t,e,r="yolo"){if(eT.has(t))return;let n=r==="plan"?Er(t,"plan"):Zb[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 te({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!tT(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw te({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}}var Zb,Qb,eT,hs=T(()=>{"use strict";yr();He();Zb={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"]},Qb={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"]}};eT=new Set(["codex","opencode"])});import{spawn as rT}from"node:child_process";import{existsSync as nT}from"node:fs";function oT(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(`
903
+
904
+ --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
905
+
906
+ `+t[r]);return e.join("")}function iT(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let o;try{o=JSON.parse(s)}catch{return}t.onEvent?.(o);let i=o.type;if(i==="system"&&o.subtype==="init"&&(r=o.session_id||r),i==="assistant"){let a=o.message;if(a){let l=a.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}}i==="result"&&(n=!0,e.push(o))},sawResult(){return n},finalize(){if(!n)return null;let s=aT(e);return{result:oT(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function aT(t){let e=[],r=0,n=0,s="";for(let o of t){e.push(o.result||"");let i=o.duration_ms;typeof i=="number"&&Number.isFinite(i)&&(r+=i);let a=o.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=o.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}function lT(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
907
+ 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:
908
+ ${e}
909
+
910
+ ${r}`:r}function dd(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||sT[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=Er(s,a)??cT[s]??["--dangerously-skip-permissions"];i.push(...l);try{br(s,i,a)}catch(g){return n(g)}if(e.cwd&&!nT(e.cwd))return te({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=rT(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,te({event:"transport_abort",provider:s,phase:"pre_spawn"}),Ze(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,te({event:"transport_abort",provider:s}),Ze(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=iT({onEvent:e.onEvent,onText:e.onText}),f="";function p(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
911
+ `);f=_.pop()||"";for(let E of _)p(E)});let m="";c.stderr?.on("data",g=>{m+=g.toString()}),c.on("error",g=>{te({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&p(f);let _=d.finalize();_?(wt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(te({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:m.slice(0,500)}),n(new Error(lT({tool:s,exitCode:g,stderr:m}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
912
+ `),wt(`stream-json: prompt sent (${t.length} chars)`)})}var sT,cT,fd=T(()=>{"use strict";yr();ms();hs();He();sT={claude:"claude",qwen:"qwen"};cT={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as uT,constants as dT}from"node:fs";import{delimiter as fT,join as pT}from"node:path";function mT(t,e=process.env){let r=e.PATH??"";for(let n of r.split(fT))if(n)try{return uT(pT(n,t),dT.X_OK),!0}catch{}return!1}function _T(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Tr(t,e,r={}){if(mT(t,r.env))return;(r.warn??console.warn)(_T(t,e))}var gs=T(()=>{"use strict"});function pd(t={}){return Tr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${gT}`]}var hT,gT,md=T(()=>{"use strict";gs();hT=864e5,gT=hT/1e3});import{spawn as wT}from"node:child_process";import{createInterface as yT}from"node:readline";import{existsSync as ET,readFileSync as bT}from"node:fs";import{fileURLToPath as TT}from"node:url";function ST(t){return t==="plan"?"read-only":"danger-full-access"}function vT(){return{clientInfo:{name:"lmctl",title:"lmctl",version:kT},capabilities:{experimentalApi:!1}}}function At(t,e){wt(`[codex:${t}] ${JSON.stringify(e)}`)}function IT(){return{agentItems:new Map,resultText:""}}function _d(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function jT(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function NT(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 $T(){return{pendingCodexError:null}}function xT(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
913
+ One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
914
+ ${e}
915
+
916
+ ${r}`:r}function RT(t,e){let r=NT(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function AT(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function hd(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`),e.alias?.toLowerCase()==="lead"&&o.push(...pd());let i=e.permissionMode??"yolo",a=ST(i);try{br("codex",o,i)}catch(A){return n(A)}if(e.cwd&&!ET(e.cwd))return te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let l=wT(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,te({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),Ze(l).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,te({event:"transport_abort",provider:"codex"}),Ze(l).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=yT({input:l.stdout}),d=new Map,f=1,p=e.threadId||"",m="",h=!1,g=!1,_=Date.now(),E=IT(),v=$T();function k(A,L={}){return new Promise((q,ee)=>{let $=f++;d.set($,{resolve:q,reject:ee});let H=JSON.stringify({jsonrpc:"2.0",id:$,method:A,params:L});l.stdin?.write(H+`
917
+ `)})}function N(A,L={}){let q=JSON.stringify({jsonrpc:"2.0",method:A,params:L});l.stdin?.write(q+`
918
+ `)}u.on("line",A=>{let L;try{L=JSON.parse(A)}catch{return}if(typeof L.id=="number"&&d.has(L.id)){let $=d.get(L.id);if(d.delete(L.id),L.error){let H=L.error,pe=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(L.error);$.reject(ps(`codex app-server error: ${pe}`,H))}else $.resolve(L);e.onEvent?.(L);return}let q=L.method;if(!q){e.onEvent?.(L);return}if(q==="thread/started"){let H=L.params?.thread;H?.id&&(p=H.id)}let ee=at()?$=>{At("item.text/buffer-mismatch",{itemId:$.itemId,threadId:$.threadId??null,turnId:$.turnId??null,expectedFromItemText:$.expectedFromItemText,gotFromBuffer:$.gotFromBuffer,expectedLen:$.expectedFromItemText.length,gotLen:$.gotFromBuffer.length})}:void 0;if(q==="turn/started"){let $=L.params,H=$?.turn;H?.id&&(m=H.id),_d(L,E,e.onDelta,ee),at()&&At("turn/started",{params:$??null})}if(at()&&(q==="item/started"||q==="item/completed")){let $=L.params;$?.item?.type==="agentMessage"&&At(q,{params:$??null})}if(q==="item/started"||q==="item/agentMessage/delta"||q==="item/completed"){if(q==="item/agentMessage/delta"){let $=L.params;at()&&At("agentMessage/delta",{params:$??null})}_d(L,E,e.onDelta,ee)}if(q==="turn/completed"){let $=L.params;if(at())for(let[pe,I]of E.agentItems.entries())I.buffer&&At("turn/completed/unflushed-item",{itemId:pe,phase:I.phase,bufferLen:I.buffer.length});jT(E),at()&&At("turn/completed",{params:$??null});let H=AT(L,v);H.shouldReject?(at()&&At("turn/completed/terminal-reject",{message:H.turnError.message}),g=!0,h=!0,l.stdin?.end(),n(H.turnError)):(h=!0,l.stdin?.end())}if(q==="error"){let $=RT(L,v);if(at()){let H=L.params,pe=H?.error,I=typeof pe?.message=="string"?pe.message:"(no message)";At($.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:$.willRetry,params:H??null})}}e.onEvent?.(L)});let S="";l.stderr?.on("data",A=>{S+=A.toString()}),l.on("error",A=>{te({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:A.message}),n(new ye(`Failed to spawn codex app-server: ${A.message}`,{cause:A}))}),l.on("exit",A=>{if(!c&&!g){if(h){r({result:E.resultText,threadId:p,turnId:m,durationMs:Date.now()-_,exitCode:A});return}if(v.pendingCodexError){n(v.pendingCodexError);return}te({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:A,stderr_tail:S.slice(0,500)}),n(new Error(xT({exitCode:A,stderr:S})))}}),(async()=>{try{if(await k("initialize",vT()),N("initialized",{}),e.threadId)try{let A=k("thread/resume",{threadId:e.threadId,sandbox:a,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise((q,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([A,L]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
919
+ `);let L=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(p=L.id)}else{let L=(await k("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:a,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(p=L.id)}await k("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(A){Ze(l).catch(()=>{}),n(A instanceof Error?A:new Error(String(A)))}})()})}var kT,gd=T(()=>{"use strict";He();He();yr();ms();hs();md();He();kT=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(bT(TT(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as OT,mkdirSync as CT,readFileSync as LT,writeFileSync as wd}from"node:fs";import{join as yd}from"node:path";function bd(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:MT}}function DT(t,e){return JSON.stringify(t)===JSON.stringify(e)}function PT(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 ws(t,e={}){let r=yd(t,".opencode"),n=yd(r,"opencode.json");if(Tr("lmctl","lmctl_chat",e),!OT(n)){CT(r,{recursive:!0});let l=JSON.stringify({permission:"allow",mcp:{lmctl:bd()}},null,2);return wd(n,l+`
920
+ `,"utf-8"),!0}let s;try{s=JSON.parse(LT(n,"utf-8"))}catch{return console.log(Ed.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Ed.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),PT(s.permission)||te({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.`});let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=bd();return DT(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&wd(n,JSON.stringify(s,null,2)+`
921
+ `,"utf-8"),o}var Ed,MT,na=T(()=>{"use strict";He();gs();Ed={yellow:t=>t},MT=864e5});import{spawn as FT}from"node:child_process";import{existsSync as UT}from"node:fs";import{createInterface as WT}from"node:readline";function BT(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
922
+ One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
923
+ ${e}
924
+
925
+ ${r}`:r}function KT(t){let e=[...t.matchAll(JT)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Td(t.slice(n).trimStart())}return Td(zT(t.replace(XT,"")))}function zT(t){let e=GT.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(VT)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Td(t){let e=[...t.matchAll(YT)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function kd(t,e){let r=qT[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{ws(e.cwd)}catch(N){te({event:"opencode_config_install_failed",cwd:e.cwd,error_message:N instanceof Error?N.message:String(N)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let N=Er("gemini","plan"),S=Er("gemini","yolo");a=a.filter(A=>!(S??[]).includes(A)),N&&a.push(...N)}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.
926
+ `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{br(e.tool,a,l)}catch(N){return s(N)}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.
927
+ `),e.cwd&&!UT(e.cwd))return te({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=FT(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:e.env||process.env}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,te({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),Ze(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,te({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),Ze(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=WT({input:c.stdout}),p=new Map,m=e.sessionId||"",h="",g="",_=!1;function E(N,S={}){return new Promise((A,L)=>{let q=HT++;p.set(q,{resolve:A,reject:L});let ee=JSON.stringify({jsonrpc:"2.0",id:q,method:N,params:S});Rt({event:"acp_send",direction:"SEND",provider:e.tool,method:N,id:q,params:S}),c.stdin?.write(ee+`
928
+ `)})}f.on("line",N=>{let S;try{S=JSON.parse(N)}catch{return}if(Rt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof S.id=="number"?S.id:void 0,method:typeof S.method=="string"?S.method:void 0,preview:JSON.stringify(S).slice(0,300)}),e.onEvent?.(S),typeof S.id=="number"&&p.has(S.id)){let L=p.get(S.id);if(p.delete(S.id),S.error){let q=S.error,ee=typeof q?.message=="string"&&q.message.length>0?q.message:JSON.stringify(S.error);L.reject(ps(`ACP RPC error: ${ee}`,q))}else L.resolve(S);return}let A=S.method;if(A){if(typeof S.id=="number"){te({event:"acp_unhandled_request",provider:e.tool,method:A,id:S.id,params:S.params});let L=JSON.stringify({jsonrpc:"2.0",id:S.id,error:{code:-32601,message:`Method not found: ${A} (lmctl does not implement server-side ACP methods)`}});Rt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:S.id,error:"method not found"}),c.stdin?.write(L+`
929
+ `);return}if(A==="session/update"){let q=S.params?.update;if(q?.sessionUpdate==="agent_message_chunk"){let $=q.content?.text||"";$&&(h+=$,e.onDelta?.($))}}}});let v="";c.stderr?.on("data",N=>{v+=N.toString()}),c.on("error",N=>{te({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:N.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${N.message}`,{cause:N}))}),c.on("exit",N=>{d||(_?n({result:e.tool==="gemini"?KT(h):h,sessionId:m,durationMs:Date.now()-u,stopReason:g,exitCode:N}):(te({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:N,stderr_tail:v.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(BT({tool:e.tool,exitCode:N,stderr:v})))))});function k(N,S={}){let A=JSON.stringify({jsonrpc:"2.0",method:N,params:S});c.stdin?.write(A+`
930
+ `)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),k("notifications/initialized"),e.sessionId)try{m=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(S){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${S instanceof Error?S.message:String(S)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
931
+ `),m=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else m=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:m,configId:"model",value:e.model}),wt(`acp: set_config_option(model=${e.model}) ok`)}catch(S){let A=S instanceof Error?S.message:String(S);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${A}
932
+ `)}wt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:m,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,wt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(N){Ze(c).catch(()=>{}),s(N instanceof Error?N:new Error(String(N)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var qT,HT,Sd,JT,XT,GT,VT,YT,vd=T(()=>{"use strict";He();yr();ms();hs();na();He();qT={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},HT=1,Sd="(?:png|jpe?g|webp|heic|pdf)",JT=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Sd}\\s*`,"gi"),XT=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Sd}\\s*`,"i"),GT=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,VT=/^STANCE:\s+\S+\s*$/gim,YT=/\[Thought:\s*true\]\s*/gi});function _e(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Id(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=ZT){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 QT(){let t=new Map;return(e,r)=>{eS(e,Id(t,r))}}function eS(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(_e(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(_e(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:_e(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:_e(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
933
+ `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(p=>typeof p=="object"&&p&&"text"in p?p.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
934
+ `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function ys(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?QT():void 0,s=await dd(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function tS(){let t=new Map;return(e,r)=>{rS(e,Id(t,r))}}function rS(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:_e(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:_e(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=_e(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:_e(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${_e(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Sr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Rt({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?tS():void 0,s=await kd(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function nS(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${_e(i,120)}`}:{kind:"other",summary:`codex error: ${_e(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:_e(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,p=typeof u=="number"?`exit ${u}`:d||"done",m=[];typeof u=="number"?m.push(`exit ${u}`):d&&m.push(d),typeof f=="number"&&m.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:m.join(", ")||"done",status:p,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:_e(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:_e(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:_e(s)}:{kind:"text",summary:_e(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:_e(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
935
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${_e(i,60)}`:_e(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
936
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${_e(i,60)}`:_e(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 jd(t,e){let r=await hd(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>nS(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var ZT,Qt=T(()=>{"use strict";fd();gd();vd();He();ZT=256});function oa(t){return new sa(t)}var sa,ia=T(()=>{"use strict";Zu();Zt();Qt();xt();sa=class extends Ce{constructor(e){super({provider:new cs(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",$e,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:ys})}}});import{readdir as sS,stat as Nd,unlink as oS}from"node:fs/promises";import{join as fn,basename as iS}from"node:path";function aS(t,e,r){return`${t}|${e.toISOString()}|${r}`}function pn(t,e,r){let n=aS(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function $d(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function lS(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 Es(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 Es(r)}).filter(r=>r.length>0).join(`
937
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function xd(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of ze(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=lS(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var bs,Rd=T(()=>{"use strict";zt();bs=class{name="codex";codexDirs;constructor(e={}){let r=[fn(ke,".codex"),fn(ke,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:fn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=fn(r,"sessions");try{await Nd(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await sS(e)}catch{return r}for(let s of n){let o=fn(e,s),i=await Nd(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=iS(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 De(e,30),n=await Ne(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let m of r){if(m.type==="session_meta"&&m.payload&&(m.payload.id&&(s=m.payload.id),m.payload.cwd&&(o=m.payload.cwd),m.payload.cli_version&&(i=m.payload.cli_version),m.payload.timestamp&&(l=new Date(m.payload.timestamp)),m.payload.originator&&(d=m.payload.originator),m.payload.source&&(f=m.payload.source)),m.type==="turn_context"&&m.payload&&(m.payload.model&&(a=m.payload.model),!o&&m.payload.cwd&&(o=m.payload.cwd)),m.type==="event_msg"&&m.payload?.type==="user_message"){let h=m.payload.message||m.payload.text;h&&(c||(c=Z(h.trim(),80)),u=Z(h.trim(),80))}if(m.type==="response_item"&&m.payload?.type==="message"&&m.payload.role==="user"&&m.payload.content){let h=m.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=Z(h.text.trim(),80)),u=Z(h.text.trim(),80))}}if(!o)return null;let p=await xd(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:$d(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:e,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ne(r),s=[],o="",i,a,l,c,u,d=e,f,p=new Set;for await(let h of ze(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=$d(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let E of _.content)if(E.type==="input_text"&&typeof E.text=="string"&&E.text){let v=E.text.trim();c||(c=Z(v,80)),u=Z(v,80),pn(s,p,{role:"user",timestamp:g,content:ce(v)})}continue}if(_.role==="assistant"&&_.content){for(let E of _.content)E.type==="output_text"&&typeof E.text=="string"&&E.text&&pn(s,p,{role:"assistant",timestamp:g,content:ce(E.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let E of _.content)(E.type==="input_text"||E.type==="output_text")&&typeof E.text=="string"&&E.text&&pn(s,p,{role:"system",timestamp:g,content:ce(E.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?ce(Es(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ce(Es(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let E=_.summary.map(v=>Es(v.text)).join(`
938
+ `);E.trim()&&pn(s,p,{role:"thinking",timestamp:g,content:ce(E)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&pn(s,p,{role:"thinking",timestamp:g,content:ce(_)})}}if(!o)return null;let m=await xd(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:r,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,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await oS(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await De(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function la(t){return new aa(t)}var aa,ca=T(()=>{"use strict";Rd();Zt();Qt();xt();aa=class extends Ce{constructor(e){super({provider:new bs(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:`${$e}
939
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:jd})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function mn(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 Ts(t){let e=mn(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(`
940
+ `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?cS(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function cS(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Ad(t.tokens)&&Ad(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Ad(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Od(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
941
+ `)+`
942
+ `}var ua=T(()=>{"use strict"});import{createHash as uS}from"node:crypto";import{readdir as _n,readFile as Cd,stat as Ss,unlink as dS}from"node:fs/promises";import{join as Pe,basename as fS,dirname as pS}from"node:path";import{cwd as mS}from"node:process";function Ld(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Md(t){return t==="user"}function da(t){return t==="gemini"||t==="assistant"}function kr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function ks(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Dd(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!da(a.type)||!a.tokens)continue;let l=ks(a.tokens.input),c=ks(a.tokens.cached),u=Math.max(l-c,0),d=ks(a.tokens.output),f=ks(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function _S(t){return uS("sha256").update(t).digest("hex")}function hn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=pS(r);if(n===r)break;r=n}}var vs,Pd=T(()=>{"use strict";zt();ua();He();vs=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Pe(ke,".gemini");this.geminiProjectsFile=Pe(r,"projects.json"),this.geminiTmpDir=Pe(r,"tmp");let n=e.claudeDir||Pe(ke,".claude");this.claudeProjectsDir=Pe(n,"projects");let s=[Pe(ke,".codex"),Pe(ke,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Pe(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=[];for(let n of e)try{let s=await this.extractSummary(n);s&&r.push(s)}catch{}return r}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 Ne(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=kr(g.timestamp),E=g.type,v=ce(Ld(g.content));if(Md(E)){let N=v.trim();N&&(u||(u=Z(N,80)),d=Z(N,80)),o.push({role:"user",timestamp:_,content:N||v});continue}if(da(E)){g.model&&(f=g.model);for(let N of g.thoughts||[]){let S=[N.subject,N.description].filter(Boolean).join(`
943
+ `).trim();S&&o.push({role:"thinking",timestamp:kr(N.timestamp,_),content:ce(S)})}o.push({role:"assistant",timestamp:_,content:v,model:g.model});continue}let k=E?`[${E}] `:"";o.push({role:"system",timestamp:_,content:`${k}${v}`.trim()})}let p=kr(n.startTime,s.createdAt),m=kr(n.lastUpdated,s.modifiedAt),h=Dd(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:p,modifiedAt:m,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Ne(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let p of s)if(Md(p.type)){d++;let m=Ld(p.content).trim();m&&(l||(l=Z(ce(m),80)),c=Z(ce(m),80))}else da(p.type)&&(d++,p.model&&(u=p.model));let f=Dd(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:kr(r.startTime,n.createdAt),modifiedAt:kr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Cd(e,"utf-8");if(mn(r)==="unknown")return te({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 Ts(r)}catch{return null}}extractSessionIdFromFilename(e){let r=fS(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 _n(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Pe(this.geminiTmpDir,n,"chats");if(!(await Ss(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await _n(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Pe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await dS(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=r.find(o=>{let i=this.extractSessionIdFromFilename(o);return i===e||i.startsWith(e)});if(n)return n;let s=[];for(let o of r){let a=(await this.readSessionFile(o).catch(()=>null))?.sessionId;if(a){if(a===e)return o;a.startsWith(e)&&s.push(o)}}return s.length===1?s[0]: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;hn(e,mS());for(let n of this.extraWorkspacePaths)hn(e,n);for(let n of await this.collectGeminiProjectPaths())hn(e,n);for(let n of await this.collectCodexCwds())hn(e,n);for(let n of await this.collectClaudeCwds())hn(e,n);let r=new Map;for(let n of e)r.set(_S(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Cd(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await De(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await _n(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Pe(this.claudeProjectsDir,n);if(!(await Ss(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await _n(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Pe(s,a),u=(await De(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Ss(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await _n(e)}catch{return r}for(let o of s){let i=Pe(e,o),a=await Ss(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as hS,writeFileSync as gS,mkdirSync as wS}from"node:fs";import{join as yS,dirname as ES}from"node:path";import{randomUUID as bS}from"node:crypto";function pa(t){return new fa(t)}var fa,ma=T(()=>{"use strict";Pd();Zt();Qt();xt();ua();fa=class extends Ce{constructor(e){super({provider:new vs(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",$e,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Sr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
944
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:ds,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=hS(n,"utf-8"),o=mn(s),i=Ts(s),a=bS();i.sessionId=a,i.kind="main";let l=ES(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=yS(l,d);return wS(l,{recursive:!0}),gS(f,Od(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Fd,readFile as TS,rm as SS,stat as vr}from"node:fs/promises";import{basename as kS,join as Qe}from"node:path";function vS(t){let e={};for(let r of t.split(`
945
+ `)){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 er(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function IS(t){let e=0;for await(let r of ze(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Is,Ud=T(()=>{"use strict";zt();Is=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||Qe(ke,".copilot");this.sessionStateDir=Qe(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Fd(this.sessionStateDir)}catch{return e}for(let n of r){let s=Qe(this.sessionStateDir,n);if((await vr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=Qe(r,"events.jsonl"),o=await vr(s).catch(()=>null),i=o?s:Qe(r,"workspace.yaml"),a=await Ne(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,p,m,h,g=n?.id||kS(r)||e;if(o)for await(let _ of ze(s)){let E=er(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=er(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let v=_.data.content||"",k=v.trim();k&&(p||(p=Z(k,80)),m=Z(k,80)),l.push({role:"user",timestamp:E,content:ce(k||v)});continue}if(_.type==="assistant.message"&&_.data){let v=(_.data.content||"").trim();if(v&&l.push({role:"assistant",timestamp:E,content:ce(v),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let v=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:ce(v),toolDetailedContent:k?ce(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:E,content:ce(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let v=_.data?.message||"";v.trim()&&l.push({role:"system",timestamp:E,content:ce(v)});continue}}if(!p){let _=(n?.summary||"").trim();_&&(p=Z(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??er(n?.created_at)??a.createdAt,modifiedAt:er(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:p,lastUserMessage:m,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=Qe(e,"events.jsonl"),o=await vr(s).catch(()=>null),i=o?s:Qe(e,"workspace.yaml"),a=await Ne(o?s:e),l=o?await De(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,p,m,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(p=er(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let E=(_.data.content||"").trim();E&&(m||(m=Z(E,80)),h=Z(E,80))}if(!m){let _=(n?.summary||"").trim();_&&(m=Z(_,80))}let g=o?await IS(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:p??er(n?.created_at)??a.createdAt,modifiedAt:er(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:m,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=Qe(e,"workspace.yaml");try{let n=await TS(r,"utf-8");return vS(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await SS(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Fd(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=Qe(this.sessionStateDir,e);if((await vr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=Qe(this.sessionStateDir,s);(await vr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=Qe(this.sessionStateDir,s);if(!(await vr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function _a(t){return new Ce({provider:new Is(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",$e,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Sr(e,{...r,acpTool:"copilot"})})}var ha=T(()=>{"use strict";Ud();Zt();Qt();xt()});import{existsSync as Wd}from"node:fs";import{join as js}from"node:path";import{createRequire as jS}from"node:module";function Bd(){return ga===null&&(ga=jS(import.meta.url)("node:sqlite").DatabaseSync),ga}function NS(){let t=process.env.XDG_DATA_HOME||js(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||js(ke,".config");return[js(t,"opencode","opencode.db"),js(e,"opencode","opencode.db")]}var ga,Ns,qd=T(()=>{"use strict";zt();ga=null;Ns=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=NS().find(r=>Wd(r))??null}openDb(){return!this.dbPath||!Wd(this.dbPath)?null:new(Bd())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
946
+ s.time_created, s.time_updated
947
+ FROM session s
948
+ ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
949
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(i.id),u=0,d,f,p,m=[];for(let g of c){let _;try{_=JSON.parse(g.data)}catch{continue}p||(p=_.model?.modelID||_.modelID),(_.role==="user"||_.role==="assistant")&&u++,_.role==="user"&&m.push(g.id)}let h=[...m.length>0?[m[0]]:[],...m.length>1?[m[m.length-1]]:[]];for(let g of h){let _=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),E=this.extractText(_);E&&(d||(d=Z(E,80)),f=Z(E,80))}o.push({provider:"opencode",sessionId:i.id,slug:i.slug,cwd:l,createdAt:new Date(i.time_created),modifiedAt:new Date(i.time_updated),model:p,startCommand:"opencode",firstUserMessage:d,lastUserMessage:f,messageCount:u,filePath:this.dbPath})}return o}finally{e.close()}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.findSessionRow(r,e);return n?this.buildSessionDetail(r,n):null}finally{r.close()}}buildSessionDetail(e,r){let n=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),s=r.directory||n?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
950
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),i=[],a=0,l,c,u;for(let d of o){let f;try{f=JSON.parse(d.data)}catch{continue}l||(l=f.model?.modelID||f.modelID);let p=f.model?.modelID||f.modelID,m=new Date(f.time?.created||d.time_created),h=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(d.id);if(f.role==="user"){let g=this.extractText(h);g&&(c||(c=Z(g,80)),u=Z(g,80)),i.push({role:"user",timestamp:m,content:g||"(empty)"}),a++}else if(f.role==="assistant"){for(let g of h){let _;try{_=JSON.parse(g.data)}catch{continue}_.type==="text"&&_.text?i.push({role:"assistant",timestamp:m,content:_.text,model:p}):_.type==="reasoning"&&_.text?i.push({role:"thinking",timestamp:m,content:_.text}):_.type==="tool"&&_.tool&&(i.push({role:"tool_use",timestamp:m,content:`${_.tool}`,toolName:_.tool,toolCallId:_.callID,toolInput:_.state?.input?JSON.stringify(_.state.input):void 0}),(_.state?.output||_.state?.error)&&i.push({role:"tool_result",timestamp:m,content:_.state.error||_.state.output||"",toolCallId:_.callID}))}a++}}return{provider:"opencode",sessionId:r.id,slug:r.slug,cwd:s,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:l,startCommand:"opencode",firstUserMessage:c,lastUserMessage:u,messageCount:a,filePath:this.dbPath,messages:i}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
951
+ `).trim()}async resolveSessionPath(e){if(!this.dbPath)return null;let r=this.openDb();if(!r)return null;try{return this.findSessionRow(r,e)?this.dbPath:null}finally{r.close()}}async deleteSession(e){if(!this.dbPath)return!1;let r=new(Bd())(this.dbPath,{open:!0});try{let n=this.findSessionRow(r,e);return n?r.prepare("DELETE FROM session WHERE id = ?").run(n.id).changes>0:!1}finally{r.close()}}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
952
+ s.time_created, s.time_updated
953
+ FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
954
+ s.time_created, s.time_updated
955
+ FROM session s
956
+ WHERE s.id LIKE ?
957
+ ORDER BY s.time_updated DESC
958
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ya(){return new wa}var wa,Ea=T(()=>{"use strict";qd();Zt();Qt();xt();wa=class extends Ce{constructor(){super({provider:new Ns,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",$e],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Sr(e,{...r,acpTool:"opencode"})})}}});import{readdir as $s,readFile as $S,rm as xS}from"node:fs/promises";import{basename as Hd,join as Ot}from"node:path";function Jd(t){return t.type==="user"||t.message?.role==="user"}function Xd(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Gd(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(`
959
+ `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
960
+ `):"":""}function Vd(t){return t.model||t.message?.model}var xs,Yd=T(()=>{"use strict";zt();xs=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Ot(ke,".qwen")}async discoverSessions(){let e=Ot(this.baseDir,"projects"),r;try{r=await $s(e)}catch{return[]}let n=[];for(let s of r){let o=Ot(e,s,"chats"),i;try{i=await $s(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Ot(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await De(e,30);if(n.length===0)return null;let s=await Ne(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),Jd(d)){let f=Gd(d).trim();f&&(l||(l=Z(f,80)),c=Z(f,80)),u++}if(Xd(d)){let f=Vd(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Hd(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ne(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of ze(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let p=f.message,m=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Jd(f)){let h=Gd(f);h.trim()&&(c||(c=Z(h.trim(),80)),u=Z(h.trim(),80)),d.push({role:"user",timestamp:m,content:h})}else if(Xd(f)){let h=Vd(f);if(h&&(o=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:m,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:m,content:g.thinking});else if(typeof p.content=="string")d.push({role:"assistant",timestamp:m,content:p.content,model:h});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:m,content:_})}else g.text&&d.push({role:"assistant",timestamp:m,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=Ot(this.baseDir,"projects");try{let n=await $s(r),s=[];for(let o of n){let i=Ot(r,o,"chats",`${e}.jsonl`);try{return await $S(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=Ot(r,o,"chats"),a;try{a=await $s(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Hd(l,".jsonl").startsWith(e)&&s.push(Ot(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await xS(r),!0}catch{return!1}}}});function Ta(){return new ba}var ba,Sa=T(()=>{"use strict";Yd();Zt();Qt();xt();ba=class extends Ce{constructor(){super({provider:new xs,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",$e,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ys})}}});import{createHash as RS}from"node:crypto";import{join as AS}from"node:path";function OS(t){return RS("sha256").update(t).digest("hex").slice(0,8)}function CS(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function LS(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 MS(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Rs(t){return Math.max(1,Math.ceil(t.length/4))}function Kd(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 Ia(){return new va}var tr,ka,va,ja=T(()=>{"use strict";tr=new Map;ka=class{name="ClaudeMock";async discoverSessions(){return[...tr.values()].map(Kd)}async loadSession(e){let r=tr.get(e);return r===void 0?null:{...Kd(r),messages:r.messages.slice()}}async resolveSessionPath(e){return tr.get(e)?.filePath??null}async deleteSession(e){return tr.delete(e)}},va=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ka;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=CS(LS(e,r)),s=`mock-${n}-${OS(`${e}:${n}`)}`,o=new Date,i=tr.get(s),a=r?.prompt??"ClaudeMock seed",l=Rs(a),c={sessionId:s,cwd:e,filePath:AS(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Rs("ACK: ClaudeMock seeded"),tr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=tr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${MS(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Rs(e),s.totalOutputTokens+=Rs(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function lt(t){let e=[oa({claudeDir:t?.claudeDir}),la({codexDir:t?.codexDir,codeDir:t?.codeDir}),pa({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),_a({copilotDir:t?.copilotDir}),ya(),Ta()];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Ia()),e}var Na=T(()=>{"use strict";ia();ca();ma();ha();Ea();Sa();ja();ia();ca();ma();ha();Ea();Sa();ja()});var Aa={};le(Aa,{ProviderRegistry:()=>dn,TransportConnectionError:()=>ye,TransportError:()=>qe,TransportJsonError:()=>fs,TransportProcessError:()=>ht,TransportRpcError:()=>gt,_resetDefaultRegistryForTests:()=>DS,chat:()=>rr,countTokens:()=>Ra,createAdapterRegistry:()=>it,createAllAdapters:()=>lt,listSessions:()=>xa,seed:()=>$a});function Os(){return As===null&&(As=it(lt())),As}function DS(){As=null}function Zd(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry (Phase A supports claude / codex / gemini)`);return r}async function rr(t){let e=t.registry??Os(),r=Zd(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,progPath:t.progPath,alias:t.alias,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function $a(t){let e=t.registry??Os(),r=Zd(e,t.provider),n=await zd(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await zd(e,t.provider,t.cwd),i=PS(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function zd(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function PS(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 xa(t={}){return(t.registry??Os()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Ra(t){let r=await(t.registry??Os()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var As,yt=T(()=>{"use strict";Zi();Na();Zi();Na();yr();As=null});function FS(){return Oa===null&&(Oa=it(lt())),Oa}async function jr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await WS(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Ir.delete(r),e.setMemberState(r,"idle");else{let i=US(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function US(t,e){if(!(t instanceof Ee))return Ir.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=(Ir.get(e)??0)+1;return r>=3?(Ir.delete(e),"consecutive_timeouts"):(Ir.set(e,r),null)}return Ir.delete(e),null}async function WS(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=FS(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Ca(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Qd(u)}`,Ca(t.sessionid,t.sessiondir,"unresolved")))}let o=Ca(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await rr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):BS(u,o)}finally{a!==null&&clearTimeout(a)}}function Ca(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Qd(t){return t instanceof Error?t.message:String(t)}function BS(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof ht?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof gt?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof qe?new Ee("other",null,t.message,e):new Ee("other",null,Qd(t),e)}var Ee,Oa,Ir,gn=T(()=>{"use strict";yt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},Oa=null;Ir=new Map});function ef(){return La===null&&(La=it(lt())),La}function HS(t,e){if(!qS.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new be("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Nr(t){let e=HS(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await JS({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function JS(t){let e=t.member.provider,r=t.member.sessiondir,n=Ma("seed",r,e);try{let s=await $a({provider:e,cwd:r,registry:ef()});if(!s.success)throw GS(s.error,n);if(!s.sessionId)throw new be("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof be?s:Da(s,n)}}async function tf(t){return XS(t)}async function XS(t){let e=ef(),r=Ma("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new be("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof be?o:Da(o,r)}let s=Ma("tokens",t.sessionid,n);try{let o=await Ra({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof be?o:Da(o,s)}}function Ma(t,e,r){return["<library>",t,e,"--provider",r]}function GS(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new be("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new be("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 be("nonzero_exit",Number(n[1]),r,e)}return new be("other",null,r,e)}function Da(t,e){return t instanceof be?t:t instanceof ye?t.cause?.code==="ENOENT"?new be("enoent",null,t.message,e):new be("other",null,t.message,e):t instanceof ht?new be("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof gt?new be("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof qe?new be("other",null,t.message,e):new be("other",null,t instanceof Error?t.message:String(t),e)}var be,La,qS,Cs=T(()=>{"use strict";yt();be=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"}},La=null;qS=/^provider[123]$/});function Ls(t){return Buffer.from(t,"utf8").toString("base64url")}function yn(t){return Buffer.from(t,"base64url").toString("utf8")}async function rf(t,e=r=>tf({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of VS(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function nf(t,e,r){let n=sf(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new wn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await jr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:of(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 Pa(t,e,r){let n=sf(t,e,r);if(n===null)throw new Error("session member not found");let s=await Nr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:of(t,e,r)}}function VS(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function sf(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 of(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var wn,Ms=T(()=>{"use strict";gn();Cs();wn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Fa(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??KS(e),s=r-n,o=e.query(`
961
+ SELECT
962
+ isess.id AS interactive_session_id,
963
+ isess.run_id,
964
+ isess.step_id,
965
+ isess.state_name AS session_state_name,
966
+ isess.status AS session_status,
967
+ isess.started_at,
968
+ isess.last_activity_at,
969
+ (
970
+ SELECT MAX(se.timestamp_ms)
971
+ FROM session_event se
972
+ WHERE se.run_id = isess.run_id
973
+ AND (se.step_id IS NULL OR se.step_id = isess.step_id)
974
+ ) AS last_event_at,
975
+ j.project_id,
976
+ r.team_id,
977
+ w.definition AS workflow_definition,
978
+ s.state_name AS step_state_name
979
+ FROM interactive_session isess
980
+ JOIN run r ON r.id = isess.run_id
981
+ JOIN job j ON j.id = r.job_id
982
+ JOIN workflow w ON w.id = r.workflow_id
983
+ JOIN step s ON s.id = isess.step_id
984
+ WHERE isess.status = 'waiting_agent'
985
+ AND r.terminal_state IS NULL
986
+ `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=QS(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=zS(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let p={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Se(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,ZS(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let m={run_id:a.run_id,project_id:a.project_id,payload:p};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(p)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(m)}return i}function KS(t){return af(t.getConfig(Ds),YS)*1e3}function Ua(t,e){return af(t.getConfig(Ps),e)}function af(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function zS(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function ZS(t,e,r,n){return t.query(`SELECT * FROM attention
987
+ WHERE kind = 'session_hung'
988
+ AND run_id = ?
989
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=lf(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function QS(t,e,r){let n=lf(t);return n===null?null:ek(n,e,r)??tk(n,e,r)}function ek(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(rk),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let o=nr(s.members)?s.members:null,i=o!==null&&nr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function tk(t,e,r){if(!nr(t.states))return null;let n=t.states[e]??t.states[r];if(!nr(n))return null;let s=n;if(!nr(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function rk(t){return nr(t)}function lf(t){if(t===null)return null;try{let e=JSON.parse(t);return nr(e)?e:null}catch{return null}}function nr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ds,Ps,YS,Wa=T(()=>{"use strict";Oe();Ds="monitor.session_hung.elapsed_threshold_seconds",Ps="monitor.session_hung.check_interval_ms",YS=600});function Us(t){let e=t.query(`
990
+ SELECT status, COUNT(*) AS count FROM job GROUP BY status
991
+ `),r={queued:Fs(e,"queued"),running:Fs(e,"running"),done:Fs(e,"done"),failed:Fs(e,"failed"),total:qa(e)},n=t.query(`
992
+ SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
993
+ `),s=t.query(`
994
+ SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
995
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(o=>o.terminal_state===null).reduce((o,i)=>o+i.count,0),terminal:n.filter(o=>o.terminal_state!==null).reduce((o,i)=>o+i.count,0),total:qa(n)},attentions:{unacked:s.filter(o=>o.acknowledged_at===null).reduce((o,i)=>o+i.count,0),total:qa(s)},projects:Ba(t,"project"),teams:Ba(t,"team"),workflows:Ba(t,"workflow")}}function Ws(t){return t.listProjects()}function df(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Bs(t){return t.query(`
996
+ SELECT w.*
997
+ FROM workflow w
998
+ JOIN (
999
+ SELECT name, MAX(version) AS version
1000
+ FROM workflow
1001
+ GROUP BY name
1002
+ ) latest ON latest.name = w.name AND latest.version = w.version
1003
+ ORDER BY w.name ASC
1004
+ `)}function ff(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 pf(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 mf(t,e){return t.getSubmittedPr(e)}function qs(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function $r(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function sr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:qs(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:nk(t,r.id)}}function nk(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:_f(t,r.id)}))}function Ha(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:_f(t,n.id)}}function _f(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function or(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 hf(t,e,r){let n=Ha(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function gf(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 wf(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 Lt(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 Hs(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(`${yf}
1005
+ WHERE ${n}
1006
+ ORDER BY a.created_at DESC`,...r).map(Ef)}function ct(t,e){let n=t.query(`${yf}
1007
+ WHERE a.id = ?`,e)[0];return n===void 0?null:Ef(n)}function Ef(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function bf(t){return t.query(`
1008
+ SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
1009
+ FROM run r
1010
+ JOIN workflow w ON w.id = r.workflow_id
1011
+ GROUP BY w.name, r.terminal_state
1012
+ ORDER BY w.name ASC, r.terminal_state ASC
1013
+ `)}function Ba(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Fs(t,e){return t.find(r=>r.status===e)?.count??0}function qa(t){return t.reduce((e,r)=>e+r.count,0)}function Ja(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let o=t.query(`SELECT s.state_name, s.outcome
1014
+ FROM step s
1015
+ JOIN run r ON r.id = s.run_id
1016
+ JOIN job j ON j.id = r.job_id
1017
+ WHERE j.project_id = ? AND s.outcome IS NOT NULL
1018
+ ${n!==null?"AND r.started_at >= ?":""}`,...s),i=new Map,a=0,l=0;for(let v of o){let k=i.get(v.state_name)??{total:0,rc:0};k.total++,v.outcome==="request_changes"&&k.rc++,i.set(v.state_name,k),a++,v.outcome==="request_changes"&&l++}let c=[...i.entries()].map(([v,k])=>({state_name:v,total:k.total,request_changes:k.rc,rate_pct:k.total>0?`${(k.rc/k.total*100).toFixed(1)}%`:"0.0%"})),u={total:a,request_changes:l,rate_pct:a>0?`${(l/a*100).toFixed(1)}%`:"0.0%",by_state:c},d=t.query(`SELECT s.state_name,
1019
+ CAST((julianday(s.ended_at) - julianday(s.started_at)) * 86400000 AS INTEGER) AS duration_ms
1020
+ FROM step s
1021
+ JOIN run r ON r.id = s.run_id
1022
+ JOIN job j ON j.id = r.job_id
1023
+ WHERE j.project_id = ? AND s.ended_at IS NOT NULL
1024
+ ${n!==null?"AND r.started_at >= ?":""}`,...s),f=[e];n!==null&&f.push(n);let p=t.query(`SELECT s.state_name, COUNT(*) AS cnt
1025
+ FROM step s
1026
+ JOIN run r ON r.id = s.run_id
1027
+ JOIN job j ON j.id = r.job_id
1028
+ WHERE j.project_id = ? AND s.ended_at IS NULL
1029
+ ${n!==null?"AND r.started_at >= ?":""}
1030
+ GROUP BY s.state_name`,...f),m=new Map;for(let v of d){let k=m.get(v.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},N=v.duration_ms;N<3e5?k.lt5++:N<9e5?k.btw5_15++:N<36e5?k.btw15_60++:k.gt60++,m.set(v.state_name,k)}for(let v of p){let k=m.get(v.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};k.noEnd+=v.cnt,m.set(v.state_name,k)}let h=[...m.entries()].map(([v,k])=>({state_name:v,lt_5min:k.lt5,btw_5_15min:k.btw5_15,btw_15_60min:k.btw15_60,gt_60min:k.gt60,no_end:k.noEnd})),g=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1031
+ FROM step s
1032
+ JOIN run r ON r.id = s.run_id
1033
+ JOIN job j ON j.id = r.job_id
1034
+ WHERE j.project_id = ?
1035
+ ${n!==null?"AND r.started_at >= ?":""}
1036
+ GROUP BY s.run_id, s.state_name
1037
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let v of g){let k=_.get(v.state_name)??{runs:0,total_attempts:0};k.runs++,k.total_attempts+=v.attempt_count,_.set(v.state_name,k)}let E=[..._.entries()].map(([v,k])=>({state_name:v,retried_runs:k.runs,avg_retries:k.runs>0?Number((k.total_attempts/k.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:E}}function Xa(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1038
+ FROM session_event se
1039
+ JOIN run r ON r.id = se.run_id
1040
+ JOIN job j ON j.id = r.job_id
1041
+ WHERE se.kind = 'tool_use' AND j.project_id = ? AND se.timestamp_ms >= ?
1042
+ AND json_extract(se.payload, '$.tool') IS NOT NULL
1043
+ GROUP BY json_extract(se.payload, '$.tool')`,e.project_id,r):t.query(`SELECT json_extract(payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1044
+ FROM session_event
1045
+ WHERE kind = 'tool_use' AND timestamp_ms >= ?
1046
+ AND json_extract(payload, '$.tool') IS NOT NULL
1047
+ GROUP BY json_extract(payload, '$.tool')`,r);if(n.length===0)return[];let s=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1048
+ FROM session_event se
1049
+ JOIN run r ON r.id = se.run_id
1050
+ JOIN job j ON j.id = r.job_id
1051
+ WHERE se.kind = 'tool_result' AND j.project_id = ? AND se.timestamp_ms >= ?
1052
+ AND json_extract(se.payload, '$.tool') IS NOT NULL
1053
+ AND json_extract(se.payload, '$.status') = 'ok'
1054
+ GROUP BY json_extract(se.payload, '$.tool')`,e.project_id,r):t.query(`SELECT json_extract(payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1055
+ FROM session_event
1056
+ WHERE kind = 'tool_result' AND timestamp_ms >= ?
1057
+ AND json_extract(payload, '$.tool') IS NOT NULL
1058
+ AND json_extract(payload, '$.status') = 'ok'
1059
+ GROUP BY json_extract(payload, '$.tool')`,r),o=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name,
1060
+ json_extract(se.payload, '$.elapsedMs') AS elapsed_ms
1061
+ FROM session_event se
1062
+ JOIN run r ON r.id = se.run_id
1063
+ JOIN job j ON j.id = r.job_id
1064
+ WHERE se.kind = 'tool_result' AND j.project_id = ? AND se.timestamp_ms >= ?
1065
+ AND json_extract(se.payload, '$.tool') IS NOT NULL
1066
+ AND json_extract(se.payload, '$.elapsedMs') > 0
1067
+ AND se.payload_truncated = 0
1068
+ ORDER BY json_extract(se.payload, '$.tool') ASC,
1069
+ json_extract(se.payload, '$.elapsedMs') ASC`,e.project_id,r):t.query(`SELECT json_extract(payload, '$.tool') AS tool_name,
1070
+ json_extract(payload, '$.elapsedMs') AS elapsed_ms
1071
+ FROM session_event
1072
+ WHERE kind = 'tool_result' AND timestamp_ms >= ?
1073
+ AND json_extract(payload, '$.tool') IS NOT NULL
1074
+ AND json_extract(payload, '$.elapsedMs') > 0
1075
+ AND payload_truncated = 0
1076
+ ORDER BY json_extract(payload, '$.tool') ASC,
1077
+ json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((m,h)=>m+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,p=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:p}})}function Tf(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function xr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?Tf(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1078
+ FROM interactive_session
1079
+ WHERE run_id = ? AND status = 'waiting_operator'
1080
+ ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let p=new Set,m=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!m.includes(_)&&m.push(_)}d!==null&&!m.includes(d)&&m.push(d);let h=[];for(let g of m){if(p.has(g))continue;p.add(g);let _=g===d,E=l.get(g),v="pending",k=null;if(g.startsWith("@terminal:"))v=r.terminal_state===g.slice(10)?"done":"pending";else if(E!==void 0&&(E.ended_at===null?v=_&&u===g?"paused":"running":E.outcome===null?v="failed":v="done",E.ended_at!==null)){let N=Date.parse(E.started_at),S=Date.parse(E.ended_at);!Number.isNaN(N)&&!Number.isNaN(S)&&(k=S-N)}_&&u===g&&(v="paused"),h.push({id:g,status:v,is_current:_,elapsed_ms:k,prompt:_&&v==="paused"?f:null,expected:_&&v==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Js(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...sk(o));return`${e.join(`
1081
+ `)}
1082
+ `}function sk(t){let e=[],r=ok(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function ok(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Xs(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?Tf(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=N=>c.schema==="v3"&&c.nameToId.has(N)?c.nameToId.get(N):N,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let N of d)f.set(u(N.state_name),N);let p=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),m=new Map;for(let N of p)m.set(u(N.state_name),N);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let N of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1083
+ FROM session_event
1084
+ WHERE run_id = ? AND step_id IS NOT NULL
1085
+ GROUP BY step_id`,e))N.step_id!==null&&h.set(N.step_id,N.timestamp_ms);let _=ik(c,d,u),E=ak(s.current_state),v=t.query(`SELECT kind, severity, payload
1086
+ FROM attention
1087
+ WHERE run_id = ?
1088
+ AND kind = 'session_hung'
1089
+ AND acknowledged_at IS NULL
1090
+ ORDER BY id ASC`,e).map(N=>({kind:N.kind,severity:N.severity,payload:mk(N.payload)})),k=_.map(N=>{let S=f.get(N),A=m.get(N),L=lk(s,N,E,S,A),q=S===void 0?null:Date.parse(S.started_at),ee=S?.ended_at===null||S===void 0?null:Date.parse(S.ended_at),$=S===void 0||Number.isNaN(q??NaN)?null:ee!==null&&!Number.isNaN(ee)?ee-q:L==="running"||L==="paused"?n-q:null,H=S===void 0?null:h.get(S.id)??null,pe=_k(A?.last_activity_at??null,H,g),I=o===null||A===void 0?void 0:dk(t,s.team_id,o.definition,A.state_name,S?.state_name??N);return{step_id:S?.id??null,state_id:N,status:L,started_at:S?.started_at??null,ended_at:S?.ended_at??null,last_activity_at:pe,elapsed_ms:$,...I!==void 0?{member:I}:{},...A!==void 0?{interactive_session:{id:A.id,status:A.status,turn_count:A.turn_count,state_name:A.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:uk(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:ck(k,s.terminal_state!==null),related_attentions:v}}function Gs(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${uf(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${cf(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":cf(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Vs(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${uf(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${hk(a.payload)}`)}return`${n.join(`
1091
+ `)}
1092
+ `}function ik(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function ak(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function lk(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 ck(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 uk(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 dk(t,e,r,n,s){let o=fk(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Se(i)}}function fk(t,e,r){let n=pk(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Ct(a)?a.id===e||a.name===e||a.name===r:!1),o=Ct(s?.members)?s.members:null,i=o!==null&&Ct(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Ct(n.states)){let s=n.states[e]??n.states[r];if(!Ct(s))return null;let o=Ct(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function pk(t){try{let e=JSON.parse(t);return Ct(e)?e:null}catch{return null}}function mk(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function _k(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function cf(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Vs(Math.max(0,n-r)).padEnd(6)}]`}function uf(t,e){return Number.isNaN(t)?"?":Vs(Math.max(0,e-t))}function Vs(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function hk(t){if(!Ct(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"?`, ${Vs(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var yf,Et=T(()=>{"use strict";Oe();yf=`SELECT a.id AS attention_id,
1093
+ a.kind AS kind,
1094
+ a.severity AS severity,
1095
+ a.created_at AS created_at,
1096
+ a.acknowledged_at AS acknowledged_at,
1097
+ a.project_id AS project_id,
1098
+ p.name AS project,
1099
+ a.run_id AS run_id,
1100
+ w.name AS workflow_name,
1101
+ isess.step_id AS step_id,
1102
+ isess.state_name AS state_name,
1103
+ isess.last_agent_output AS prompt,
1104
+ isess.status AS session_status,
1105
+ a.payload AS payload_json
1106
+ FROM attention a
1107
+ LEFT JOIN project p ON p.id = a.project_id
1108
+ LEFT JOIN run r ON r.id = a.run_id
1109
+ LEFT JOIN workflow w ON w.id = r.workflow_id
1110
+ LEFT JOIN interactive_session isess
1111
+ ON isess.run_id = a.run_id
1112
+ AND isess.id = (
1113
+ SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1114
+ )`});var Pf={};le(Pf,{parseApiArgs:()=>jf,readApiClientConfig:()=>bn,runApi:()=>Tk});import{readFileSync as gk}from"node:fs";import{basename as wk,extname as yk}from"node:path";async function Tk(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(bk),0;if(t[0]==="config")return kk(t.slice(1),e);let r=Mf(t,"--direct");if(r.rest[0]==="escalations")return vk(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&zs(r.rest.slice(2)))return e.stdout.write(`${$k}
1115
+ `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1116
+ `),2):Sv(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&zs(r.rest.slice(2)))return e.stdout.write(`${jk}
1117
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&zs(r.rest.slice(2)))return e.stdout.write(`${Nk}
1118
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?yv(r.rest.slice(2),e):Ev(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?bv(r.rest.slice(2),e):Tv(r.rest.slice(2),e);if(r.present)return sv(r.rest,e);let n=jf(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1119
+ `),2;let s=ir(e),o=s.baseUrl,i=Mt(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=Dk(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1120
+ `),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1121
+ `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1122
+ `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=Fk(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
1123
+ `),2;let d;try{d=await fetch(new URL(`/api/jobs/${u}/run`,o),{method:"POST",headers:Mt("application/json",s.token)})}catch(p){return e.stderr.write(`error: network failure: ${p instanceof Error?p.message:String(p)}
1124
+ `),2}if(!d.ok)return e.stderr.write(`error: HTTP ${d.status}: ${await d.text()}
1125
+ `),d.status===400?2:1;let f=await d.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
1126
+ `):e.stdout.write(`${JSON.stringify(f)}
1127
+ `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1128
+ `):(e.stdout.write(await l.text()),e.stdout.write(`
1129
+ `));return 0}function jf(t){let e=xf(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ks(o,"/api/status",n):s==="projects"?Ks(o,"/api/projects",n):s==="teams"?Ks(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Gk(o.slice(1),e.format):Ks(o,"/api/workflows",n):s==="workflow"?Xk(o,n):s==="upload"?Hk(o,n):s==="submit-job"?Jk(o,n):s==="issues"?qk(o,n):s==="jobs"?En(o,"--status","/api/jobs","status",n):s==="job"?Bk(o,n):s==="project"?Vk(o,n):s==="artifact"?zk(o,n):s==="runs"?En(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?En(o,"--type","/api/external-objects","type",n):s==="external-signals"?kf(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Zk(o,n):kf(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Qk(o,n):s==="daemon"?ev(o,n):s==="intake"?tv(o,n):s==="session"?rv(o,n):s==="run"?nv(o,e.format):s==="prs"?En(o,"--status","/api/submitted-prs","status",n):s==="pr"?Uk(o,n):`unknown subcommand: ${s}`}function Mt(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function ir(t){if(t.dal!==void 0)return bn(t.dal,process.env,t);let e=me({path:de()});try{return bn(e,process.env,t)}finally{e.close()}}function bn(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=Ek;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Sk(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1130
+ `);return{baseUrl:o,token:a}}function Sk(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 kk(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1131
+ `),2;let s=e.dal===void 0,o=e.dal??me({path:de()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1132
+ `),2;let i=n[0];if(!Ys.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ys].join(", ")})
1133
+ `),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
1134
+ `),1):(e.stdout.write(`${a}
1135
+ `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1136
+ `),2;let[i,a]=n;if(!Ys.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ys].join(", ")})
1137
+ `),2;let l=Mk(i,a);return l!==null?(e.stderr.write(`error: ${l}
1138
+ `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Sf(i,a,!1)}
1139
+ `),0)}if(r==="list"){let i=!1;for(let c of n){if(c==="--show-secrets"){i=!0;continue}return e.stderr.write(`error: unknown flag: ${c}
1140
+ `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1141
+ `),0;for(let c of l)e.stdout.write(`${c} = ${Sf(c,a[c],i)}
1142
+ `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1143
+ `),2}finally{s&&o.close()}}async function vk(t,e,r){if(zs(t))return e.stdout.write(`${Ik}
1144
+ `),0;let n=Mf(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1145
+ `),2):s?xk(i,a,e):i==="list"?Ak(a,e):i==="show"?Ck(a,e):i==="respond"?Lk(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1146
+ `),2)}function zs(t){return t.some(e=>e==="--help"||e==="-h")}function xk(t,e,r){let n=r.dal===void 0,s=r.dal??me({path:de()});try{return Df(s,[t,...e],r)}finally{n&&s.close()}}function Nf(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=Rk(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function Rk(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Ak(t,e){let r=Nf(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1147
+ `),2;let n=ir(e),s=Mt("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1148
+ `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1149
+ `),a.status===400?2:1;let l=await a.json();return $f(l,r.json,e)}function $f(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1150
+ `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
1151
+ `),0;r.stdout.write(`${t.length} pending escalation${t.length===1?"":"s"}:
1152
+
1153
+ `);for(let n of t){if(n.run_id===null){r.stderr.write(`warning: attention #${n.attention_id} has no run_id; skipping
1154
+ `);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=Ok(n.created_at);if(r.stdout.write(`#${n.attention_id} ${s} run ${n.run_id} ${o}:${i} (paused ${a})
1155
+ `),n.prompt!==null&&n.prompt.length>0){let l=n.prompt.replaceAll(`
1156
+ `," ").trim(),c=l.length>240?`${l.slice(0,240)}\u2026`:l;r.stdout.write(` Q: ${JSON.stringify(c)}
1157
+ `)}r.stdout.write(` Respond: lmctl api escalations respond ${n.attention_id} "<answer>" [--done to end chat]
1158
+ `),r.stdout.write(`
1159
+ `)}return 0}function Ok(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 Ck(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]
1160
+ `),2;let n=ne(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1161
+ `),2;let s=ir(e),o=Mt("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1162
+ `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1163
+ `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1164
+ `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1165
+ `),i.status===400?2:1)}async function Lk(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let p=t[f];if(p==="--json"){r=!0;continue}if(p==="--done"){n=!0;continue}s.push(p)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1166
+ `),2;let o=ne(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1167
+ `),2;let i=s[1],a=ir(e),l=Mt("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1168
+ `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1169
+ `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1170
+ `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1171
+ `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1172
+ `),0}function Sf(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Mk(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===Ds||t===Ps){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function Dk(t,e){let r=gk(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Pk(t)}),wk(t)),e!==void 0&&s.append("project",e),s}function Pk(t){switch(yk(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 Fk(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 Uk(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return En(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 xf(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 Ks(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function En(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function kf(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function Wk(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function Bk(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return Wk([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],p=n[++d];if(p===void 0||p.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=p;else if(f==="--project-id"){let m=Number(p);if(!Number.isInteger(m))return`invalid --project-id: ${p}`;o=m}else if(f==="--source")i=p;else if(f==="--payload")a=p;else if(f==="--dedupe-key")l=p;else if(f==="--priority"){let m=Number(p);if(!Number.isInteger(m))return`invalid --priority: ${p}`;c=m}else return re(f)}if(s===void 0&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Ga(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function qk(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return re(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Rf(n,e):r==="claim"?Af(n,e):r==="claim-next"?Of(n,e):r==="close"?Cf(n,e):r==="reopen"?Lf(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Rf(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=Ga(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Af(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;o.assigned_run_id=c}else return re(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Of(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(i)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Cf(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Lf(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Hk(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return re(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function Jk(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function Ga(t){try{return JSON.parse(t)}catch{return t}}function Xk(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 Gk(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Vk(t,e){let[r,n,...s]=t;return r==="workflow"?Yk([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Yk(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:e?"application/json":"text/html",json:e}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Kk(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 Kk(t){let[e,r,...n]=t;if(e===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=Ga(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function zk(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function Zk(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Qk(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 ev(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 tv(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 rv(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=Ls(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 nv(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return re(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function Mf(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 sv(t,e){let r=xf(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1173
+ `),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1174
+ `),2;let a=e.dal===void 0,l=e.dal??me({path:de()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1175
+ `),2):c==="create"?ov(l,u,e,s):c==="claim"?iv(l,u,e,s):c==="claim-next"?av(l,u,e,s):c==="close"?lv(l,u,e,s):c==="reopen"?cv(l,u,e,s):c==="list"?pv(l,u,e,s):c==="show"?mv(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1176
+ `),2)}return o==="status"?_v(l,i,e,s):o==="projects"?hv(l,i,e,s):o==="workflows"?gv(l,i,e,s):o==="runs"?wv(l,i,e,s):o==="attentions"||o==="attention"?kv(l,i,e,s):o==="escalations"?Df(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1177
+ `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1178
+ `),1}finally{a&&l.close()}}function Fe(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1179
+ `)}function ov(t,e,r,n){let s=Rf(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1180
+ `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1181
+ `),1;let a=JSON.parse(s.body),l=uv(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1182
+ `),2;let c=dv(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1183
+ `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Fe(r,u,n),0}function iv(t,e,r,n){let s=Af(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1184
+ `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1185
+ `),1;let l=t.claimIssue(o,i.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${o} is not in a claimable state (status=${a.status})
1186
+ `),1):(Fe(r,l,n),0)}function av(t,e,r,n){let s=Of(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1187
+ `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1188
+ `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Fe(r,{status:"queue_empty"},n),1):(Fe(r,l,n),0)}function lv(t,e,r,n){let s=Cf(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1189
+ `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1190
+ `),1;let l=typeof i.closed_run_id=="number"?i.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
1191
+ `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Fe(r,c,n),0}function cv(t,e,r,n){let s=Lf(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1192
+ `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1193
+ `),1;let l=typeof i.source_run_id=="number"?i.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1194
+ `),2;let c=t.reopenIssue(o,l);return Fe(r,c,n),0}function uv(t){if(t!=null)return typeof t=="string"&&If.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function dv(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 pv(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1195
+ `),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],p=o[++d];if(p===void 0||p.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1196
+ `),2;if(f==="--status"){let m=vf(p,fv);if(typeof m=="string")return r.stderr.write(`error: ${m}
1197
+ `),2;i=m}else if(f==="--severity"){let m=vf(p,If);if(typeof m=="string")return r.stderr.write(`error: ${m}
1198
+ `),2;a=m}else if(f==="--ai-test-path")l=p;else return r.stderr.write(`error: ${re(f)}
1199
+ `),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1200
+ `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Fe(r,u,n),0}function mv(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1201
+ `),2;let s=ne(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1202
+ `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1203
+ `),1):(Fe(r,o,n),0)}function _v(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1204
+ `),2):(Fe(r,Us(t),n),0)}function hv(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1205
+ `),2):(Fe(r,Ws(t),n),0)}function gv(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1206
+ `),2):(Fe(r,Bs(t),n),0)}function wv(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1207
+ `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1208
+ `),2;s=Number(a)}else return r.stderr.write(`error: ${re(i)}
1209
+ `),2}return Fe(r,$r(t,s!==void 0?{limit:s}:{}),n),0}function yv(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1210
+ `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1211
+ `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${re(a)}
1212
+ `),2}let o=e.dal===void 0,i=e.dal??me({path:de()});try{let a=xr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1213
+ `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1214
+ `):e.stdout.write(Js(a)),0)}finally{o&&i.close()}}async function Ev(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1215
+ `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1216
+ `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1217
+ `),2}let o=ir(e),a=Mt(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1218
+ `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1219
+ `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1220
+ `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1221
+ `),l.status===404?1:l.status===400?2:1)}function bv(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1222
+ `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1223
+ `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1224
+ `),2}let o=e.dal===void 0,i=e.dal??me({path:de()});try{let a=Xs(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1225
+ `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1226
+ `):e.stdout.write(Gs(a)),0)}finally{o&&i.close()}}async function Tv(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1227
+ `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1228
+ `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1229
+ `),2}let o=ir(e),a=Mt(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1230
+ `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1231
+ `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1232
+ `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1233
+ `),l.status===404?1:l.status===400?2:1)}async function Sv(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1234
+ `),2}let n=ir(e),o=Mt(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1235
+ `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1236
+ `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1237
+ `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1238
+ `),i.status===400?2:1)}function kv(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(o)}
1239
+ `),2}return Fe(r,Lt(t,{unacked:s}),n),0}function Df(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1240
+ `),2;if(n==="list"){let o=Nf(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1241
+ `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Hs(t,i);return $f(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1242
+ `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1243
+ `),2;let a=ct(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1244
+ `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
1245
+ `),0)}return n==="respond"?vv(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1246
+ `),2)}function vv(t,e,r){let n=!1,s=!1,o=[];for(let p of e){if(p==="--json"){n=!0;continue}if(p==="--done"){s=!0;continue}o.push(p)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
1247
+ `),2;let i=ne(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1248
+ `),2;let a=o[1],l=ct(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1249
+ `),1;let c=Lt(t).find(p=>p.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
1250
+ `),1;if(c.kind==="workflow_escalation"){let p=t.resumeEscalation(i,a);if(!p.resumed)return r.stderr.write(`error: escalation resume failed: ${p.reason} (attention=${i})
1251
+ `),2;let m=Lt(t).find(g=>g.id===i),h={ok:!0,attention_id:i,run_id:p.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:m?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
1252
+ `):r.stdout.write(`ok: attention ${i} acknowledged; run ${p.run.id} resumed with decision "${a}"
1253
+ `),0}if(c.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${i} is kind=${c.kind}, not interactive_waiting_operator
1254
+ `),2;if(c.acknowledged_at!==null)return r.stderr.write(`error: attention ${i} is already acknowledged (${c.acknowledged_at})
1255
+ `),2;if(l.step_id===null)return r.stderr.write(`error: attention ${i} has no associated interactive step
1256
+ `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1257
+ `),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1258
+ `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1259
+ `),0}function vf(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var Ek,bk,If,Ys,Ik,jk,Nk,$k,fv,Va=T(()=>{"use strict";Oe();Be();Ms();Wa();Et();Ek="http://127.0.0.1:8787",bk=`usage: lmctl api [--direct] <subcommand> ...
1260
+
1261
+ Call the lmctl HTTP API using the configured daemon URL/token. Some
1262
+ workflow shellstep-safe commands also support --direct to use the local DAL
1263
+ without an HTTP round trip.
1264
+ `,If=["low","medium","high","critical"];Ys=new Set(["api.url","api.port","api.token","project.docroot",Ds,Ps]);Ik=`usage: lmctl api escalations <list|show|respond>
1265
+
1266
+ list [--project P] [--all] [--since DURATION] [--json]
1267
+ Print pending operator escalations (interactive_waiting_operator
1268
+ attentions). --all includes acknowledged history; --since accepts an
1269
+ ISO8601 timestamp or a relative duration like "1h", "24h", "7d".
1270
+
1271
+ show <attention_id> [--json|--text]
1272
+ Print one escalation as JSON. --json/--text are accepted no-ops;
1273
+ single-record output is always JSON.
1274
+
1275
+ respond <attention_id> "<answer>" [--done] [--json]
1276
+ Reply to an interactive escalation. --done ends the chat.`,jk=`usage: lmctl api run where <run_id> [--json|--text]
1277
+
1278
+ Print the workflow-position view (which state of which workflow the run is
1279
+ at, and any pending operator prompt). Default output is the TTY tree; --json
1280
+ emits the structured RunWhereDetail payload. Pair with --direct to bypass
1281
+ HTTP for in-workflow shellsteps.`,Nk=`usage: lmctl api run timeline <run_id> [--json|--text]
1282
+
1283
+ Print the time-ordered run progression view. Default output is the TTY
1284
+ timeline; --json emits the structured RunTimeline payload. Pair with
1285
+ --direct to bypass HTTP for in-workflow shellsteps.`,$k=`usage: lmctl api workflows verify [--json|--text]
1286
+
1287
+ Verify every workflows/*.compound.json file: load/validate the workflow graph
1288
+ and report the first step that would be started. Default output is the TTY
1289
+ table; --json emits the structured WorkflowVerifyReport payload.`;fv=["open","assigned","closed","reopened"]});import{existsSync as Ff,mkdirSync as Iv,readdirSync as jv,readFileSync as Uf,writeFileSync as Nv}from"node:fs";import{join as Rr}from"node:path";import{fileURLToPath as $v}from"node:url";function Tn(t){try{return xv.some(e=>Ff(Rr(t,e)))}catch{return!1}}function Rv(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Zs(t,e){t.durable_memory_mode!=="db"?Av(t):Ov(t,e)}function Wf(t){let e=Tn(t),r;try{r=jv(Ya).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function Av(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rr(e,"durable-memory");try{Iv(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=Wf(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Rr(r,i);if(!Ff(a))try{let l=Uf(Rr(Ya,o),"utf8");Nv(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function Ov(t,e){let r=t.local_path??"",n=Wf(r),s=[];for(let o of n){let i=Rr(Ya,o),a;try{a=Uf(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=Rv(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Ya,xv,Sn=T(()=>{"use strict";Ya=Rr($v(import.meta.url),"../../config/durable_memory_templates"),xv=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as Cv,mkdirSync as Lv,readdirSync as Mv,readFileSync as Dv,writeFileSync as Pv}from"node:fs";import{join as Qs}from"node:path";import{fileURLToPath as Fv}from"node:url";function eo(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Tn(e))return;let r=Qs(e,"ai-test");try{Lv(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of Uv()){let o=s.replace(/\.template$/,""),i=Qs(r,o);if(!Cv(i))try{Pv(i,Wv(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function Uv(){try{return Mv(Bf).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function Wv(t){try{return Dv(Qs(Bf,t),"utf8")}catch{return Bv(t)}}function Bv(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1290
+
1291
+ Add test chapters in this directory.
1292
+ `:`---
1293
+ name: ${e.replace(/\.md$/,"")}
1294
+ description: Add a description
1295
+ type: smoke
1296
+ tags: []
1297
+ last_run_at: never
1298
+ last_run_status: unknown
1299
+ last_run_id: 0
1300
+ ---
1301
+
1302
+ # Test: ${e}
1303
+
1304
+ ## Setup
1305
+
1306
+ ## Action
1307
+
1308
+ ## Expected
1309
+
1310
+ ## Cleanup
1311
+ `}var Bf,Ka=T(()=>{"use strict";Sn();Bf=Qs(Fv(import.meta.url),"../../config/ai_test_templates")});var Ar,za=T(()=>{"use strict";Ar=`---
1312
+
1313
+ # Durable memory \u2014 how to use it
1314
+
1315
+ This project has a durable-memory directory at \`<project>/durable-memory/\` (or DB-backed if durable_memory_mode='db' \u2014 same logical surface).
1316
+
1317
+ ON EVERY NEW TASK:
1318
+ 1. Read \`durable-memory/index.md\` first. It lists project knowledge by topic.
1319
+ 2. Pull only the chapters relevant to your current task. Don't load everything.
1320
+ 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.
1321
+
1322
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function to(t){return qv.has(t)}function Qa(){return Za===null&&(Za=it(lt())),Za}function el(t,e){if(!to(t))return null;try{let r=Qa().getAdapter?.(t);if(r===void 0)return null;let n=r.resumeCommand(e).trim();return n.length===0?null:[...n.split(/\s+/),...qf[t]??[]]}catch{return null}}function Or(t,e){let r=el(t,e);return r===null?null:r.join(" ")}function ar(t,e){return Qa().getSession(t,e)}async function ro(t){return(await Qa().resolveSessions(t)).map(r=>r.provider.name)}var qf,qv,Hf,Za,Cr=T(()=>{"use strict";yt();qf={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"]},qv=new Set(Object.keys(qf)),Hf=/^[\w.:-]+$/;Za=null});import{createHash as Hv}from"node:crypto";import{existsSync as so,mkdirSync as Xf,readFileSync as tl,readdirSync as Jv,renameSync as Xv,statSync as Gv,writeFileSync as no}from"node:fs";import{homedir as Vv}from"node:os";import{dirname as Gf,join as Je,resolve as oo}from"node:path";import{fileURLToPath as Yv}from"node:url";function Yf(t){let e=oo(t);for(;;){let r=Je(e,rl);try{if(Gv(r).isDirectory())return r}catch{}let n=Gf(e);if(n===e)return null;e=n}}function io(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return oo(e);let r=Yf(t);return r!==null?r:Je(Vf(),rl)}function Kf(t){return Je(io(t),"templates","workflows")}function zf(){return oo(Gf(Yv(import.meta.url)),"..","..","workflows")}function Kv(t){let e=Je(t,Zf);try{let r=JSON.parse(tl(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function zv(t,e){Xf(t,{recursive:!0});let r=Je(t,Zf),n=`${r}.tmp-${process.pid}`;no(n,`${JSON.stringify(e,null,2)}
1323
+ `,"utf8"),Xv(n,r)}function ao(t={}){let e=io(t.cwd),r=Je(e,"templates","workflows"),n=zf(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=so(n)?Jv(n).filter(l=>l.endsWith(".compound.json")||l.endsWith(".lmctl")||l==="index.jsonl"):[];if(o.length===0)return s;Xf(r,{recursive:!0});let i=Kv(e),a=Kt();for(let l of o){let c=`workflows/${l}`,u=tl(Je(n,l)),d=Jf(u),f=Je(r,l);if(!so(f)){try{no(f,u,{flag:"wx"}),s.copied.push(l)}catch{}i.files[c]=d;continue}let p=Jf(tl(f));if(p===d){i.files[c]=d;continue}let m=i.files[c];if(m!==void 0&&p===m)no(f,u),i.files[c]=d,s.refreshed.push(l);else{let h=Je(r,`${l}.dist-${a}`);no(h,u),s.preserved.push(l),s.shadowed.push(`${l}.dist-${a}`)}}zv(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function nl(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(oo(r));let n=Yf(t??process.cwd());return n!==null&&e.push(n),e.push(Je(Vf(),rl)),e}function lo(t,e){let r=nl(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Je(s,"templates","workflows",o);if(so(i))return i}for(let s of n){let o=Je(zf(),s);if(so(o))return o}return null}var rl,Vf,Jf,Zf,co=T(()=>{"use strict";os();rl=".lmctl",Vf=()=>process.env.HOME??Vv(),Jf=t=>Hv("sha256").update(t).digest("hex");Zf=".dist-manifest.json"});import{createHash as Zv}from"node:crypto";import{existsSync as Qv,mkdirSync as e0,writeFileSync as t0}from"node:fs";import{dirname as r0,join as Lr}from"node:path";function lr(t){return typeof t=="string"&&t.startsWith(Qf)}function l0(t){if(!lr(t))throw new et(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Qf.length),r=e.indexOf("/");if(r<=0)throw new et(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!i0.has(n))throw new et(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new et(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new et(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function c0(t,e,r){if(t==="workflow")return lo(e,r);let n=t==="mcp"?Lr("templates","mcp",`${e}.json`):Lr("templates","skills",e,"SKILL.md");for(let s of nl(r)){let o=Lr(s,n);if(Qv(o))return o}return null}function u0(t,e,r){let n=Lr(io(r),s0,t);return t==="skill"?Lr(n,e,"SKILL.md"):Lr(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function d0(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 kn(t,e){let{kind:r,name:n,ref:s}=l0(t),o=c0(r,n,e);if(o!==null)return o;let i=`${n0}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(o0)})}catch(u){throw new et(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new et(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=a0.exec(s);if(u!==null){let d=Zv("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new et(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!d0(r,l))throw new et(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=u0(r,n,e);return e0(r0(c),{recursive:!0}),t0(c,l,"utf8"),c}var Qf,n0,s0,o0,i0,et,a0,sl=T(()=>{"use strict";co();Qf="lmctl://",n0="https://lmctl.com/templates/",s0=".cache",o0=8e3,i0=new Set(["workflow","mcp","skill"]),et=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},a0=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as op}from"node:child_process";import{cpSync as ep,existsSync as al,mkdirSync as ip,mkdtempSync as f0,readFileSync as ap,statSync as p0,writeFileSync as ol}from"node:fs";import{homedir as m0,tmpdir as _0}from"node:os";import{basename as tp,join as Xe}from"node:path";function bt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function il(t,e,r){if(Array.isArray(t)){for(let n of t)il(n,e,r);return}if(bt(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))il(n,e,r)}}function y0(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!bt(a)||!Array.isArray(a.steps)))for(let l of a.steps)bt(l)&&l.members!==void 0&&il(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(w0(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function lp(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(h0)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>rp)throw new tt(e,`fetched ${t} exceeds ${rp} bytes`);return n}async function E0(t,e){if(typeof t!="string")return[t];lr(t)&&(t=await kn(t));let r;if(ll.test(t))r=await lp(t,e);else{if(!al(t))throw new tt(e,`mcp file not found: ${t}`);r=ap(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(bt(n)&&bt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...bt(o)?o:{}}));if(bt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function uo(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function vn(t,e,r,n){let s=op(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function b0(t,e,r){op(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function T0(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function S0(t){let e=["mcp","add"];if(uo(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function k0(t){if(uo(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function v0(t){if(uo(t)){let r=["mcp","add","--transport",t.type==="sse"?"sse":"http"];for(let[n,s]of Object.entries(t.headers??{}))r.push("--header",`${n}: ${s}`);return r.push(t.name,t.url??""),r}let e=["mcp","add"];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push(t.name,"--",t.command??"",...t.args??[]),e}function I0(t){let e=Xe(process.env.XDG_CONFIG_HOME??Xe(In(),".config"),"opencode"),r=Xe(e,"opencode.json"),n={};if(al(r))try{let o=JSON.parse(ap(r,"utf8"));bt(o)&&(n=o)}catch{}let s=bt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=uo(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),ip(e,{recursive:!0}),ol(r,`${JSON.stringify(n,null,2)}
1324
+ `,"utf8")}function j0(t){if(typeof t!="string")return t.name;let e=tp(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?tp(t.replace(/\/skill\.md$/i,"")):e}async function np(t,e,r){let n=j0(t),s=Xe(e,n);if(ip(s,{recursive:!0}),typeof t!="string")return ol(Xe(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(lr(t)&&(t=await kn(t)),ll.test(t))return ol(Xe(s,"SKILL.md"),await lp(t,r),"utf8"),{name:n,dir:s};if(!al(t))throw new tt(r,`skill path not found: ${t}`);return p0(t).isDirectory()?(ep(t,s,{recursive:!0}),{name:n,dir:s}):(ep(t,Xe(s,"SKILL.md")),{name:n,dir:s})}async function fo(t){let{dal:e,member:r,stderr:n}=t,s=y0(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Se(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1325
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await E0(c,r.alias));if(o==="opencode")I0(l);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="codex"||o==="copilot")for(let c of l)if(b0(o,T0(o,c.name),i),o==="claude"){let{name:u,...d}=c;vn("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?vn("codex",k0(c),i,r.alias):o==="copilot"?vn("copilot",v0(c),i,r.alias):vn(o,S0(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(g0.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"){let l=f0(Xe(_0(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!ll.test(c)?c:(await np(c,l,r.alias)).dir;vn("gemini",["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`gemini skills install --scope user\` (idempotent).`)}else if(sp[o]!==void 0){let l=sp[o]();for(let c of s.skills)await np(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,ll,h0,rp,g0,w0,In,sp,cl=T(()=>{"use strict";Oe();sl();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},ll=/^https?:\/\//i,h0=8e3,rp=1e6,g0=new Set(["opencode"]),w0=t=>JSON.stringify(t),In=()=>process.env.HOME??m0();sp={claude:()=>Xe(In(),".claude","skills"),qwen:()=>Xe(In(),".qwen","skills"),codex:()=>Xe(In(),".codex","skills"),copilot:()=>Xe(In(),".copilot","skills")}});async function X(t,e){if(t.dal!==void 0)return e(t.dal);let r=me({path:de()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function x(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function D(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1326
+ `)}function w(t,e){return t.stderr.write(`error: ${e}
1327
+ `),1}function fe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1328
+ `),2}var Te=T(()=>{"use strict";Oe();Be()});var pp={};le(pp,{defaultTeamNameForProject:()=>X0,resolveAlias:()=>_o,resolveProject:()=>po,resolveTeam:()=>mo,runCode:()=>x0});import{execFileSync as N0}from"node:child_process";import{basename as $0,resolve as cp}from"node:path";import*as dl from"node:readline";import{setTimeout as ul}from"node:timers/promises";async function x0(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return R0(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return dp(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return U0(e);try{return await X(e,async s=>{switch(r){case"team":return A0(n,e,s);case"chat":return D0(n,e,s);case"spec":return P0(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return fe(e,s)}}function R0(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1329
+ `)),0}function A0(t,e,r){let[n,...s]=t;switch(n){case"add":return O0(s,e,r);case"list":return C0(s,e,r);case"show":return L0(s,e,r);case"rm":return M0(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function O0(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=x(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=Mr(e,r,x(n,"--project"),x(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??i.project.local_path});return D(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1330
+ `),0}function C0(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=Mr(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=fp(r.listTeamMembers(s.team.id));if(D(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Se(i)} ${i.sessionid??"(unseeded)"}
1331
+ `);return 0}function L0(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=Mr(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(D(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
1332
+ `),e.stdout.write(`role: ${i.role}
1333
+ `),e.stdout.write(`provider: ${Se(i)}
1334
+ `),e.stdout.write(`model: ${i.model??"(default)"}
1335
+ `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1336
+ `),e.stdout.write(`sessiondir: ${i.sessiondir}
1337
+ `)),0)}function M0(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=Mr(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return D(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1338
+ `),0}async function D0(t,e,r){if(t.includes("--help")||t.includes("-h"))return dp(e);let n=P(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=Mr(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=_o(e,r,s.team,x(n,"--alias"));if(typeof o=="number")return o;let i=await J0(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1339
+ `);let a=e.stdin??process.stdin,l=dl.createInterface({input:a,terminal:!1}),c=i;jn(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){jn(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1340
+ `),0;if(d==="/help"){H0(e),jn(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1341
+ `),jn(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1342
+ `);let f=await jr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
1343
+ `);let p=r.findTeamMemberByAlias(s.team.id,c.alias);p!==null&&(c=p),jn(e,c,s.project)}}finally{l.close()}return 0}async function P0(t,e,r){let n=P(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=Mr(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=x(n,"--template")??up,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=x(n,"--slug")??q0(s),c={task_description:s,slug:l},u=x(n,"--from-requirement"),d=x(n,"--from-plan"),f=x(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let p=F0(r,e),m=await Nn(p,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${m.id} for ${o.project.name}/${l}
1344
+ `),W0(e,p,m.id)}function F0(t,e){let r=bn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function U0(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${up}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1345
+ `)),0}async function W0(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await Nn(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1346
+ `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1347
+ `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await B0(t,e,r,n);if(i!=="continue")return i;continue}await ul(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1348
+ `),1}async function B0(t,e,r,n){let s=await Nn(e,`/api/runs/${n}`,"GET"),o=typeof s.current_state=="string"&&s.current_state.startsWith("__paused__:")?s.current_state.slice(11):null;if(o===null)return t.stderr.write(`[code spec] run ${n} paused without an Interactive state; polling will continue
1349
+ `),await ul(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1350
+ `),await ul(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1351
+ `);let a=dl.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1352
+ `),0;if(c==="/done")return await Nn(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await Nn(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function Nn(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function q0(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function dp(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1353
+ `)),0}function H0(t){t.stderr.write(`commands: /help, /exit
1354
+ `)}function jn(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function po(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=N0("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=cp(s),i=e.listProjects().find(a=>cp(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function mo(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function _o(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=fp(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function Mr(t,e,r,n){let s=po(t,e,r);if(typeof s=="number")return s;let o=mo(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function fp(t){return t.filter(e=>e.state!=="retired")}async function J0(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1355
+ `),Zs(r,e),eo(r);let s=await Nr({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=Or(Se(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1356
+ ${i}
1357
+ `),await fo({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1358
+
1359
+ ${Ar}`:Ar;return e.setMemberPromptSnapshot(o.id,l)??o}function X0(t){return`${$0(t.local_path)}-code`}var up,fl=T(()=>{"use strict";gn();Cs();Sn();Ka();za();Oe();Cr();cl();Te();Va();up="spec-driven-task"});import mp from"jexl";function Dt(t){mp.compile(_p(t))}async function cr(t,e){return mp.eval(_p(t),e)}function _p(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Dr=T(()=>{"use strict"});import{z as y}from"zod";function yl(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var G0,hp,pl,ml,_l,hl,gl,wl,gp,V0,Y0,K0,$n,z0,ho,go,wo,yo,Eo,wp,Z0,Q0,eI,tI,bo,Pr=T(()=>{"use strict";Dr();G0=y.object({kind:y.enum(["success","neutral","failure"])}),hp=y.enum(["string","number","boolean","object","array"]),pl=y.object({name:y.string().min(1),type:hp,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),ml=y.object({name:y.string().min(1),type:hp,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),_l=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),hl="__failure__",gl=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),wl=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),gp=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),V0=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),Y0=y.union([y.string().min(1),V0]),K0=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),$n=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(Y0).optional(),skills:y.array(K0).optional()}),z0=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),ho=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:$n,pre_checks:y.array(z0).optional(),reviewers:y.array($n.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),go=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array($n.extend({topic:y.string().min(1)})).optional(),consolidator:$n,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),wo=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:$n.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),yo=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),Eo=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),wp=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Dt(yl(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),Z0=y.discriminatedUnion("type",[gp,ho,go,wo,yo,Eo,wp]),Q0=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:Z0,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{Dt(yl(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}`})}}),eI=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Dt(yl(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),tI=y.discriminatedUnion("type",[gp,ho,go,wo,yo,Eo,wp,Q0,eI]),bo=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),tI),terminals:y.record(y.string().min(1),G0),errors:wl,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(pl).optional(),outputs:y.array(ml).optional(),triggers:y.array(_l).optional(),read_only:y.boolean().optional(),requires:gl}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Y}from"zod";var rI,To,nI,sI,oI,ut,Fr=T(()=>{"use strict";Pr();rI=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,To=Y.string().regex(rI),nI=Y.object({step_id:To,type:Y.literal("main"),index:Y.number().int().min(0)}),sI=Y.record(To,Y.record(Y.string().min(1),Y.array(Y.array(nI)))),oI=Y.object({id:To,name:Y.string().min(1),type:Y.string().min(1),typeVersion:Y.number().int().positive().default(1),parameters:Y.record(Y.string(),Y.unknown()).default({}),members:Y.record(Y.string(),Y.unknown()).optional(),estimated_duration_ms:Y.number().int().nonnegative().optional()}),ut=Y.object({schema_version:Y.literal("lmctl/v3"),definition_schema_version:Y.literal(3),name:Y.string().min(1),version:Y.number().int().positive(),description:Y.string().optional(),estimated_duration_ms:Y.number().int().nonnegative().optional(),default_task_timeout_ms:Y.number().int().positive().max(216e5).optional(),concurrency_key:Y.string().min(1).optional(),concurrent_limit:Y.number().int().positive().optional(),errors:wl,inputs:Y.array(pl).optional(),outputs:Y.array(ml).optional(),steps:Y.array(oI).min(1),connections:sI.default({}),entry_step_id:To,triggers:Y.array(_l).optional(),read_only:Y.boolean().optional(),requires:gl}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function So(t){return bl(t)}function bl(t){if(Array.isArray(t))return t.map(bl);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=bl(e[n]);if(typeof r.type=="string"){let n=aI[r.type];n!==void 0&&(r.type=n)}return r}var El,iI,aI,Tl=T(()=>{"use strict";El="lmctl.builtin.",iI={Review:`${El}Review`,Research:`${El}Research`,Consolidate:`${El}Consolidate`},aI=Object.fromEntries(Object.entries(iI).map(([t,e])=>[e,t]))});import{readFileSync as lI}from"node:fs";function bp(t){return cI(t)}function cI(t){let e=So(fI(t));if(dI(e),Tp(e)===3)return uI(e);let r=bo.safeParse(e);if(!r.success)throw new Tt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=pI(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Tt(n);return r.data}function uI(t){let e=ut.safeParse(t);if(!e.success)throw new Tt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function dI(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Tp(t);if(!(e===null||yp.includes(e)))throw new Tt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${yp.join(", ")}`}]})}function Tp(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 fI(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1360
+ `)||e.startsWith("{")||e.startsWith("[")?Ep(t,"$"):e.endsWith(".json")?Ep(lI(e,"utf8"),e):t}function Ep(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Tt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function pI(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"}),mI(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function mI(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 yp,Tt,Sp=T(()=>{"use strict";Pr();Fr();Tl();yp=[1,2,3],Tt=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 _I}from"node:crypto";function kp(t,e){let r=hI(e),n=_I("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function hI(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var vp=T(()=>{"use strict";Fr()});function yI(t,e){let r=wI[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function $p(t){let e=[],r=(I,j)=>{throw new Ur([{line:I,message:j}])},n=t.split(`
1361
+ `),s=[];for(let I=0;I<n.length;I+=1){let O=TI(n[I]).trim();O.length>0&&s.push({n:I+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,p={},m=new Map,h=new Map,g=new Map,_=(I,j,O,B,F,C)=>{l.has(I)&&r(B,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(B,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:j,params:O,line:B,isTerminal:F,...C?{members:C}:{}}),u.push(I)},E=I=>{let j=[],O=I+1;for(;O<s.length;O+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(B===null)break;j.push({label:B[1],dst:B[2]})}return{branches:j,nextIdx:O-1}};for(let I=1;I<s.length;I+=1){let{n:j,text:O}=s[I],B=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){I!==1&&r(j,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(O)??r(j,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),C=Pt(F[1],j,r);for(let z of Object.keys(C))jp.has(z)||r(j,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...jp].join(", ")} (no grammar inflation; bounded)`);p=C;continue}if(B==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(j,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),C=F[1],z=F[2],he=F[3],oe=Ip[z];oe===void 0&&r(j,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(Ip).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:pt}=yI(oe,Pt(he,j,r));_(C,oe,we,j,!1,Object.keys(pt).length>0?pt:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(j,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),C=F[1],z=F[2],he=F[3],oe=Np[z];oe===void 0&&r(j,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(Np).join(", ")})`),m.has(C)&&r(j,`duplicate trigger id: ${C}`),m.set(C,{id:C,type:oe,parameters:Pt(he,j,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(j,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${O}`),C=F[1],z=F[2].trim(),he=B==="mcp"?h:g;he.has(C)&&r(j,`duplicate ${B} declaration: ${C}`);let oe;if(z.startsWith("{")){let we=Pt(z,j,r);B==="mcp"?oe={...we,name:C}:((typeof we.content!="string"||we.content.length===0)&&r(j,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:we.content})}else{let we=xp(z);(typeof we!="string"||we.length===0)&&r(j,`\`${B} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=we}he.set(C,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(j,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},j,!0);continue}if(B==="seq"){let C=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(j,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let he=C[z],oe=C[z+1],we=C[z+2],pt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:he,port:pt,dstDeclId:we,line:j})}continue}if(B==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(j,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],z=[],he,oe=I+1;for(;oe<s.length;oe+=1){let we=s[oe].text,pt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(pt!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let nn=pt[2];z.push({when:pt[1].trim(),next:`@terminal:${nn}`}),c.push({srcDeclId:C,port:nn,dstDeclId:pt[3],line:s[oe].n});continue}let Pi=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Pi!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let nn=Pi[1];he=`@terminal:${nn}`,c.push({srcDeclId:C,port:nn,dstDeclId:Pi[2],line:s[oe].n});continue}break}z.length===0&&r(j,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:z,...he!==void 0?{default_next:he}:{}},j,!1),I=oe-1;continue}if(B==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(j,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(F[1],"lmctl/loop",Pt(F[2],j,r),j,!1);continue}if(B==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(j,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),C=Pt(F[2],j,r);"mode"in C&&r(j,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",C,j,!1);continue}if(B==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(j,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),C=F[1],z=Pt(F[2],j,r),he=z.workflow;(typeof he!="string"||he.length===0)&&r(j,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...we}=z;_(C,"lmctl/subflow",{workflow_name:he,...we},j,!1),d.push({declId:C,target:he,line:j});continue}if(B==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(j,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),C=F[1],z=Pt(F[2],j,r),{branches:he,nextIdx:oe}=E(I);he.length===0&&r(j,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},j,!1,{agent:z});for(let we of he)c.push({srcDeclId:C,port:we.label,dstDeclId:we.dst,line:j});I=oe;continue}if(B==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(j,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(j,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r(j,`unknown statement \`${B}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let v=I=>{if(Array.isArray(I)){for(let O of I)v(O);return}if(typeof I!="object"||I===null)return;let j=I;if(typeof j.alias=="string")for(let[O,B]of[["mcp",h],["skills",g]]){let F=j[O];Array.isArray(F)&&(j[O]=F.map(C=>typeof C=="string"&&B.has(C)?structuredClone(B.get(C)):C))}for(let O of Object.values(j))v(O)};for(let I of u){let j=l.get(I);j.members!==void 0&&v(j.members)}let k=I=>kp(i,I),N=u.map(I=>{let j=l.get(I);return{id:k(I),name:I,type:j.type,typeVersion:1,parameters:j.params,...j.members?{members:j.members}:{}}}),S={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let j=k(I.srcDeclId);S[j]??={},S[j][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),S[j][I.port]=[[{step_id:k(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let j=l.get(I);EI.has(j.type)||r(j.line,`unknown archetype \`${j.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let A=new Map;for(let I of c){let j=A.get(I.srcDeclId);j===void 0?A.set(I.srcDeclId,[I.dstDeclId]):j.push(I.dstDeclId)}for(let I of u){let j=l.get(I);if(j.type!=="lmctl/loop")continue;let O=j.params.body;if(typeof O=="string"&&l.has(O)){let B=A.get(I);B===void 0?A.set(I,[O]):B.push(O)}}let L=new Set([f]),q=[f];for(;q.length>0;){let I=q.shift();for(let j of A.get(I)??[])L.has(j)||(L.add(j),q.push(j))}for(let I of u)L.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let ee=new Map;for(let I of c){let j=ee.get(I.srcDeclId);j===void 0&&(j=new Set,ee.set(I.srcDeclId,j)),j.add(I.port)}let $=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let j=l.get(I);if(j.isTerminal)continue;let O=ee.get(I)??new Set;if(j.type==="lmctl/review"){let F=[...O].some(C=>!$.has(C));!O.has("approve")&&!F&&r(j.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let B=bI[j.type];if(B!==void 0)for(let F of B)O.has(F)||r(j.line,`uncovered outcome: required outcome \`${F}\` of step \`${I}\` (\`${j.type}\`) has no connection \u2014 route it (\`seq ${I} -${F}-> <target|terminal>\`)`);else O.size===0&&r(j.line,`uncovered outcome: non-terminal step \`${I}\` (\`${j.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let j=l.get(I),O=gI[j.type];if(O===void 0)continue;let B={...j.params,...j.members??{},type:O.v2type,state_name:I,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},F=O.schema.safeParse(B);if(!F.success){let C=F.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(j.line,`step \`${I}\` (\`${j.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${j.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...p,...m.size>0?{triggers:[...m.values()]}:{},steps:N,connections:S,entry_step_id:k(f)},pe=ut.safeParse(H);if(!pe.success)throw new Ur(pe.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return pe.data}function TI(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 Pt(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of SI(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=xp(l)}return s}function SI(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function xp(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 gI,wI,Ip,Ur,EI,bI,jp,Np,Rp=T(()=>{"use strict";Fr();vp();Pr();gI={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ho},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:go},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:wo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:yo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Eo}},wI={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ip={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"},Ur=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1362
+ ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1363
+ `)}`),this.issues=e,this.name="DslCompileError"}},EI=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"]),bI={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},jp=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Np={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as kI}from"node:fs";function vI(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function II(t){for(let e of t.split(`
1364
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function xe(t){if(typeof t=="string"&&vI()&&II(t)){let r;try{r=$p(t)}catch(s){throw s instanceof Ur?new St(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=ut.safeParse(r);if(!n.success)throw new St(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=So(NI(t));if($I(e)&&e.definition_schema_version===3){let r=ut.safeParse(e);if(!r.success)throw new St(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return jI(e)}function jI(t){let e=bo.safeParse(t);if(!e.success)throw new St(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new St([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return bp(r)}catch(s){throw s instanceof Tt?new Sl(s):s}}function NI(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1365
+ `)||e.startsWith("{")||e.startsWith("[")?Ap(t):e.endsWith(".json")?Ap(kI(e,"utf8")):t}function Ap(t){return JSON.parse(t)}function $I(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Sl,St,Wr=T(()=>{"use strict";Pr();Sp();Tl();Fr();Rp();Sl=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},St=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function ko(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:xI(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:AI(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function xI(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=RI(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function RI(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function AI(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var kl=T(()=>{"use strict"});var Op={};le(Op,{enqueueFromAgentOutput:()=>CI,enqueueFromGitHubIssue:()=>vl,enqueueManual:()=>OI,enqueueScheduled:()=>LI});function vl(t,e){return Io(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:vo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function OI(t,e){return Io(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:vo(e.payload),concurrency_key:e.concurrency_key})}function CI(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Io(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:vo(e.payload),concurrency_key:e.concurrency_key})}function LI(t,e){return Io(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:vo(e.payload),concurrency_key:e.concurrency_key})}function vo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Io(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=xe(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=ko({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Il=T(()=>{"use strict";Wr();kl()});async function Lp(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return Cp(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await MI(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...DI(o.parameters_override)},l=Cp(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function Cp(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[vl(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function MI(t,e){if(t===null||t.trim().length===0)return!0;try{return await cr(t,e)===!0}catch{return!1}}function DI(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var Mp=T(()=>{"use strict";Dr();Il()});import{spawnSync as PI}from"node:child_process";async function Nl(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=PI(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!UI(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Lp({dal:t.dal,project:t.project,issue:WI(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Br(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=FI(r.intake_config);try{let s=await Nl({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function FI(t){if(t===null)return{};try{let e=JSON.parse(t);if(!jl(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function UI(t){return Array.isArray(t)&&t.every(e=>{if(!jl(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:jl(n)&&typeof n.name=="string"))})}function WI(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function jl(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var jo=T(()=>{"use strict";Mp()});function Pp(t){return async e=>qI(t.app,e,t.log!==void 0?{log:t.log}:{})}async function qI(t,e,r={}){let n=HI(e.path),s={"content-type":"application/json",...e.headers??{},[No]:$l},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await JI(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Dp(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Dp(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Dp(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function HI(t){let e=t.startsWith("/")?t:`/${t}`;return`${BI}${e}`}async function JI(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==No&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var No,$l,BI,xl=T(()=>{"use strict";No="x-mailbox-channel",$l="1",BI="http://mailbox.local"});import{createHash as Fp,createHmac as XI,timingSafeEqual as GI}from"node:crypto";function Up(){return async(t,e)=>{let r=Wp();if(r===null||ZI(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(No)===$l){await e();return}let n=t.req.query("token");if(n!==void 0&&$o(n,r)){Al(t,r),await e();return}if(zI(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function Wp(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Bp(t){let e=Wp();return e!==null&&$o(t,e)}function Al(t,e,r=new Date){t.header("Set-Cookie",`${Rl}=${YI(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function qp(t){t.header("Set-Cookie",`${Rl}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function YI(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+VI*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Hp(t,n)}`,"utf8").toString("base64url")}function KI(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:$o(s[2],Hp(e,`${s[0]}|${s[1]}`))}function $o(t,e){return GI(Fp("sha256").update(t).digest(),Fp("sha256").update(e).digest())}function zI(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&$o(r,e))return!0;let n=QI(t.req.header("cookie")??"")[Rl];return n!==void 0&&KI(n,e)}function ZI(t){return t==="/login"||t==="/logout"}function QI(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function Hp(t,e){return XI("sha256",t).update(e).digest("hex")}var Rl,VI,Jp=T(()=>{"use strict";xl();Rl="lmctl_next_session",VI=30});import{existsSync as qr,mkdirSync as ej,readdirSync as tj,readFileSync as xo,unlinkSync as rj,writeFileSync as Ll}from"node:fs";import{join as ur}from"node:path";function Ge(t){if(!nj.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Gp(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return aj(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:Xp,updated_at:Xp}:null}function sj(t,e,r,n){let s=r!==null?`
1366
+ description: ${r}`:"";return`---
1367
+ name: ${t}${s}
1368
+ type: ${e}
1369
+ ---
1370
+ ${n}`}function oj(t,e,r,n){let s=ur(t,Ml),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=qr(s)?xo(s,"utf8"):"",a=new RegExp(`^- \\[${Vp(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1371
+ `)?`${i}
1372
+ ${o}
1373
+ `:`${i}${o}
1374
+ `,Ll(s,i,"utf8")}function ij(t,e){let r=ur(t,Ml);if(!qr(r))return;let n=xo(r,"utf8"),s=new RegExp(`^- \\[${Vp(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Ll(r,n.replace(s,""),"utf8")}function Vp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function aj(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function rt(t,e){return t.durable_memory_mode==="db"?new Cl(e,t.id):new Ol(t.local_path)}var nj,Ml,Xp,Ol,Cl,Dl=T(()=>{"use strict";nj=/^[a-zA-Z0-9_-]+$/;Ml="MEMORY.md",Xp="1970-01-01T00:00:00.000Z",Ol=class{dir;constructor(e){this.dir=ur(e,"durable-memory")}read(e){Ge(e);let r=ur(this.dir,`${e}.md`);if(!qr(r))return null;let n=xo(r,"utf8");return Gp(e,n)}write(e){Ge(e.name),ej(this.dir,{recursive:!0});let r=ur(this.dir,`${e.name}.md`),n=!qr(r),s=sj(e.name,e.type,e.description??null,e.body);return Ll(r,s,"utf8"),oj(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){Ge(e);let r=ur(this.dir,`${e}.md`);return qr(r)?(rj(r),ij(this.dir,e),!0):!1}listFiles(){if(!qr(this.dir))return[];let e=tj(this.dir).filter(n=>n.endsWith(".md")&&n!==Ml),r=[];for(let n of e){let s=n.slice(0,-3),o=xo(ur(this.dir,n),"utf8"),i=Gp(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Cl=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){Ge(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(e){Ge(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return Ge(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Kp(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=rt(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=rt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!Yp.has(a))return n.json({error:`invalid type: must be one of ${[...Yp].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=rt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(p){return n.json({error:p.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=rt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var Yp,zp=T(()=>{"use strict";Dl();Yp=new Set(["user","feedback","project","reference"])});function cj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(lj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function uj(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function Zp(t,e=new Date){let{time:r,date:n}=uj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=cj(h.data),E=h.data.length,v=new Uint8Array(30+g.length),k=new DataView(v.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,E,!0),k.setUint32(22,E,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),v.set(g,30),s.push(v,h.data);let N=new Uint8Array(46+g.length),S=new DataView(N.buffer);S.setUint32(0,33639248,!0),S.setUint16(4,20,!0),S.setUint16(6,20,!0),S.setUint16(8,0,!0),S.setUint16(10,0,!0),S.setUint16(12,r,!0),S.setUint16(14,n,!0),S.setUint32(16,_,!0),S.setUint32(20,E,!0),S.setUint32(24,E,!0),S.setUint16(28,g.length,!0),S.setUint16(30,0,!0),S.setUint16(32,0,!0),S.setUint16(34,0,!0),S.setUint16(36,0,!0),S.setUint32(38,0,!0),S.setUint32(42,i,!0),N.set(g,46),o.push(N),i+=v.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,p=new Uint8Array(f),m=0;for(let h of s)p.set(h,m),m+=h.length;for(let h of o)p.set(h,m),m+=h.length;return p.set(u,m),p}var lj,Qp=T(()=>{"use strict";lj=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Oo,mkdirSync as dj,readdirSync as fj,readFileSync as rm,statSync as pj,unlinkSync as mj,writeFileSync as _j}from"node:fs";import{join as An}from"node:path";function nm(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await nt(n);if(typeof s=="string")return R(n,s,400);let o=ie(s,"name"),i=ie(s,"local_path");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(i===null||i.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return R(n,`project already exists: ${o}`,409);let a=ie(s,"workflow_name")??"bugfix",l,c=ie(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return R(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return R(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ie(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return R(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?R(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await nt(n);if(typeof s=="string")return R(n,s,400);let o=ie(s,"name");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return R(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let o=await nt(n);if(typeof o=="string")return R(n,o,400);let i=ie(o,"alias"),a=ie(o,"provider");if(i===null||i.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return R(n,`member already exists: ${i}`,409);let l=ie(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ie(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return R(n,"member not found",404);let i=await nt(n);if(typeof i=="string")return R(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?R(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=rt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return R(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!Ro.includes(l))return R(n,`invalid type: must be one of ${Ro.join("|")}`,400);try{Ge(i)}catch(d){return R(n,d.message,400)}let c=rt(s,r);try{if(c.read(i)!==null)return R(n,`chapter already exists: ${i}`,409)}catch(d){return R(n,d.message,400)}try{c.write({type:l,name:i,description:ie(o,"description"),body:a})}catch(d){return R(n,d.message,400)}let u=c.read(i);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=rt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return i===null?R(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=n.req.param("chapter"),i=await nt(n);if(typeof i=="string")return R(n,i,400);let a=rt(s,r),l;try{l=a.read(o)}catch(p){return R(n,p.message,400)}if(l===null)return R(n,"chapter not found",404);let c=ie(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ie(i,"description"):l.description,d=ie(i,"type")??l.type;if(!Ro.includes(d))return R(n,`invalid type: must be one of ${Ro.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(p){return R(n,p.message,400)}let f=a.read(o);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=rt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return i?n.json({removed:!0}):R(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(gj(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=await nt(n);if(typeof o=="string")return R(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!Ao.has(l))return R(n,`invalid type: must be one of ${[...Ao].join("|")}`,400);try{Ge(i)}catch(f){return R(n,f.message,400)}let c=xn(s.local_path),u=An(c,`${i}.md`);if(Oo(u))return R(n,`chapter already exists: ${i}`,409);dj(c,{recursive:!0}),tm(u,i,l,ie(o,"description"),a);let d=Rn(c,i);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{Ge(n.req.param("chapter"))}catch(i){return R(n,i.message,400)}let o=Rn(xn(s.local_path),n.req.param("chapter"));return o===null?R(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=n.req.param("chapter");try{Ge(o)}catch(p){return R(n,p.message,400)}let i=xn(s.local_path),a=Rn(i,o);if(a===null)return R(n,"chapter not found",404);let l=await nt(n);if(typeof l=="string")return R(n,l,400);let c=ie(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ie(l,"description"):a.description,d=ie(l,"type")??a.type;if(!Ao.has(d))return R(n,`invalid type: must be one of ${[...Ao].join("|")}`,400);tm(An(i,`${o}.md`),o,d,u,c);let f=Rn(i,o);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let o=n.req.param("chapter");try{Ge(o)}catch(a){return R(n,a.message,400)}let i=An(xn(s.local_path),`${o}.md`);return Oo(i)?(mj(i),n.json({removed:!0})):R(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await nt(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(em))),t.post("/api/chat/sessions",async n=>{let s=await hj(n);if(typeof s=="string")return R(n,s,400);let o=s!==null?ie(s,"title"):null,i=r.createChatbotSession(em,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let o=await nt(n);if(typeof o=="string")return R(n,o,400);let i=ie(o,"role"),a=ie(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let i=or(r,s),a=[];for(let c of i){let u=yj(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=rm(c.path),p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(p)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Zp(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(t,e,r){return t.json({error:e},r)}async function nt(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function hj(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ie(t,e){let r=t[e];return typeof r!="string"?null:r}function xn(t){return An(t,"ai-test")}function Rn(t,e){let r=An(t,`${e}.md`);if(!Oo(r))return null;let n=rm(r,"utf8"),s=wj(n),o=pj(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function gj(t){let e=xn(t);return Oo(e)?fj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Rn(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function tm(t,e,r,n,s){let o=n!==null&&n.length>0?`
1375
+ description: ${n}`:"",i=`---
1376
+ name: ${e}${o}
1377
+ type: ${r}
1378
+ ---
1379
+ ${s}`;_j(t,i,"utf8")}function wj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function yj(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?Ej(t.path):bj(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function Ej(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function bj(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Ro,Ao,em,sm=T(()=>{"use strict";Et();Qp();Dl();Ro=["user","feedback","project","reference"],Ao=new Set(["smoke","integration","vision","scenario","regression"]),em="operator"});function ve(t,e){return`<!doctype html>
1380
+ <html lang="en">
1381
+ <head>
1382
+ <meta charset="utf-8">
1383
+ <meta name="viewport" content="width=device-width, initial-scale=1">
1384
+ <title>${b(t)} - lmctl</title>
1385
+ <script src="https://unpkg.com/htmx.org@2.0.4"></script>
1386
+ <style>
1387
+ body { font-family: ui-sans-serif, system-ui, sans-serif; margin: 0; color: #111827; background: #f9fafb; }
1388
+ nav { display: flex; gap: 1rem; padding: 0.75rem 1rem; background: #111827; color: white; }
1389
+ nav a { color: white; text-decoration: none; }
1390
+ main { max-width: 1120px; margin: 0 auto; padding: 1.25rem; }
1391
+ table { width: 100%; border-collapse: collapse; background: white; }
1392
+ th, td { padding: 0.5rem 0.625rem; border-bottom: 1px solid #e5e7eb; text-align: left; vertical-align: top; }
1393
+ th { background: #f3f4f6; font-weight: 600; }
1394
+ code, pre { background: #f3f4f6; border-radius: 4px; padding: 0.125rem 0.25rem; }
1395
+ pre { padding: 0.75rem; overflow: auto; }
1396
+ .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 0.75rem; }
1397
+ .metric { background: white; border: 1px solid #e5e7eb; border-radius: 8px; padding: 0.75rem; }
1398
+ .muted { color: #6b7280; }
1399
+ .error { color: #b91c1c; font-weight: 600; }
1400
+ form label { display: grid; gap: 0.3rem; margin: 0.75rem 0; }
1401
+ input, select, textarea { font: inherit; padding: 0.4rem; border: 1px solid #d1d5db; border-radius: 4px; }
1402
+ textarea { width: 100%; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
1403
+ .diff { background: #ffffff; border: 1px solid #e5e7eb; }
1404
+ .diff-line { display: grid; grid-template-columns: 1.5rem 1fr; white-space: pre-wrap; padding: 0 0.35rem; }
1405
+ .diff-add { background: #ecfdf5; color: #065f46; }
1406
+ .diff-del { background: #fef2f2; color: #991b1b; }
1407
+ #workflow-graph { height: min(72vh, 760px); min-height: 420px; border: 1px solid #d1d5db; background: #fff; border-radius: 6px; }
1408
+ .graph-toolbar { display: flex; align-items: center; gap: 0.75rem; margin: 0.5rem 0; flex-wrap: wrap; }
1409
+ .workflow-graph-legend { display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 0.75rem 0 1.25rem; }
1410
+ .legend { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.875rem; }
1411
+ .legend::before { content: ""; width: 0.85rem; height: 0.85rem; border-radius: 999px; display: inline-block; background: #64748b; }
1412
+ .legend.archetype-review::before { background: #2563eb; }
1413
+ .legend.archetype-consolidate::before { background: #059669; }
1414
+ .legend.archetype-shell-step::before { background: #64748b; }
1415
+ .legend.archetype-choice::before { background: #7c3aed; }
1416
+ .legend.archetype-foreach::before { background: #0891b2; }
1417
+ .legend.archetype-subflow::before { background: #db2777; }
1418
+ .legend.archetype-terminal::before { background: #ea580c; }
1419
+ button { padding: 0.35rem 0.6rem; }
1420
+ </style>
1421
+ </head>
1422
+ <body>
1423
+ <nav>
1424
+ <a href="/">Status</a>
1425
+ <a href="/layman">Layman</a>
1426
+ <a href="/projects">Projects</a>
1427
+ <a href="/teams">Teams</a>
1428
+ <a href="/workflows">Workflows</a>
1429
+ <a href="/jobs">Jobs</a>
1430
+ <a href="/runs">Runs</a>
1431
+ <a href="/external-objects">External Objects</a>
1432
+ <a href="/attentions">Attentions</a>
1433
+ <a href="/sessions">Sessions</a>
1434
+ <a href="/intake">Intake</a>
1435
+ <a href="/daemon">Daemon</a>
1436
+ <a href="/stats">Stats</a>
1437
+ </nav>
1438
+ <main>${e}</main>
1439
+ </body>
1440
+ </html>`}function b(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function ue(t,e){let r=t.map(s=>`<th>${b(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(o=>`<td>${o}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function ae(t){return`<pre>${b(JSON.stringify(t,null,2))}</pre>`}var Pl=T(()=>{"use strict"});function om(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1441
+ JOIN step s ON s.id = sa.step_id
1442
+ WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1443
+ JOIN step s ON s.id = sa.step_id
1444
+ WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let $ of a){let H=l.get($.step_id)??[];H.push({kind:$.kind,id:$.id}),l.set($.step_id,H)}let c=i.map($=>({id:$.id,state_name:$.state_name,outcome:$.outcome,duration_ms:$.started_at!==null&&$.ended_at!==null?Math.max(0,new Date($.ended_at).getTime()-new Date($.started_at).getTime()):null,artifacts:l.get($.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let $ of d)try{let H=JSON.parse($.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let p=u.map($=>({kind:$.kind,count:$.count,total_elapsed_ms:$.kind==="tool_result"?f:0})),m=c.filter($=>$.outcome==="request_changes"),h=[...new Set(m.map($=>$.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),v=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=v!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1445
+ WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,v,g,_):[],S=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1446
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=S?.input!==null&&S?.input!==void 0?`input: ${S.input}, output: ${S.output??0}`:"n/a",L=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,ee={run_id:t,workflow_name:L?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:p,reviewer_interventions:{count:m.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(ee)})}var im=T(()=>{"use strict"});import{spawnSync as lm}from"node:child_process";function Fl(t){return Tj[t]??`no install hint; ensure '${t}' is on PATH`}function Sj(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function am(t){return lm("which",[t],{encoding:"utf8"}).status===0}function cm(t){if(t===void 0)return null;for(let e of t.tools??[])if(!am(e)){let r=Fl(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!am(e)){let s=Fl(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=Sj(e);if(r===null)continue;let n=lm(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:Fl(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Tj,um=T(()=>{"use strict";Tj={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as kj,readdirSync as vj,readFileSync as Ij}from"node:fs";import{join as dm}from"node:path";function jj(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1447
+ `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function fm(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 pm(t,e){if(e.length===0)return null;let r=dm(t,"durable-memory");if(!kj(r))return null;let n;try{n=vj(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=Ij(dm(r,o),"utf8");if(jj(i).some(l=>e.includes(l))){let l=fm(i,"name")??o.replace(".md",""),c=fm(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var mm=T(()=>{"use strict"});function Bl(t){let e=t.trim().replace(Nj,"").trim();for(let r=0;r<4;r+=1){let n=$j.exec(e);if(n===null)break;e=n[2].trim()}return e}function _m(t){let e=t.trim(),r=xj.exec(e);if(r!==null)return r[2];let n=Rj.exec(e);return n!==null?n[0]:null}function On(t,e){let r=t.split(`
1448
+ `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Bl(r[i]),l=Ul.exec(a);if(l===null)continue;let c=l[1].trim();if(Wl.test(c))continue;let u=_m(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=Bl(r[i]),l=Ul.exec(a);if(l===null)break;let c=Wl.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function hm(t){let e=t.split(`
1449
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=Bl(e[n]),o=Ul.exec(s);if(o===null)continue;let i=o[1].trim();if(Wl.test(i))continue;let a=_m(i);if(a===null||!gr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var Nj,$j,Ul,Wl,xj,Rj,ql=T(()=>{"use strict";un();Nj=/^#{1,6}\s+/,$j=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Ul=/^STANCE:\s+(.+)$/,Wl=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,xj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,Rj=/^[A-Za-z0-9_-]+/});function gm(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var wm=T(()=>{"use strict"});import{readFileSync as Aj}from"node:fs";import{dirname as Oj,join as Cj}from"node:path";import{fileURLToPath as Lj}from"node:url";function Pj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function Bj(t){let e=[],r=[];for(let n of t)Mj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function qj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&Dj.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function Hj(t,e){if(t.length===0)return{matched:!1};let r=Bj(t);for(let n of r){let s=qj(n,e);if(s.matched)return s}return{matched:!1}}function Hl(t){return Hj(t,Wj)}function Jj(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 Jl(t){return Jj(t).split(" ").filter(e=>e.length>0)}var Mj,Dj,Fj,Uj,Wj,ym=T(()=>{"use strict";Mj=new Set(["&&","||",";","|",">",">>","<","<<"]),Dj=/^[A-Za-z_][A-Za-z0-9_]*=/;Fj=Oj(Lj(import.meta.url)),Uj=JSON.parse(Aj(Cj(Fj,"side_effect_classifier.json"),"utf-8")),Wj=Pj(Uj)});function Co(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 Em(t,e){try{return await cr(Xl(t)??t,Co(e))===!0}catch{return!1}}async function Lo(t,e){try{return await cr(Xl(t)??t,Co(e))}catch{return}}async function bm(t,e){if(typeof t!="string")return t;let r=Xl(t);if(r===null)return t;try{return await cr(r,Co(e))}catch{return}}async function Tm(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=Xj(await cr(a,Co(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Xl(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function Xj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Cn=T(()=>{"use strict";Dr()});import{existsSync as Sm,readdirSync as km,readFileSync as Gj,statSync as vm}from"node:fs";import{join as Do}from"node:path";function Im(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 Ve(t,e,r,n,s={}){let o=M(),i=J(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ln}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=gr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:as,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:Vj(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Vj(t){return t.length>8e3?`${t.slice(0,8e3)}
1450
+ \u2026[truncated ${t.length-8e3} chars]`:t}function V(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function K(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 jm(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=Ft(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ue(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=Ft(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=Ft(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=Yj(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Tm(n,e)}function Yj(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 Ft(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 Mn(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=gm(e.dal,e.run_id,()=>o),c=Gl(e,r),u={violation:null},d=E=>{if(l(E),u.violation===null&&E.kind==="tool_use"&&E.tool==="Bash"&&E.summary){let v=Jl(E.summary),k=Hl(v);k.matched&&!c&&(u.violation={summary:E.summary,kind:k.kind})}},f=new Date(Date.now()-1),p=0,m=0,h=E=>{d(E),Kj(E,(v,k)=>{p+=v,m+=k})},g=await jr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Se(n),model:n.model??"unknown",tokens_in:p,tokens_out:m,wall_time_ms:g.ms})}),zj(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Vl(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function Kj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Mo(s.input_tokens),a=Mo(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Mo(o.input_tokens),a=Mo(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Mo(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function kt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=J(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Mn({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function Hr(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=J(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(Bu(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ue(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let p=d.join(`
1451
+
1452
+ `);try{let m=await Mn({context:t,stateId:e,member:c,prompt:p,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let g=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:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:m.violationKind,command_summary:m.summary,message:`State ${e} ran a classified side-effect command (${m.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:m.text}),t.transcripts[e]=m.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${m.ms}`),t.outcomes[e]="done",{outcome:"done",text:m.text,status_detail:`chat_ms=${m.ms}`};let h=On(m.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${m.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:m.text,status_detail:h.outcome!==null?`chat_ms=${m.ms}`:h.reason}}catch(m){let h=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function Jr(t,e){return(e?.length??0)>0?pm(t.project.local_path,e):null}function Nm(t){return Hl(Jl(t))}function Gl(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1453
+ WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1454
+ 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 Vl(t,e){if(!Sm(t))return!1;let r=Do(t,"durable-memory");function n(s){let o;try{o=km(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Do(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(vm(a).mtime>e)return!0}catch{}}return!1}return n(t)}function zj(t,e,r){let n=Do(t.local_path,"durable-memory");if(!Sm(n))return;let s;try{s=km(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Do(n,o),a;try{a=vm(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=Gj(i,"utf8")}catch{continue}let c=Qj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1455
+ `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function Qj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!Zj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Ln,Zj,Le=T(()=>{"use strict";Oe();Pr();gn();mm();ql();un();wm();ym();Cn();Ln="__paused__:";Zj=new Set(["user","feedback","project","reference"])});import{spawnSync as $m}from"node:child_process";function eN(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=$m("git",["diff","--quiet"],{cwd:o}).status!==0,a=$m("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),V(t,r,n,hl),{kind:"terminal",terminal:K(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),V(t,r,n,"clean"),G(t.workflow,e.next)}var xm,Rm=T(()=>{"use strict";Le();xm={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=>eN(t,t.state)}});async function tN(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await Em(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),V(t,r,n,"matched"),G(t.workflow,o.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":K(t.workflow)}}var Am,Om=T(()=>{"use strict";Le();Cn();Am={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=>tN(t,t.state)}});async function rN(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=Jr(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(p,m)=>{let h=`${n}:researcher_${p.alias}[${m}]`,g=await Hr(t,h,p,`TOPIC: ${p.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[m]=g.text)}));let l=a.map((p,m)=>p!==null?`# Research ${m+1}: ${o[m]?.topic??""}
1456
+ ${p}`:null).filter(p=>p!==null).join(`
1457
+
1458
+ `),c=`${n}:consolidator`,u=await Hr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&V(t,r,n,"error");let p=e.outcomes.error;return p!==void 0?G(t.workflow,p):{kind:"terminal",terminal:K(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),V(t,r,n,"ok"),e.write_back_durable_memory){let p=t.membersByAlias.get(e.consolidator.alias);p!==void 0&&await kt(t,n,p,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.ok)}var Cm,Lm=T(()=>{"use strict";Le();Cm={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=>rN(t,t.state)}});async function nN(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Lo(e.items_from,t),a=aN(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:K(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await oN(t,e,s.id,a,l):await sN(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),V(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:K(t.workflow)}}return G(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function sN(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await Dm(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function oN(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await Dm(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function Dm(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":iN(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function iN(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function aN(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 Mm,Pm=T(()=>{"use strict";Le();Cn();Mm={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=>nN(t,t.state)}});async function lN(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:K(t.workflow)}}let i=Jr(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 kt(t,n,o,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 p=e.outcomes.timeout;return p!==void 0?G(t.workflow,p):{kind:"terminal",terminal:K(t.workflow)}}let f=a.last_operator_input??"";try{let p=await Mn({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let m=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:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:p.violationKind,command_summary:p.summary,message:`State ${n} ran a classified side-effect command (${p.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,m),{kind:"terminal",terminal:K(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,p.text,"waiting_operator"),e.termination.agent_signal!==void 0&&p.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:p.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),V(t,r,n,"done"),e.write_back_durable_memory&&await kt(t,n,o,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(Fm({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:p.text}),{kind:"paused"})}catch(p){let m=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,m),{kind:"terminal",terminal:K(t.workflow)}}}return{kind:"paused"}}let l=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Ue(e.agent.initial_prompt_template,t,n),d=i?`${i}
1459
+
1460
+ ${u}`:u;try{let f=await Mn({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let p=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id: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,p),{kind:"terminal",terminal:K(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await kt(t,n,o,e.write_back_durable_memory),G(t.workflow,e.outcomes.done)):(Fm({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let p=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,p),{kind:"terminal",terminal:K(t.workflow)}}}function Fm(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=M();e.dal.setRunPausedState(e.run_id,`${Ln}${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(cN({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function cN(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=uN(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:dN(o,3),paused_at:i,created_run_inputs:Ft(e.job.payload)}}function uN(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function dN(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 Um,Wm=T(()=>{"use strict";gn();Le();Um={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=>lN(t,t.state)}});async function fN(t,e){let r=t.stateId,n=t.displayName,s=jm(t,e.over);if(s===null){let d=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?G(t.workflow,f):{kind:"terminal",terminal:K(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:K(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],p=`${n}[${d}]`,m=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(p,o,{iteration:{item:f,index:d}})}finally{t.iteration=m}if(h.kind==="paused"||h.kind==="escalate")return h;let g=pN(t.outcomes[p]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),V(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?G(t.workflow,d):{kind:"terminal",terminal:K(t.workflow)}}return G(t.workflow,e.outcomes.ok)}function pN(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Bm,qm=T(()=>{"use strict";Le();Bm={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>fN(t,t.state)}});import{createHash as mN}from"node:crypto";import{existsSync as _N,mkdirSync as hN,readFileSync as gN,writeFileSync as wN}from"node:fs";import{dirname as yN,isAbsolute as Jm,normalize as EN,resolve as Dn}from"node:path";import{Document as bN,ExternalHyperlink as TN,HeadingLevel as Xr,LevelFormat as SN,Packer as kN,Paragraph as st,Table as vN,TableCell as IN,TableRow as jN,TextRun as ot,WidthType as NN}from"docx";import{marked as $N}from"marked";async function xN(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await RN(t,e,n),i=await AN(t,e),a=await ON(t,e.title),l=await PN(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return hN(yN(i),{recursive:!0}),wN(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:mN("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),V(t,r,n,{output_path:i,path:i,bytes:l.length}),G(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),V(t,r,n,{error:i}),G(t.workflow,e.outcomes?.error??"@terminal:error")}}async function RN(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 Ue(e.markdown_source,t,r)).trim(),o=(n.length===0?DN(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=LN(t.project.local_path,o);if(i!==null){if(!_N(i))throw new Error(`markdown_source file not found: ${i}`);return Po(gN(i,"utf8"))}return Po(o)}async function AN(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ue(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=CN(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function ON(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ue(e,t,t.stateId)).trim();return r.length===0?null:r}function CN(t,e){let r=Dn(t);return EN(Jm(e)?Dn(e):Dn(r,e))}function LN(t,e){return MN(e)?Jm(e)?Dn(e):Dn(t,e):null}function MN(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function DN(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Po(s);let o=t.dal.query(`SELECT sa.content
1461
+ FROM step_artifact sa
1462
+ JOIN step s ON s.id = sa.step_id
1463
+ WHERE s.run_id = ?
1464
+ AND s.state_name LIKE ?
1465
+ AND sa.content IS NOT NULL
1466
+ ORDER BY sa.id DESC
1467
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Po(o[0].content)}function Po(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function PN(t,e){let r=Gm($N.lexer(t,{gfm:!0})),n=new bN({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:SN.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new st("")]:r}]});return kN.toBuffer(n)}function Gm(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new st({heading:JN(r.depth),children:Wt(Ut(r))}));break;case"paragraph":e.push(new st({children:Wt(Ut(r))}));break;case"text":e.push(new st({children:Ut(r).length===0?[new ot(r.text)]:Wt(Ut(r))}));break;case"blockquote":e.push(...Gm(Ut(r)).map(n=>n instanceof st?n:new st({children:[new ot(r.text)]})));break;case"list":BN(r)&&e.push(...FN(r));break;case"table":qN(r)&&e.push(UN(r));break;case"code":HN(r)&&e.push(...WN(r));break;case"hr":e.push(new st(""));break;case"html":r.text.trim().length>0&&e.push(new st({children:[new ot(r.text)]}));break;default:break}return e}function Wt(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new ot({text:n.text,...Yl(e)}));break;case"strong":r.push(...Wt(Ut(n),{...e,bold:!0}));break;case"em":r.push(...Wt(Ut(n),{...e,italics:!0}));break;case"codespan":r.push(new ot({text:n.text,...Yl({...e,code:!0})}));break;case"link":r.push(new TN({link:n.href,children:Wt(Ut(n),{...e})}));break;case"br":r.push(new ot({text:"",break:1}));break;case"image":r.push(new ot({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new ot({text:n.text,strike:!0}));break;default:r.push(new ot({text:n.raw,...Yl(e)}));break}return r.length===0?[new ot("")]:r}function Yl(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function FN(t){return t.items.map(e=>new st({children:Wt(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Hm(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Hm(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Hm(t){return t.task?`[${t.checked?"x":" "}] `:""}function UN(t){let e=[t.header,...t.rows].map(r=>new jN({children:r.map(n=>new IN({children:[new st({children:Wt(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new vN({width:{size:100,type:NN.PERCENTAGE},rows:e})}function WN(t){return t.text.split(`
1468
+ `).map(r=>new st({children:[new ot({text:r.length===0?" ":r,font:"Courier New"})]}))}function Ut(t){let e=t.tokens;return Array.isArray(e)?e:[]}function BN(t){return t.type==="list"&&Array.isArray(t.items)}function qN(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function HN(t){return t.type==="code"&&typeof t.text=="string"}function JN(t){switch(t){case 1:return Xr.HEADING_1;case 2:return Xr.HEADING_2;case 3:return Xr.HEADING_3;case 4:return Xr.HEADING_4;case 5:return Xr.HEADING_5;default:return Xr.HEADING_6}}var Xm,Vm=T(()=>{"use strict";Le();Xm={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=>xN(t,t.state)}});import{createHash as XN}from"node:crypto";import{existsSync as GN,mkdirSync as VN,readFileSync as Ym,statSync as YN}from"node:fs";import{dirname as KN,isAbsolute as Km,normalize as zN,resolve as Pn}from"node:path";import ZN from"exceljs";import{marked as QN}from"marked";async function e$(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await t$(t,e),i=r$(e.input_format),a=await n$(t,e),l=await s$(t,e.title),c=i==="markdown"?p$(o):l$(o);await m$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=YN(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=XN("sha256").update(Ym(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),V(t,r,n,{output_path:a,path:a,bytes:u}),G(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),V(t,r,n,{error:i}),G(t.workflow,e.outcomes?.error??"@terminal:error")}}async function t$(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ue(e.source,t,t.stateId)).trim(),n=i$(t.project.local_path,r);if(n!==null){if(!GN(n))throw new Error(`source file not found: ${n}`);return Ym(n,"utf8")}return r}function r$(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function n$(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ue(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=o$(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function s$(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ue(e,t,t.stateId)).trim();return r.length===0?null:r}function o$(t,e){let r=Pn(t);return zN(Km(e)?Pn(e):Pn(r,e))}function i$(t,e){return a$(e)?Km(e)?Pn(e):Pn(t,e):null}function a$(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function l$(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(!Fo(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>c$(r,n))}function c$(t,e){if(!Fo(t))throw new Error(`sheets[${e}] must be an object`);let r=u$(t.headers,`sheets[${e}].headers`),n=d$(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:f$(t.styles)}}function u$(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 d$(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function f$(t){if(!Fo(t)||!Fo(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 p$(t){let e=QN.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(y$(s)){n=s.text;continue}E$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function m$(t){VN(KN(t.outputPath),{recursive:!0});let e=new ZN.Workbook;e.creator="lmctl",e.created=new Date,e.modified=new Date,e.title=t.title;let r=new Set;for(let n of t.sheets){let s=e.addWorksheet(h$(n.name,r));if(n.headers.length>0){let o=s.addRow(n.headers);o.font={bold:n.headerStyle?.bold??!0};let i=w$(n.headerStyle?.fill);i!==null&&o.eachCell(a=>{a.fill={type:"pattern",pattern:"solid",fgColor:{argb:i}}})}for(let o of n.rows)s.addRow(o);_$(s,n)}await e.xlsx.writeFile(t.outputPath)}function _$(t,e){let r=Math.max(e.headers.length,...e.rows.map(n=>n.length),1);for(let n=1;n<=r;n+=1){let s=[e.headers[n-1],...e.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));t.getColumn(n).width=o}}function h$(t,e){let r=g$(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function g$(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function w$(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`FF${e.toUpperCase()}`:null}function y$(t){return t.type==="heading"&&typeof t.text=="string"}function E$(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Fo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var zm,Zm=T(()=>{"use strict";Le();zm={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=>e$(t,t.state)}});import{spawnSync as b$}from"node:child_process";async function S$(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(b$("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let m=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(m.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:K(t.workflow)}}let o=Jr(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let p=`${n}:coder[${f}]`,m=await Hr(t,p,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1469
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=hm(m.text);if(g!==null){let _=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(m.outcome===null){let g=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,m.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${m.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let E=Object.keys(e.outcomes_from_stance),v=On(m.text,E);if(v.outcome===null){let N=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(N.id,null,`unhandled_stance:${v.reason}`),{kind:"escalate",token:"",reason:`no_stance:${v.reason}`}}let k=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,v.outcome,"outcomes_from_stance"),V(t,r,n,v.outcome),G(t.workflow,e.outcomes_from_stance[v.outcome])}let g=On(m.text,T$);if(g.outcome!==null){let E=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(E.id,g.outcome,"default_failure_stance"),V(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),V(t,r,n,"approve"),e.write_back_durable_memory){let E=t.membersByAlias.get(e.coder.alias);E!==void 0&&await kt(t,n,E,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Hr(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1470
+ ${m.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=J(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),V(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await kt(t,n,_,e.write_back_durable_memory)}return G(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1471
+
1472
+ `),e.loop_feedback_artifact!==void 0){let g=J(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),V(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?G(t.workflow,d):{kind:"terminal",terminal:K(t.workflow)}}var T$,Qm,e_=T(()=>{"use strict";ql();Le();T$=["blocked","failed","aborted"],Qm={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=>S$(t,t.state)}});import{spawnSync as k$}from"node:child_process";async function v$(t,e){let r=t.stateId,n=t.displayName,s=await Ue(e.command,t,n),o=Gl(t,n),i=Nm(s);if(i.matched&&!o){let h=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:K(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=k$("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:K(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Vl(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:K(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let p=String(c.status),m=e.outcomes_from_exit[p]??e.outcomes_from_exit.default;return m===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:p}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${p}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,p,`exit=${c.status}`),V(t,r,n,p),G(t.workflow,m))}var t_,r_=T(()=>{"use strict";Le();t_={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=>v$(t,t.state)}});async function I$(t,e){let r=t.stateId,n=t.displayName,s=J(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:K(t.workflow)};let i=xe(o.definition),a=await j$(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:K(t.workflow)};V(t,r,n,N$(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:K(t.workflow)}:G(t.workflow,u)}async function j$(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await bm(s,t);r[n]=o===s?await Lo(s,t):o}return r}function N$(t,e,r){let n={};for(let s of r)n[s.name]=$$(t,e,s);return n}function $$(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=x$(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function x$(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 n_,s_=T(()=>{"use strict";Wr();Le();Cn();n_={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=>I$(t,t.state)}});function R$(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=J(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),V(t,r,n,s),{kind:"terminal",terminal:s}}var o_,i_=T(()=>{"use strict";Le();o_={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=>R$(t,t.state)}});async function A$(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=O$(t.cursor),a=o.filter(C$).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function O$(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function C$(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 a_,l_=T(()=>{"use strict";a_={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=>A$(t)}});async function L$(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 c_,u_=T(()=>{"use strict";c_={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=>L$(t)}});function d_(t){t.register(xm),t.register(Qm),t.register(Cm),t.register(Um),t.register(Bm),t.register(Xm),t.register(zm),t.register(t_),t.register(Am),t.register(Mm),t.register(n_),t.register(o_),t.register(c_),t.register(a_)}var f_=T(()=>{"use strict";Rm();Om();Lm();Pm();Wm();qm();Vm();Zm();e_();r_();s_();i_();l_();u_()});function Wo(){return Uo===null&&(Uo=new Kl,d_(Uo)),Uo}var M$,Kl,Uo,zl=T(()=>{"use strict";f_();M$={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"},Kl=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:M$[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Uo=null});async function __(t){E_(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=P$(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Fn(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=cm(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(p=>[p.alias,p]));if(Fn(n)){let p=Zl({dal:t.dal,workflow:qo(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Ft(t.job.payload)??{},team_id:t.team.id}),m=await g_(n,p,i.current_state??n.entry_step_id);return m_(t.dal,r.id,i.id,n.name,m),m}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Zl({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Ft(t.job.payload)??{},team_id:t.team.id}),f=await h_(d,i.current_state??n.start_at);return m_(t.dal,r.id,i.id,n.name,f),f}function m_(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),m=(f.terminals??{})[o];if(m!==void 0&&typeof m.kind=="string"&&(m.kind==="success"||m.kind==="failure"||m.kind==="neutral")&&(i=m.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Zl(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Ql(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{E_(n);let o=Fn(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Zl({dal:t.dal,workflow:Fn(n)?qo(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Fn(n)?g_(n,a,i.current_state??n.entry_step_id):h_(a,i.current_state??n.start_at)}};return e}async function h_(t,e){let r=e;if(r.startsWith(Ln))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 vt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=Bo(t,K(t.workflow));if(l.kind==="paused")return Re(t);if(l.kind==="escalate")return Ve(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Re(t);if(l.kind==="terminal")return vt(t,l.terminal);r=l.state;continue}let i,a=y_(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===cn)return vt(t,Vi);let c=o.outcomes?.[a];i=c!==void 0?G(t.workflow,c):Ve(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Ql(t,r,o);if(i.kind==="paused")return Re(t);if(i.kind==="escalate")return Ve(t,{id:r,name:r,type:o.type},i.token,i.reason),Re(t);if(i.kind==="terminal"){let l=Bo(t,i.terminal);if(l.kind==="paused")return Re(t);if(l.kind==="escalate")return Ve(t,{id:r,name:r,type:o.type},l.token,l.reason),Re(t);if(l.kind==="terminal")return vt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Bo(t,K(t.workflow));return n.kind==="terminal"?vt(t,n.terminal):vt(t,K(t.workflow))}async function g_(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return Ve(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Re(e);let l=y_(e,a.id);if(l!==null){let p=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(p.id,l,"escalation_resume"),V(e,a.id,a.name,l),l===cn)return vt(e,Vi);let m=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 Ve(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:m}),Re(e);o=h;continue}let c=await D$(e,t,a);if(c.kind==="paused")return Re(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return Ve(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Re(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let p=e.workflow;e.workflow=qo(t,a);try{let m=Bo(e,d);if(m.kind==="paused")return Re(e);if(m.kind==="escalate")return Ve(e,{id:a.id,name:a.name,type:a.type},m.token,m.reason),Re(e);if(m.kind==="terminal")return vt(e,m.terminal);let h=s.get(m.state);if(h===void 0)return Ve(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${m.state}'`),Re(e);o=h.id;continue}finally{e.workflow=p}}if(gr(d))return Ve(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Re(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return Ve(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Re(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),vt(e,"aborted")}async function D$(t,e,r){let n=w_(e,r),s=t.workflow;t.workflow=qo(e,r);try{return await Ql(t,r.id,n,r.name)}finally{t.workflow=s}}function w_(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Ql(t,e,r,n){let s=Wo().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?W$(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Im(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function P$(t,e){try{let r=JSON.parse(t);if(U$(r)&&r.definition_schema_version===3)return ut.parse(r)}catch{return e}return e}function Fn(t){return t.definition_schema_version===3}function qo(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=w_(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:F$(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 F$(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function U$(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function W$(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function vt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{om(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Re(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function y_(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function Bo(t,e){if(!B$(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&&q$(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function B$(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function q$(t,e,r){let n=H$(t),s=r.capture_evidence&&n!==null?J$(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 H$(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 J$(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 E_(t){if(!p_.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${p_.join(", ")}`)}var p_,b_=T(()=>{"use strict";Fr();im();um();Le();zl();un();p_=[1,2,3]});import{readFileSync as X$,readdirSync as G$}from"node:fs";import{basename as V$,join as Y$,resolve as K$}from"node:path";function k_(t={}){let e=K$(t.workflowsDir??"workflows"),r=G$(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=>z$(Y$(e,n)))}}function z$(t){let e=V$(t);try{let r=X$(t,"utf8"),n=xe(r);return j_(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:N_(r)}}}function v_(t,e){try{let r=xe(e);return j_(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:N_(r)}}}function I_(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1473
+ `)}
1474
+ `}function j_(t,e){let r=Q$(e),n=ex(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=Z$(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 Z$(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function Q$(t){return ec(t)?t.entry_step_id:t.start_at}function ex(t){return ec(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ec(t){return t.definition_schema_version===3}function N_(t){return t instanceof St?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 $_(t){let e=new Set;if(ec(t))for(let r of t.steps){let n=r.members??{};T_(n,e)}else for(let r of Object.values(t.states))T_(r,e);return[...e].sort()}function T_(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=S_(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=S_(i);a!==null&&e.add(a)}}}function S_(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ho=T(()=>{"use strict";Wr()});function tx({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,Jo)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=rx(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Un}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Jo,source_ref:Un,payload:JSON.stringify({kind:Un,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function rx(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1475
+ FROM run r
1476
+ JOIN job j ON j.id = r.job_id
1477
+ WHERE j.project_id = ?
1478
+ AND r.terminal_state IS NOT NULL
1479
+ ${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 x_(t){for(let e of nx)try{e(t)}catch{}}var Jo,Un,nx,tc=T(()=>{"use strict";Jo="memory_policy",Un="memory_consolidation_request";nx=[tx]});var M_={};le(M_,{getOrInsertConsolidationWorkflow:()=>A_,runJobById:()=>Xo,runOnce:()=>fr,startWorker:()=>lx});import{createHash as sx}from"node:crypto";import{readFileSync as ox}from"node:fs";import{pathToFileURL as ix}from"node:url";function A_(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ao({swallow:!0});let n=lo(e);if(n===null)return null;let s=ox(n,"utf8"),o=xe(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:ix(n).href,source_sha256:sx("sha256").update(s).digest("hex")})}catch{return null}}async function fr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??R_,evaluator:n=>C_(t.dal,n)}),r===null?null:await O_(t.dal,r,e)}catch(n){if(r!==null)return Bt(t.dal,r,"worker_run_failed",dr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Go(dr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Xo(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??R_,evaluator:s=>C_(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await O_(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Bt(t.dal,r,"worker_run_failed",dr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Go(dr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function O_(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Bt(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Jo&&e.source_ref===Un,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=A_(t):i=L_(t,e,n),i===null)return Bt(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Bt(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=xe(i.definition)}catch(d){return Bt(t,e,"worker_workflow_invalid",dr(d),r,n)}let u=cx(c,l);if(u.length>0)return Bt(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await __({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return Bt(t,e,"worker_run_failed",dr(d),r,n,a)}}function C_(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=L_(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=xe(n.definition)}catch{s=null}return ko({workflow:s,job:e,project:r})}function L_(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function lx(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await fr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Go(dr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??ax))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Bt(t,e,r,n,s,o,i){let a=Go(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function dr(t){return t instanceof Error?t.message:String(t)}function Go(t){return t.length>4096?t.slice(0,4096):t}function cx(t,e){let r=$_(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var R_,ax,Wn=T(()=>{"use strict";co();b_();Wr();Ho();kl();tc();R_=6e5,ax=5e3});import{existsSync as ux,readFileSync as dx}from"node:fs";import{marked as fx}from"marked";function U_(t,e){t.get("/layman",r=>r.html(ve("Layman Home",px(e.dal)))),t.get("/api/layman",r=>r.json(H_(e.dal))),t.get("/layman/start/:workflow",r=>{let n=F_(r);return n===null?r.notFound():r.html(ve(`Start ${Gr(n)}`,hx(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=F_(r);return n===null?r.notFound():n==="newspaper"?D_(r,e.dal):gx(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=sr(e.dal,Vo(r,"id"));return n===null?r.notFound():r.html(ve(`Run ${n.id}`,Ex(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=sr(e.dal,Vo(r,"id"));return n===null?r.notFound():r.json(Rx(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>Tx(r,e.dal)),t.get("/layman/newspaper",r=>r.html(ve("Newspaper Subscriptions",$x(e.dal)))),t.post("/layman/newspaper",r=>D_(r,e.dal)),t.delete("/layman/newspaper/:id",r=>P_(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>P_(r,e.dal))}function px(t){let e=H_(t);return`<section class="layman-home">
1480
+ <h1>Welcome</h1>
1481
+ <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1482
+ <div class="grid">${Yo.map(mx).join("")}</div>
1483
+ <h2>Recent Activity</h2>
1484
+ ${_x(e.recent_runs)}
1485
+ <section class="metric">
1486
+ <h2>Newspaper</h2>
1487
+ <p>You have <strong>${b(e.newspaper_subscriptions)}</strong> daily digests configured.</p>
1488
+ <p><a href="/layman/newspaper">Manage newspaper subscriptions</a></p>
1489
+ </section>
1490
+ </section>`}function mx(t){return`<article class="metric workflow-card">
1491
+ <h2>${b(t.title)}</h2>
1492
+ <p>${b(t.description)}</p>
1493
+ <p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
1494
+ </article>`}function _x(t){return ue(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${b(e.id)}</a>`,b(Gr(e.workflow_name)),b(e.terminal_state??e.current_state??"queued"),b(e.started_at)]))}function hx(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${b(Gr(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${b(Gr(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=W_(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1495
+ <form method="post" action="/layman/start/info-qa">
1496
+ ${s}
1497
+ <label>Ask anything<textarea name="question" rows="8" required></textarea></label>
1498
+ <label>Optional output path<input name="output_path" placeholder="answers/question.md"></label>
1499
+ <button type="submit">Start Q&amp;A</button>
1500
+ </form>`:e==="document-creation"?`<h1>Create a Document</h1>
1501
+ <form method="post" action="/layman/start/document-creation">
1502
+ ${s}
1503
+ <label>What would you like to write?<textarea name="task_description" rows="8" required></textarea></label>
1504
+ <label>Slug<input name="slug" placeholder="my-document" required></label>
1505
+ <label>Output directory<input name="output_dir" value="drafts"></label>
1506
+ <button type="submit">Start Document Wizard</button>
1507
+ </form>`:q_(n,"/layman/start/newspaper")}function W_(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${b(e.id)}">${b(e.name)}</option>`).join("")}</select></label>`}async function gx(t,e,r){let n=await t.req.parseBody(),s=G_(e,n);if(s===null)return t.html(ve("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(ve("Start workflow",`<p class="error">${b(Gr(r))} is not loaded.</p>`),400);let i=r==="info-qa"?wx(n):yx(n);if(typeof i=="string")return t.html(ve("Start workflow",`<p class="error">${b(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await fr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function wx(t){let e=We(t.question).trim();if(e.length===0)return"Enter a question.";let r=We(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function yx(t){let e=We(t.task_description).trim(),r=Px(We(t.slug).trim()),n=We(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 Ex(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${b(Gr(r))}</h1>
1508
+ <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${kx(t,e,r)}`;let s=X_(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${bx(e,s)}`:`${n}<section hx-get="/layman/run/${b(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1509
+ <h2>Running</h2>
1510
+ <p class="muted">Current stage: <strong>${b(e.current_state??"starting")}</strong></p>
1511
+ ${B_(e)}
1512
+ </section>`}function B_(t){let e=t.steps.map(r=>[b(r.id),b(`\u25B6 ${r.state_name}`),b(r.outcome??"running"),b(r.status_detail??"")]);return ue(["step","stage","outcome","detail"],e)}function bx(t,e){return`<section class="metric paused-interactive">
1513
+ <h2>${b(Cx(e.state_name))}</h2>
1514
+ <p class="muted">The agent is waiting for your response.</p>
1515
+ <h3>Agent output</h3>
1516
+ <div class="metric">${ic(e.last_agent_output??"")}</div>
1517
+ <form method="post" action="/layman/run/${b(t.id)}/respond">
1518
+ <input type="hidden" name="step_id" value="${b(e.step_id)}">
1519
+ <label>Your response<textarea name="input" rows="7"></textarea></label>
1520
+ <button type="submit" name="done" value="false">Send response</button>
1521
+ <button type="submit" name="done" value="true">Done with this stage</button>
1522
+ </form>
1523
+ </section>`}async function Tx(t,e){let r=Vo(t,"id"),n=await t.req.parseBody(),s=Number(We(n.step_id)),o=We(n.input),i=We(n.done)==="true";if(!Number.isInteger(s))return t.html(ve("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(Sx(e,a.run.id),await fr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(ve("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function Sx(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(!nc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>nc(i)&&i.name===r.current_state&&typeof i.id=="string");nc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function kx(t,e,r){let n=Lx(e.terminal_state);return`<section class="metric terminal-run">
1524
+ <h2>${n?"Complete":"Stopped"}</h2>
1525
+ <p>Status: <strong>${b(e.terminal_state)}</strong></p>
1526
+ ${n?vx(t,e,r):jx(e)}
1527
+ <h2>Stage Log</h2>
1528
+ ${B_(e)}
1529
+ </section>`}function vx(t,e,r){if(r==="info-qa"){let n=oc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${ic(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return Ix(t,e);if(r==="newspaper"){let n=oc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${ic(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function Ix(t,e){let r=or(t,e.id),n=rc(r,["render_docx"]),s=rc(r,["render_xlsx"]),o=oc(e,["review:coder[0]_transcript","chat_output_md"])??Nx(rc(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1530
+ <pre>${b(Dx(Mx(o??"No preview available."),30))}</pre>
1531
+ <h3>Downloads</h3>
1532
+ ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function jx(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function oc(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function rc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function Nx(t){if(t===null||!ux(t)||!t.endsWith(".md"))return null;try{return dx(t,"utf8")}catch{return null}}function $x(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1533
+ ${xx(J_(t))}
1534
+ <h2>Add Subscription</h2>
1535
+ ${e.length===0?'<p class="error">Create a project before subscribing.</p>':q_(e,"/layman/newspaper")}`}function q_(t,e){return`<form method="post" action="${b(e)}">
1536
+ ${W_(t)}
1537
+ <label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
1538
+ <label>Schedule<select name="schedule">
1539
+ <option value="daily">Daily at 6am</option>
1540
+ <option value="weekly">Weekly Monday</option>
1541
+ <option value="custom">Custom cron</option>
1542
+ </select></label>
1543
+ <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1544
+ <label>Output directory<input name="output_dir" value="digests"></label>
1545
+ <button type="submit">Create subscription</button>
1546
+ </form>`}async function D_(t,e){let r=await t.req.parseBody(),n=G_(e,r);if(n===null)return t.html(ve("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(ve("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=We(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(ve("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:We(r.output_dir).trim()||"digests",schedule:Ox(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function P_(t,e){let r=Vo(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function xx(t){return ue(["id","project","topics","status","action"],t.map(e=>{let r=Fx(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(e.id),b(e.project_name),b(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function H_(t){let e=J_(t);return{workflows:Yo,recent_runs:Ax(t),newspaper_subscriptions:e.length}}function Rx(t,e){let r=X_(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 Ax(t){return t.query(`SELECT r.*, w.name AS workflow_name
1547
+ FROM run r
1548
+ JOIN workflow w ON w.id = r.workflow_id
1549
+ WHERE w.name IN (${sc.map(()=>"?").join(",")})
1550
+ ORDER BY r.id DESC
1551
+ LIMIT 10`,...sc)}function J_(t){return t.query(`SELECT pw.*, p.name AS project_name
1552
+ FROM project_workflow pw
1553
+ JOIN workflow w ON w.id = pw.workflow_id
1554
+ JOIN project p ON p.id = pw.project_id
1555
+ WHERE w.name = ?
1556
+ ORDER BY pw.id DESC`,"newspaper")}function X_(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function G_(t,e){let r=Number(We(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function Ox(t){let e=We(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:We(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function F_(t){let e=t.req.param("workflow");return sc.includes(e)?e:null}function Gr(t){return Yo.find(e=>e.name===t)?.title??t}function Cx(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function ic(t){return fx.parse(t,{async:!1})}function Lx(t){return t==="done"||t==="pr_ready"||t==="merged"}function Mx(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function Dx(t,e){return t.split(`
1557
+ `).slice(0,e).join(`
1558
+ `)}function Px(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function We(t){return typeof t=="string"?t:""}function Fx(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function nc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Vo(t,e){return Number(t.req.param(e))}var Yo,sc,V_=T(()=>{"use strict";Wn();Et();Pl();Yo=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],sc=Yo.map(t=>t.name)});function Y_(t,e){t.get("/mailbox/workspace",r=>Bx(r,e)),t.get("/mailbox/projects",r=>qx(r,e)),t.get("/mailbox/projects/:id",r=>Hx(r,e)),t.post("/mailbox/projects",r=>Jx(r,e)),t.patch("/mailbox/projects/:id",r=>Xx(r,e)),t.delete("/mailbox/projects/:id",r=>Gx(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>Vx(r,e)),t.get("/mailbox/prompts/:id",r=>Yx(r,e))}function Bx(t,e){e.dal.ensureWorkspace({id:Yr,name:ac});let r=K_(e.dal),n={id:Yr,name:ac,created_at:Wx,projects:r};return t.json({workspace:n})}function qx(t,e){return t.json({projects:K_(e.dal)})}function Hx(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(Vr)){let s=lc(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Zo(s)})}let n=Z_(e.dal,r);return n===null?t.json({project:null},404):t.json({project:z_(n)})}async function Jx(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Yr,name:ac});let s=e.dal.insertWebProject({workspace_id:Yr,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:Zo(s)},201)}async function Xx(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(Vr)){let o=lc(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Zo(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function Gx(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(Vr)){let n=lc(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function Vx(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Z_(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${Ux}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await Kx({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${zo}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function Yx(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=zx(e.dal,r);return t.json({result:n})}function K_(t){let e=t.listProjects().map(z_),r=t.listWebProjectsActive(Yr).map(Zo);return[...e,...r].sort(aR)}function z_(t){return{id:`${zo}${t.id}`,workspace_id:Yr,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function Zo(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Vr}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function lc(t,e){if(!e.startsWith(Vr))return null;let r=e.slice(Vr.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Z_(t,e){if(e.startsWith(zo)){let n=e.slice(zo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function Kx(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Il(),Op));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function zx(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=sR(t,o?.team_id??null),a=nR(s),l=oR(n,a,i.length>0),c=iR(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:Zx(t,o.workflow_name),d=u.totalEstimatedMs,f=Q_(r.created_at),p=o?.workflow_name,m=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:Qx(t,s.id),g=eR(s,a,h,u.perStep,i),_=tR(h,u.perStep),E=rR(g,_,d,f,p,m);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Ko(d,f),...E},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Ko(d,f),...E},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Ko(d,f),...E},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Ko(d,f),...E},errors_json:null,duration_ms:c}}function Zx(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function Qx(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function eR(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Q_(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function tR(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function rR(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Q_(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Ko(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function nR(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function sR(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function oR(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function iR(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function aR(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var zo,Vr,Ux,Yr,ac,Wx,eh=T(()=>{"use strict";zo="project:",Vr="web_project:",Ux="prompt:",Yr="default",ac="Default workspace",Wx=new Date(0).toISOString()});import{Buffer as th}from"node:buffer";function rh(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function nh(t){return uR[t]}function sh(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var lR,cR,Qo,uR,cc=T(()=>{"use strict";lR=1e4,cR=256*1024,Qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=rh(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,lR),this.pushByteCap=rh(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,cR),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=th.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${r} bytes=${th.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1559
+ [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1560
+ `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};uR={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function ih(t,e){t.post("/mailbox/terminal/launch",r=>dR(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>fR(r,e)),t.get("/mailbox/terminal/sessions",r=>pR(r,e))}async function dR(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!oh.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=sh(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=nh(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function fR(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!oh.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function pR(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var oh,ah=T(()=>{"use strict";cc();oh=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as mR}from"node:buffer";function gR(t){try{return mR.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function lh(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function ch(t){return wR[t]}function uh(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var _R,hR,ei,wR,uc=T(()=>{"use strict";_R=2e3,hR=64*1024,ei=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=lh(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,_R),this.pushByteCap=lh(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,hR),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=gR(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};wR={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function fh(t,e){t.post("/mailbox/chat/launch",r=>yR(r,e)),t.post("/mailbox/chat/end/:session_id",r=>ER(r,e)),t.get("/mailbox/chat/sessions",r=>bR(r,e))}async function yR(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!dh.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=uh(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ch(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function ER(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!dh.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function bR(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var dh,ph=T(()=>{"use strict";uc();dh=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as TR}from"node:fs";function _h(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return mh(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=TR(e.path,{encoding:"utf8"});return mh(r)}catch{return[]}}function mh(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var hh=T(()=>{"use strict"});function gh(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function ti(t,e){let r=t.query(`SELECT id, kind FROM attention
1561
+ WHERE run_id = ?
1562
+ AND acknowledged_at IS NULL
1563
+ AND requires_user = 1
1564
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ri=T(()=>{"use strict"});function jh(t,e){t.all("/runtime/*",r=>SR(r.req.raw,e))}async function SR(t,e){try{return Response.json(await kR(t,e))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function kR(t,e){let r=new URL(t.url),n=RR(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return dc(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ni(t,n.id,s[2]),vR(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ni(t,n.id,s[2]);let o=yh(e.dal,s[4]);return wh(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return dc(t),e.dal.listTeams().map(o=>xR(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Eh(e.dal,bh(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return Sh(t,n.id,i.context),Th(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Eh(e.dal,bh(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");Sh(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return Th(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ni(t,n.id,s[2]);let o=yh(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return NR(e.dal,o,a),wh(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Bn(t,n.id),e.dal.listWorkflows().map(o=>AR(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Bn(t,n.id);let o=CR(e.dal,s[2]);return OR(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Bn(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return LR(e.dal,o,i).map(l=>vh(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Bn(t,n.id);let o=kh(e.dal,s[2]);return vh(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Bn(t,n.id);let o=kh(e.dal,s[2]),i=DR(e.dal,o);return{runId:hc(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function vR(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Nh(t,e,r))}}function wh(t,e,r){let n=Nh(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:IR(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:jR(t,r)}}function Nh(t,e,r){let n=$h(t,r.id),s=pc(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 IR(t,e){let r=$h(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:pc(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 jR(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 NR(t,e,r){let n=$R(t,e.id);if(n!==null){let s=ti(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=ct(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function $h(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 $R(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 pc(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 yh(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function Eh(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function bh(t){return t.startsWith("team:")?t.slice(5):t}function xR(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Th(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??Ih}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function RR(t){let e=t.workspaceName??on()??Vt.default;return{id:e,name:e}}function dc(t){if(t.headers.get("x-lmctl-workspace-id")!==Ih)throw new se(400,"runtime request requires global-admin workspace identity")}function ni(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function Bn(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function Sh(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");ni(t,e,r.workspaceId);return}dc(t)}function mc(t){return`${Kr}${_c(t.name)}`}function _c(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function hc(t){return`${fc}${t.id}`}function AR(t){let e=si(t.definition);return{id:mc(t),name:t.name,...e.description===null?{}:{description:e.description}}}function OR(t){let e=si(t.definition);return{id:mc(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function si(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function CR(t,e){if(!e.startsWith(Kr))throw new se(404,`template not found: ${e}`);let r=e.slice(Kr.length),n=t.listWorkflows().filter(s=>_c(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function kh(t,e){if(!e.startsWith(fc))throw new se(404,`run not found: ${e}`);let r=e.slice(fc.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function LR(t,e,r){if(r!==null){if(!r.startsWith(Kr))return[];let s=r.slice(Kr.length),o=t.listWorkflows().filter(a=>_c(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function vh(t,e){let r=t.getWorkflow(e.workflow_id),n=pc(e),s=MR(r,e);return{id:hc(e),templateId:r===null?`${Kr}unknown`:mc(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 MR(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]:[si(t.definition).nameToId.get(r)??r]}function DR(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:si(r.definition),s=c=>n.nameToId.get(c)??c,o=hc(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=PR(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let p=a.find(m=>m.id===c.step_id);return p===void 0?void 0:s(p.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let p=JSON.parse(c.payload);p!==null&&typeof p=="object"&&!Array.isArray(p)&&(f={...f,...p})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function PR(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 Ih,Kr,fc,se,xh=T(()=>{"use strict";Be();ri();Et();Ih="global-admin";Kr="template:",fc="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as FR,writeFileSync as UR}from"node:fs";import{randomUUID as Rh}from"node:crypto";import{dirname as WR,resolve as oi,sep as Ah}from"node:path";async function Ch(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(!XR(n))return t.text("missing image file",400);if(n.size>BR)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=GR(s);if(o===null||!(o in Oh))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=qR(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?oi(JR()):oi(i.local_path),l=oi(a,"uploads",Rh()),c=oi(l,`${Rh()}${Oh[o]}`);if(!HR(c,a))return t.text("invalid upload path",400);FR(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);UR(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function qR(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function HR(t,e){let r=e.endsWith(Ah)?e:`${e}${Ah}`;return t.startsWith(r)}function JR(){return WR(de())}function XR(t){return typeof File<"u"&&t instanceof File}function GR(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 BR,Oh,Lh=T(()=>{"use strict";Be();BR=10*1024*1024,Oh={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ii}from"node:fs";import{basename as VR,dirname as YR,extname as KR,isAbsolute as zR,join as ZR,relative as QR}from"node:path";import{fileURLToPath as eA}from"node:url";import{Hono as tA}from"hono";import{serveStatic as dt}from"@hono/node-server/serve-static";function qh(t){let e=new tA,r=[],n=rA();if(n!==null){let s=nA();t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,dt({root:n})),e.use("/vendor/*",s,dt({root:n})),e.use("/src/*",s,dt({root:n})),e.get("/",s,dt({root:n,path:"index.html"})),e.get("/admin",s,dt({root:n,path:"index.html"})),e.get("/admin/*",s,dt({root:n,path:"index.html"})),e.get("/terminal",s,dt({root:n,path:"index.html"})),e.get("/terminal/*",s,dt({root:n,path:"index.html"})),e.get("/chat",s,dt({root:n,path:"index.html"})),e.get("/chat/*",s,dt({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("*",Up()),e.get("/login",s=>s.html(ve("Login",`
1565
+ <h1>Login</h1>
1566
+ <form method="post" action="/login">
1567
+ <label>Token <input name="token" type="password"></label>
1568
+ <button type="submit">Login</button>
1569
+ </form>
1570
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Bp(i)?(Al(s,i),s.redirect("/",302)):s.html(ve("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(qp(s),s.redirect("/login",302))),U_(e,{dal:t.dal}),jh(e,{dal:t.dal}),Y_(e,{dal:t.dal}),ih(e,{terminalSessionManager:t.terminalSessionManager}),fh(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=yn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),p=f.filter(m=>m.state!=="idle");if(p.length>0)return{ok:!1,nonIdle:p.map(m=>({alias:m.alias,state:m.state}))};for(let m of f)t.dal.setMemberState(m.id,"in_chat","refreshing");return a=f.map(m=>({id:m.id,alias:m.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(p=>`${p.alias}:${p.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await Pa(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(p){let m=p instanceof Error?p.message:String(p);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${m}`),d.push({alias:f.alias,error:m})}return U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(p=>b(p)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(p=>`${b(p.alias)}: ${b(p.error)}`).join(", ")}]`:""}</p>`)}),Kp(e,{dal:t.dal}),nm(e,{dal:t.dal}),e.get("/api/status",s=>U(s,Us(t.dal),uA)),e.get("/api/projects",s=>U(s,Ws(t.dal),dA)),e.get("/api/teams",s=>U(s,df(t.dal),mA)),e.get("/api/workflows",s=>U(s,Bs(t.dal),_A)),e.get("/api/workflows/verify",s=>{let o=k_();return s.req.header("accept")?.includes("text/plain")?s.text(I_(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,ff(t.dal,{status:s.req.query("status")}),hA)),e.post("/api/uploads",s=>Ch(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=qs(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return U(s,d,ae)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Wn(),M_)),i=qs(t.dal,Q(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():U(s,o,ae)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),fA)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await zr(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{Dt(u)}catch{return s.text("invalid condition",400)}let d=iA(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,p=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return U(s,p,ae)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(Q(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(Q(s,"id"))?U(s,{removed:!0},ae):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!0);return o===null?s.notFound():U(s,o,ae)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!1);return o===null?s.notFound():U(s,o,ae)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Ph(s.req.query("status"),aA);if(typeof i=="string")return s.text(i,400);let a=Ph(s.req.query("severity"),Jh);return typeof a=="string"?s.text(a,400):U(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),pA)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await zr(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=lA(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=cA(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return U(s,d,ae)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(Q(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/issues/:id/claim",async s=>{let o=Q(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await zr(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):U(s,c,ae)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await zr(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):U(s,l,ae)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await zr(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return U(s,t.dal.closeIssue(Q(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ae)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await zr(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return U(s,t.dal.reopenIssue(Q(s,"id"),a),ae)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return U(s,{...o,owner:a,repo:l},ae)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=Q(s,"run_id"),i=s.req.query("kind"),a=or(t.dal,o,i);return U(s,a,ae)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=Q(s,"run_id"),i=s.req.param("kind"),a=or(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,ae);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=sA(l.path);if(oA(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),m=VR(l.path);return s.body(p,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${m}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return U(s,l,ae)}return U(s,l,ae)}),e.get("/api/runs",s=>U(s,$r(t.dal,{limit:gc(s,"limit")??100}),gA)),e.get("/api/runs/:id",s=>{let o=sr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,wA)}),e.get("/api/runs/:id/where",s=>{let o=xr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Js(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Xs(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Gs(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(Q(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ai(t.daemon),U(s,i,Fh)):U(s,i,Fh,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=Q(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ai(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Mh(s,t.dal,o=>U(s,o,EA))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=hf(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():Hh(s)?s.html(`<pre>${b(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Mh(s,t.dal,o=>{let i=_h(o);return U(s,i,a=>ue(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>U(s,gf(t.dal,{type:s.req.query("type")}),bA)),e.get("/api/external-signals",s=>U(s,wf(t.dal,{unhandled:s.req.query("unhandled")==="true"}),TA)),e.get("/api/attentions",s=>U(s,Lt(t.dal,{unacked:s.req.query("unacked")==="true"}),SA)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(Q(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${b(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Hs(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${ue(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=ct(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,ae)}),e.post("/api/escalations/:id/respond",async s=>{let o=Q(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let p=await s.req.json();typeof p.input=="string"&&(i=p.input),p.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let p=await s.req.parseBody().catch(()=>({}));typeof p.input=="string"&&(i=p.input),(p.done==="true"||p.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=ct(t.dal,o);if(c===null)return s.notFound();let u=Lt(t.dal).find(p=>p.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let p=t.dal.resumeEscalation(o,i);if(!p.resumed)return s.json({ok:!1,reason:p.reason},400);ai(t.daemon);let m=Lt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:p.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:m?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return ai(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=pf(t.dal,{status:i,pr_url:o});return U(s,a,kA)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=mf(t.dal,o);return i===null?s.notFound():U(s,i,vA)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Uh)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=yn(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Uh)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=yn(s.req.param("team_name"));try{let i=await nf(t.dal,o,s.req.param("alias"));return U(s,i,a=>Wh("compacted",a.row))}catch(i){if(i instanceof wn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=yn(s.req.param("team_name")),i=await Pa(t.dal,o,s.req.param("alias"));return U(s,i,a=>Wh(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,Bh)),e.post("/api/intake/scan",async s=>(r=await Br(t.dal),U(s,r,Bh))),e.get("/api/stats/run-throughput",s=>U(s,bf(t.dal),IA)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,jA)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},ae);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},ae)}),e.get("/metrics/:project_id",s=>{let o=Q(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Ja(t.dal,o),l=Xa(t.dal,{project_id:o});return s.html(ve(`Metrics \u2014 ${i.name}`,NA(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=gc(s,"since_days");return s.json(Ja(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=gc(s,"since_days");return s.json(Xa(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(Q(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function Mh(t,e,r){let n=Ha(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function ai(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return Hh(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 Hh(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function rA(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ii(`${t}/index.html`)?Dh(t):null;let e="src/serve/webui-dist";if(ii(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ii(`${r}/index.html`))return r;let n=ZR(YR(eA(import.meta.url)),"webui-dist");return ii(`${n}/index.html`)?Dh(n):null}function Dh(t){if(!zR(t))return t;let e=QR(process.cwd(),t);return e.length===0?".":e}function nA(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function gc(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 sA(t){switch(KR(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 oA(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function zr(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function iA(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 Ph(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 lA(t){if(t!=null)return typeof t=="string"&&Jh.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function cA(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 uA(t){return`<h1>Status</h1><div class="grid">
1571
+ <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1572
+ <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1573
+ <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
1574
+ <div class="metric"><strong>${t.attentions.unacked}</strong><br>unacked attentions</div>
1575
+ </div><p class="muted">generated ${b(t.generated_at)}</p>`}function dA(t){return`<h1>Projects</h1>${ue(["id","name","workflow","team","path"],t.map(e=>[b(e.id),b(e.name),b(e.workflow_name),b(e.team_id),b(e.local_path)]))}`}function fA(t){return`<h1>Project Workflows</h1>${ue(["id","workflow","condition","priority","enabled"],t.map(e=>[b(e.id),b(e.workflow_id),b(e.condition),b(e.priority),b(e.enabled)]))}`}function pA(t){return`<h1>Issues</h1>${ue(["id","status","severity","title","ai test"],t.map(e=>[b(e.id),b(e.status),b(e.severity),b(e.title),b(e.ai_test_path)]))}`}function mA(t){return`<h1>Teams</h1>${ue(["id","name","members"],t.map(e=>[b(e.id),b(e.name),b(e.members.map(r=>r.alias).join(", "))]))}`}function _A(t){return`<h1>Workflows</h1>${ue(["id","name","version"],t.map(e=>[b(e.id),`<a href="/workflows/${encodeURIComponent(e.name)}">${b(e.name)}</a>`,b(e.version)]))}`}function hA(t){return`<h1>Jobs</h1>${ue(["id","status","source","source_ref","run"],t.map(e=>[b(e.id),b(e.status),b(e.source),b(e.source_ref),b(e.run_id)]))}`}function gA(t){return`<h1>Runs</h1>${ue(["id","job","current","terminal","started"],t.map(e=>[`<a href="/runs/${e.id}">${b(e.id)}</a>`,b(e.job_id),b(e.current_state),b(e.terminal_state),b(e.started_at)]))}`}function wA(t){let e=yA(t);return`<h1>Run ${b(t.id)}</h1>
1576
+ ${ae({id:t.id,terminal_state:t.terminal_state,current_state:t.current_state,job_id:t.job_id})}
1577
+ ${e}
1578
+ <h2>Steps</h2>
1579
+ ${ue(["id","state","outcome","detail"],t.steps.map(r=>[`<span hx-get="/api/runs/${t.id}/steps/${r.id}" hx-target="#step-${r.id}" hx-swap="innerHTML">${b(r.id)}</span><div id="step-${r.id}"></div>`,b(r.state_name),b(r.outcome),b(r.status_detail)]))}`}function yA(t){let e="__paused__:";if(typeof t.current_state!="string"||!t.current_state.startsWith(e)||t.workflow===null)return"";let r=t.current_state.slice(e.length),n;try{n=JSON.parse(t.workflow.definition)}catch{return`<section class="pause"><h2>Paused at ${b(r)}</h2><p>(workflow definition unparseable)</p></section>`}let s=n.states?.[r],o=s?.schema?.outcomes??[];if(o.length===0)return`<section class="pause"><h2>Paused at ${b(r)}</h2><p>(state has no declared outcomes)</p></section>`;let i=typeof s?.prompt=="string"?s.prompt:"",l=[...t.steps].reverse().find(f=>f.state_name===r)?.artifacts.find(f=>f.kind==="pause_context"),c="";if(l?.content!==null&&l?.content!==void 0)try{let f=JSON.parse(l.content);typeof f.prompt=="string"&&(c=f.prompt)}catch{}let u=c!==""?c:i,d=o.map((f,p)=>`<label class="pause-outcome"><input type="radio" name="outcome" value="${b(f)}"${p===0?" checked":""}/> <code>${b(f)}</code></label>`).join(" ");return`<section class="pause" id="pause-section" style="border:2px solid #d28e00;background:#fff8e6;padding:1em;margin:1em 0;">
1580
+ <h2 style="margin-top:0;">\u2605 Paused at <code>${b(r)}</code> \u2014 operator decision required</h2>
1581
+ ${u!==""?`<blockquote style="border-left:3px solid #888;padding-left:0.8em;margin-left:0;color:#444;white-space:pre-wrap;">${b(u)}</blockquote>`:""}
1582
+ <form hx-post="/api/runs/${b(t.id)}/resume" hx-target="#pause-result" hx-swap="innerHTML">
1583
+ <fieldset style="border:none;padding:0;margin:0;">
1584
+ <legend style="font-weight:bold;">Choose an outcome:</legend>
1585
+ <div style="display:flex;gap:1.5em;flex-wrap:wrap;margin:0.5em 0;">${d}</div>
1586
+ <button type="submit" name="outcome" hx-include="closest form" style="background:#d28e00;color:white;border:none;padding:0.5em 1em;font-weight:bold;cursor:pointer;">Submit outcome &amp; resume run</button>
1587
+ </fieldset>
1588
+ </form>
1589
+ <div id="pause-result" style="margin-top:0.6em;"></div>
1590
+ </section>`}function EA(t){return`<section><h3>${b(t.state_name)}</h3>${ae(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Fh(t){return t.resumed?`<p>resumed run ${b(t.run.id)}</p>`:`<p>resume failed: ${b(t.reason)}</p>`}function bA(t){return`<h1>External Objects</h1>${ue(["id","type","provider","external_id","status","url"],t.map(e=>[b(e.id),b(e.type),b(e.provider),b(e.external_id),b(e.status),b(e.url)]))}`}function TA(t){return`<h1>External Signals</h1>${ue(["id","object","kind","handled"],t.map(e=>[b(e.id),b(e.object_id),b(e.kind),b(e.handled_at)]))}`}function SA(t){let e=`<style>
1591
+ @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1592
+ tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1593
+ tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
1594
+ </style>`,r=t.map(n=>{let s=(n.requires_user??0)===1&&n.acknowledged_at===null,o=n.run_id!==null?`<a href="/runs/${b(n.run_id)}">${b(n.id)}</a>`:b(n.id),i=n.acknowledged_at===null?`<button hx-post="/api/attentions/${n.id}/ack" hx-swap="outerHTML">Ack</button>`:b(n.acknowledged_at),a=[o,b(n.kind),b(n.severity),i];return`<tr${s?' class="requires-user"':""}>${a.map(l=>`<td>${l}</td>`).join("")}</tr>`}).join("");return`<h1>Attentions</h1>${e}<table><thead><tr><th>id</th><th>kind</th><th>severity</th><th>ack</th></tr></thead><tbody>${r}</tbody></table>`}function kA(t){return`<h1>Submitted PRs</h1>${ue(["id","repo","pr","status","last state","submitted","last scan"],t.map(e=>[`<a href="/api/submitted-prs/${b(e.id)}">${b(e.id)}</a>`,b(e.repo),`<a href="${b(e.pr_url)}" target="_blank" rel="noreferrer">${b(e.pr_url.replace(/^https:\/\/github\.com\//,""))}</a>`,b(e.status),b(e.last_known_state??""),b(e.submitted_at),b(e.last_scanned_at??"")]))}`}function vA(t){return t===null?"<p>not found</p>":`<h1>PR ${b(t.id)}</h1><dl>
1595
+ <dt>repo</dt><dd>${b(t.repo)}</dd>
1596
+ <dt>pr</dt><dd><a href="${b(t.pr_url)}" target="_blank" rel="noreferrer">${b(t.pr_url)}</a></dd>
1597
+ <dt>issue</dt><dd>${t.issue_url===null?"\u2014":`<a href="${b(t.issue_url)}" target="_blank" rel="noreferrer">${b(t.issue_url)}</a>`}</dd>
1598
+ <dt>status</dt><dd>${b(t.status)}</dd>
1599
+ <dt>branch</dt><dd>${b(t.branch??"\u2014")}</dd>
1600
+ <dt>head_sha</dt><dd>${b(t.head_sha??"\u2014")}</dd>
1601
+ <dt>submitted_at</dt><dd>${b(t.submitted_at)}</dd>
1602
+ <dt>last_scanned_at</dt><dd>${b(t.last_scanned_at??"\u2014")}</dd>
1603
+ <dt>last_known_state</dt><dd>${b(t.last_known_state??"\u2014")}</dd>
1604
+ </dl>`}function Uh(t){return`<h1>Sessions</h1>${ue(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Ls(e.team_name),n=encodeURIComponent(e.alias);return[b(e.team_name),b(e.alias),b(e.sessionid),b(e.input_tokens),b(e.cache_tokens),b(e.output_tokens),b(e.total_tokens),b(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Wh(t,e){return e===null?`<span>${b(t)}</span>`:`<span>${b(t)} ${b(e.team_name)}/${b(e.alias)}</span>`}function IA(t){return`<h1>Run Throughput</h1>${ue(["workflow","terminal","count"],t.map(e=>[b(e.workflow_name),b(e.terminal_state),b(e.count)]))}`}function Bh(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${ue(["project","scanned","new jobs","error"],t.map(e=>[b(e.project_name),b(e.scanned),b(e.new_jobs),b(e.error)]))}`}function jA(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ae(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function NA(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),i=e.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(t)}</h1>
1605
+ <h2>Request-changes rate</h2>
1606
+ <p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
1607
+ ${ue(["state","total steps","request_changes","rate"],s)}
1608
+ <h2>Step duration distribution</h2>
1609
+ ${ue(["state","&lt;5min","5-15min","15-60min","&gt;60min","no end"],o)}
1610
+ <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1611
+ ${ue(["state","retried runs","avg attempts"],i)}
1612
+ <h2>Tool efficacy</h2>
1613
+ ${ue(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var aA,Jh,Xh=T(()=>{"use strict";jo();Dr();Jp();zp();sm();Et();Pl();V_();eh();ah();ph();hh();xh();Ms();Lh();Ho();aA=["open","assigned","closed","reopened"],Jh=["low","medium","high","critical"]});function $A(t){return Math.floor(t/6e4)*6e4}function xA(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)RA(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function RA(t,e){let r=Date.now(),n=$A(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Gh(t,e=250){let r=setInterval(()=>{try{xA(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Vh=T(()=>{"use strict"});function OA({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1614
+ FROM run r
1615
+ JOIN job j ON j.id = r.job_id
1616
+ WHERE j.project_id = ?
1617
+ AND r.terminal_state IS NOT NULL
1618
+ ORDER BY r.id DESC
1619
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,AA).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,Yh)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Yh,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function Kh(t){for(let e of CA)try{e(t)}catch{}}var AA,Yh,CA,zh=T(()=>{"use strict";AA="request_changes",Yh="reviewer_rejection_rate_high";CA=[OA]});function qn(){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 Zh(t){let e=t.intervalMs??qn(),r=t.runOnceFn??fr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??Gh)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Qh(t.dal,t.monitorSessionActivityFn??Fa,e,n).finally(()=>{a=null})),a.finally(()=>u(Ua(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=LA(t.dal,r,t.collectSessionSizesFn??rf,t.scanIntakeFn??Br,t.monitorSessionActivityFn??Fa,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function LA(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(x_({dal:t}),Kh({dal:t}),d=await n(t);;){let m=await e({dal:t,worker_id:o,lease_ms:6e5});if(m===null)break;l.push(m)}let p=await r(t);c=p.recorded,u=p.failed,f=await Qh(t,s,i,a)}catch(p){a.last_error=p instanceof Error?p.message:String(p);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((p,m)=>p+m.scanned,0),a.last_intake_new_jobs=d.reduce((p,m)=>p+m.new_jobs,0),a.last_intake_failures=d.filter(p=>p.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Qh(t,e,r,n){let s=Ua(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var wc=T(()=>{"use strict";jo();Wn();tc();Ms();Vh();zh();Wa()});function eg(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 tg=T(()=>{"use strict"});function DA(t){return t.replace(/^\/+/,"")}function rg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Hn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=DA(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return rg(t.userId)&&rg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${MA}/${t.identityId}/`}function FA(t){return String(Math.max(0,Math.floor(t))).padStart(PA,"0")}function yc(t,e,r){return`${t}${e}${FA(r)}.json`}function li(t,e){return`${t}${e}`}function ci(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var MA,PA,ui=T(()=>{"use strict";MA="mailbox";PA=12});function It(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=di[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=di[a&15]+i,a=a>>4;let l=di[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=di[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var di,fi=T(()=>{"use strict";di="0123456789abcdef"});function bc(t,e){return!Number.isFinite(t)||t<=0?e:t}function BA(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function ag(t){return t.conversation_id===ig&&qA(t.payload)}function qA(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function HA(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:ag(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var ng,sg,og,UA,ig,WA,Ec,Zr,Tc=T(()=>{"use strict";ui();fi();ng=3e3,sg=1e4,og=12e3,UA=1e3,ig="__lmctl_heartbeat__",WA={kind:"heartbeat"},Ec={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Zr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=Hn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=bc(e.readIntervalMs??e.pollIntervalMs??ng,ng),this.heartbeatIdleMs=bc(e.heartbeatIdleMs??sg,sg),this.backoffReadIntervalMs=bc(e.backoffReadIntervalMs??e.pollIntervalMs??og,og)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??Ec;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=li(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:UA,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=ci(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:It(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=yc(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Ec;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,r=yc(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(BA(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),ag(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=HA(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Ec;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(ig,WA)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});function lg(){return{put:0,get:0,list:0}}function Sc(t,e=JA){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function kc(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var JA,pi,vc=T(()=>{"use strict";JA={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};pi=class{counts=lg();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=lg(),e}estimateCostUsd(e){return Sc(this.counts,e)}}});function cg(t){let e=t.now??Date.now,r=t.timers??XA,n=null,s=null;async function o(){let l=e(),c=kc(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let p=f;if(t.readUserTotal!==void 0)try{p=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),p=f}let m=Sc(p);if(n!==c&&m>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${m.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:m,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===kc(e())}}}var XA,ug=T(()=>{"use strict";vc();XA={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Ic=T(()=>{"use strict";ui();fi();fi()});function GA(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function VA(t){return t.reply_to!==void 0&&t.response!==void 0}function YA(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function dg(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 mi,_i,fg=T(()=>{"use strict";Ic();mi=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},_i=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 mi("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=It(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(dg(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(dg(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new mi;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=GA(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(VA(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??YA(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:It(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function pg(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 mg=T(()=>{"use strict"});function _g(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 hg=T(()=>{"use strict"});function wg(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var gg,yg=T(()=>{"use strict";gg="daemon:events"});function bg(t){return{kind:"prompt",prompt_id:t.prompt_id??It(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Tg(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 Eg,jc=T(()=>{"use strict";Ic();Eg="prompt:root"});function hi(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(KA(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function KA(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 Nc=T(()=>{"use strict"});function Sg(t){if(t.length===0||!t.startsWith("---"))throw new ft("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1620
+ `);if(e[0]!=="---")throw new ft("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new ft(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!zA.has(c))throw new ft(`unknown frontmatter key "${c}" \u2014 allowed keys: ${gi.join(", ")}`);r[c]=u}if(n===-1)throw new ft("frontmatter not closed (missing trailing `---` on its own line)");for(let i of gi)if(r[i]===void 0)throw new ft(`missing required frontmatter key "${i}" \u2014 required: ${gi.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var gi,zA,ft,kg=T(()=>{"use strict";gi=["title","description","members"],zA=new Set(gi),ft=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as ZA,writeFileSync as XJ,renameSync as GJ,existsSync as Ng,realpathSync as $g,statSync as QA}from"node:fs";import{basename as xg,resolve as pr,dirname as wi}from"node:path";function rO(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function nO(t){return/^\s*_MEMBER_\s+\S/.test(t)}function sO(t){return/^\s*_SESSION_\s+\S/.test(t)}function oO(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function iO(t){let e=xg(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ie(t){let e=ZA(t,"utf-8"),r=wi(pr(t)),n=lO(e,iO(t),{baseDir:r});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=pr(r,s.sessiondir));return n}function aO(t,e){let r={},n=[],s=t.replace(/^\s*_CONNECT_\s*/,""),o=0;function i(a){return s.slice(a).trim().split(/\s+/u)[0]??""}for(;o<s.length;){for(;o<s.length&&/\s/u.test(s[o]);)o+=1;if(o>=s.length)break;let a=o,l=/^[A-Za-z_][A-Za-z0-9_]*/u.exec(s.slice(o));if(l===null){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}let c=l[0];if(o+=c.length,s[o]!=="="){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}o+=1;let u="";if(s[o]==='"'){o+=1;let d=o;for(;o<s.length&&s[o]!=='"';)o+=1;if(o>=s.length){n.push(`line ${e}: unterminated quoted value for "${c}" on _CONNECT_ line: ${t.trim()}`);break}if(u=s.slice(d,o),o+=1,o<s.length&&!/\s/u.test(s[o])){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}}else{let d=o;for(;o<s.length&&!/\s/u.test(s[o]);)o+=1;u=s.slice(d,o)}if(!Ig.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1621
+ allowed keys: ${Ig.join(", ")}`);continue}if(Object.prototype.hasOwnProperty.call(r,c)){n.push(`line ${e}: duplicate key "${c}" on _CONNECT_ line: ${t.trim()}`);continue}r[c]=u}return{kvs:r,errors:n}}function lO(t,e,r={}){let n=[],s=[],o=[],i=new Set,a=r.baseDir??tO,l=t;if(l.startsWith("#teamfile:")){let d=l.indexOf(`
1622
+ `);l=d>=0?l.slice(d+1):""}let c=null;if(l.startsWith("---"))try{c=Sg(l)}catch(d){if(d instanceof ft)o.push(`frontmatter: ${d.message}`);else throw d}let u=t.split(`
1623
+ `);for(let d=0;d<u.length;d++){let f=u[d],p=d+1;if(sO(f))throw new Error(`line ${p}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${f.trim()})`);if(oO(f)){let{kvs:_,errors:E}=aO(f,p);if(o.push(...E),E.length>0)continue;let v=_.team,k=_.teamfile;if(v||o.push(`line ${p}: _CONNECT_ missing team: ${f.trim()}`),k||o.push(`line ${p}: _CONNECT_ missing teamfile: ${f.trim()}`),!v||!k)continue;if(i.has(v)){o.push(`line ${p}: duplicate _CONNECT_ team "${v}"`);continue}i.add(v);let N=pr(a,k);try{s.push({team:v,teamfile:$g(N)})}catch(S){o.push(`line ${p}: _CONNECT_ teamfile missing/unreadable: ${N}: ${S instanceof Error?S.message:String(S)}`)}continue}if(!nO(f))continue;let m=rO(f);for(let _ of Object.keys(m))if(!vg.includes(_))throw new Error(`line ${p}: unknown key "${_}" on _MEMBER_ line: ${f.trim()}
1624
+ allowed keys: ${vg.join(", ")}`);if(!m.provider&&!m.teamfile){o.push(`line ${p}: member line missing provider (or teamfile): ${f.trim()}`);continue}let g={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(g.session=m.sessionid),m.sessiondir&&(g.sessiondir=m.sessiondir),m.teamfile&&(g.teamfile=m.teamfile),m.model&&(g.model=m.model),n.push(g)}return{name:e,members:n,connections:s,rawText:t,parseErrors:o,frontmatter:c}}function xc(t,e){let r=[];for(let o of t.parseErrors)r.push({field:o.includes("_CONNECT_")?"connect":"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===$c.toLowerCase());n.length>1&&r.push({field:$c,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?pr(e,o.teamfile):pr(o.teamfile);if(!Ng(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ie(a),c=qt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else eO.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function qt(t){return t.members.find(e=>e.alias.toLowerCase()===$c.toLowerCase())}function yi(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=pr(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!Ng(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ie(o),l=qt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return yi(l,wi(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||wi(o),alias:t.alias,resolvedFrom:o,model:l.model}}function jg(t){let e;try{e=$g(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=QA(e);return{path:e,key:`${r.dev}:${r.ino}`}}function cO(t){return t.map(e=>xg(e)).join(" -> ")}function uO(t){let e=new Map;for(let i of t){let a=e.get(i.from.key)??[];a.push(i),e.set(i.from.key,a)}let r=new Set,n=new Set,s=[];function o(i){if(r.has(i.key)){let a=s.findIndex(c=>c.key===i.key),l=a>=0?s.slice(a).map(c=>c.path):[i.path];return l.push(i.path),l}if(n.has(i.key))return null;r.add(i.key),s.push(i);for(let a of e.get(i.key)??[]){let l=o(a.to);if(l!==null)return l}return s.pop(),r.delete(i.key),n.add(i.key),null}for(let i of t){let a=o(i.from);if(a!==null)return a}return null}function Jn(t){let e=jg(pr(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ie(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=jg(d.teamfile);try{yi({alias:d.team,provider:"",teamfile:f.path,extra:{}},wi(a.path),void 0,{requireSession:!1})}catch(p){let m=p instanceof Error?p.message:String(p);throw m.includes("has no lead session")?new Error(`connect target has no Lead: ${d.team} -> ${f.path}`):m.includes("Teamfile not found")?new Error(`connect target missing/unreadable: ${d.team} -> ${f.path}: ${m}`):new Error(`connect target invalid: ${d.team} -> ${f.path}: ${m}`)}s.push({from:a,to:f,team:d.team}),u.push({target_name:d.team,target_teamfile:f.path}),!l.has(f.key)&&o(f,new Set([...l,f.key]))}}o(e,new Set([e.key]));let i=uO(s);if(i!==null)throw new Error(`connect cycle: ${cO(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function Ei(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var $c,eO,tO,vg,Ig,mr=T(()=>{"use strict";kg();$c="Lead",eO=new Set(["claude","codex","opencode","gemini","copilot","qwen","ClaudeMock"]),tO=process.cwd();vg=["alias","provider","sessionid","sessiondir","teamfile","model"],Ig=["team","teamfile"]});import{existsSync as dO,realpathSync as fO}from"node:fs";import{dirname as pO}from"node:path";function Cg(t){mO(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function mO(t){let e=t.payload.root_teamfile;try{e=fO(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await Qr(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await Qr(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=_O(e);if("error"in r)return await Qr(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-wO(t.env??process.env)).toISOString()});if(!s.acquired){let o=gO(r.alias,s.current);return await Qr(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??rr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await Qr(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await Qr(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function _O(t){if(!dO(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ie(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=qt(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??pO(t)}}async function Qr(t,e){let r=Og(e.message),n=e.response===null?null:Og(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Og(t){return t.length<=Rg?{text:t,truncated:!1}:{text:t.slice(0,Rg),truncated:!0}}function hO(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function gO(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:hO(t,e)}function wO(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Ag;let r=Number(e);return!Number.isFinite(r)||r<=0?Ag:r}var Rg,Ag,Lg=T(()=>{"use strict";yt();mr();Rg=256*1024,Ag=30*60*1e3});import{chmodSync as Fg,existsSync as yO,mkdirSync as Ug,readFileSync as Si,writeFileSync as Wg}from"node:fs";import{dirname as Rc,resolve as bi,join as Bg}from"node:path";import{fileURLToPath as EO}from"node:url";import{homedir as qg}from"node:os";import{CognitoIdentityClient as bO,GetIdCommand as TO}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Mg}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as SO,ListObjectsV2Command as kO,PutObjectCommand as vO,S3Client as Dg}from"@aws-sdk/client-s3";function ki(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:jO(t.selfUrl),n={},s;for(let k of r)if(yO(k)){n=IO(k),s=k;break}let o=(...k)=>{for(let N of k)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID),a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID),l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET),c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=[];i===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 d={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return d;let f=e.LMCTL_MAILBOX_POLL_MS,p=f!==void 0&&f.length>0?Number(f):void 0,m=Ti(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=Ti(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=Ti(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),_=Ti(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return d.config={identityPoolId:i,cognitoUserPoolId:a,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...m!==void 0?{readIntervalMs:m}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},..._!==void 0?{chatLogPollIntervalMs:_}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},d}function IO(t){try{let e=Si(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function jO(t){let e=Rc(EO(t??import.meta.url));return[bi(e,"..","..","..","..","infra","terraform","terraform.tfstate"),bi(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),bi(e,"..","..","..","infra","terraform","terraform.tfstate"),bi(e,"..","..","infra","terraform","terraform.tfstate")]}function Ti(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function NO(t){let e=$O(t.intervalMs)??Hg,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let p={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(p),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function $O(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Jg(t){let e=xO(t.tokenPath);if(e.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` first");let r=e.cognito.idToken;if(typeof r!="string"||r==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty");let n=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,s=t.tokenPath??Bg(qg(),".lmctl","cli-tokens.json"),o=e.cognito.identityId,i=!1;o===void 0||o===""?o=await Pg({tokenPath:s,region:t.region,identityPoolId:t.identityPoolId,idpProvider:n,idToken:r,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=Mg({identityId:o,logins:{[n]:r},clientConfig:{region:t.region}}),l=new Dg({region:t.region,credentials:a}),c={ListObjectsV2Command:kO,GetObjectCommand:SO,PutObjectCommand:vO},u=hi(r),d=u??o,f=t.deviceId,p=Hn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),m=t.cursorStore,h;if(m!==void 0){let $=m.loadMailboxCursor(d,p);if($!==null)h=$.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,pe=0;for(;!H&&pe<2;){pe+=1;try{let I=li(p,"web"),j=0,O;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of B.Contents??[]){let C=ci(F.Key??"",p,"web");C!==void 0&&C>j&&(j=C)}O=B.IsTruncated===!0?B.NextContinuationToken:void 0}while(O!==void 0);h=j,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${j} for user_id=${d}`),H=!0}catch(I){let j=I instanceof Error?I.message:String(I);if(i&&pe===1&&OO(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${j}); clearing + refreshing`),AO(s),i=!1,o=await Pg({tokenPath:s,region:t.region,identityPoolId:t.identityPoolId,idpProvider:n,idToken:r,log:t.log}),a=Mg({identityId:o,logins:{[n]:r},clientConfig:{region:t.region}}),l=new Dg({region:t.region,credentials:a}),p=Hn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${j}`);break}}m.saveMailboxCursor({user_id:d,mailbox_key:p,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,E=t.persistentSessionManager,v=t.promptTriggerStore,k=new pi,N=new Zr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:$=>k.record($),onMessage:async $=>{if(_!==void 0&&pg($.payload)){_.onInbound($.payload);return}if(E!==void 0&&_g($.payload)){await E.onInbound($.payload);return}if(!wg($.payload)){if(v!==void 0&&Tg($.payload)){Cg({store:v,payload:$.payload,log:t.log});return}g!==null&&await g.handleIncoming($.payload,$)}},...m!==void 0?{onCursorAdvance:$=>{m.saveMailboxCursor({user_id:d,mailbox_key:p,last_processed_version_id:null,last_processed_seq:$,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new _i({client:N,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async $=>N.putMessage({conversation_id:`terminal:${$.session_id}`,payload:$})),E!==void 0&&E.setPublish(async $=>N.putMessage({conversation_id:`provider:${$.session_id}`,payload:$}));let S=$=>N.putMessage({conversation_id:gg,payload:$});N.start();let A=t.chatLogTailStore===void 0?void 0:NO({store:t.chatLogTailStore,publishDaemonEvent:S,cursorKey:p,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Hg,log:t.log});t.log?.(`[mx-mailbox] agent polling ${p} (bucket=${t.mailboxBucket})`);let L=t.deviceId??o,q=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:cg({meter:k,store:t.usageStore,userId:d,deviceId:L,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:$,costUsd:H,ceilingUsd:pe})=>{t.log?.(`[usage] month ${$} cost $${H.toFixed(4)} >= ceiling $${pe} \u2014 blocking mailbox`),N.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async($,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${L}-${$}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async $=>{let H={put:0,get:0,list:0},pe;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...pe!==void 0?{ContinuationToken:pe}:{}}));for(let j of I.Contents??[]){let O=j.Key??"";if(O.endsWith(`-${$}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}pe=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(pe!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:N,fetchClient:g,publishDaemonEvent:S,async stop(){A?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await N.stop().catch(()=>{})}}}function xO(t){let e=t??Bg(qg(),".lmctl","cli-tokens.json");try{let r=Si(e,"utf8");return JSON.parse(r)}catch{return{}}}function RO(t,e){if(e===void 0||e==="")return;let r={};try{let s=Si(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};Ug(Rc(t),{recursive:!0,mode:448}),Wg(t,JSON.stringify(n,null,2));try{Fg(t,384)}catch{}}function AO(t){let e={};try{let n=Si(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,Ug(Rc(t),{recursive:!0,mode:448}),Wg(t,JSON.stringify(r,null,2));try{Fg(t,384)}catch{}}async function Pg(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new bO({region:t.region}).send(new TO({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{RO(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 OO(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 Hg,Ac=T(()=>{"use strict";Tc();vc();ug();fg();mg();hg();yg();jc();ui();Nc();Lg();Hg=3e3});import{spawn as Mc}from"node:child_process";import{createInterface as Xg}from"node:readline";var Oc,Cc,Lc,Gg,Vg=T(()=>{"use strict";na();He();Oc=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=Mc(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Xg({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1625
+ `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1626
+ `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Cc=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Mc(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1627
+ `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
1628
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Lc=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{ws(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Mc(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Xg({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1629
+ `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1630
+ `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
1631
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},Gg=t=>{switch(t){case"codex":return new Oc;case"claude":case"qwen":return new Cc;case"gemini":case"copilot":case"opencode":return new Lc;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as CO}from"node:crypto";import{existsSync as N4,mkdirSync as LO,readFileSync as MO,writeFileSync as DO}from"node:fs";import{homedir as PO}from"node:os";import{dirname as FO,join as UO}from"node:path";function vi(){return process.env.LMCTL_DEVICE_FILE??UO(PO(),".lmctl","device.json")}function en(t=vi()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(MO(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 Yg(t=vi()){let e=en(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:CO(),created_at:new Date().toISOString()};return LO(FO(t),{recursive:!0}),DO(t,`${JSON.stringify(r,null,2)}
1632
+ `,{encoding:"utf8",mode:384}),r}var Dc=T(()=>{"use strict"});import*as Kg from"node:child_process";function BO(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Pc(t,e={}){let r=e.spawnSync===void 0&&process.env[qO]==="1",n=e.spawnSync??Kg.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ii[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=BO(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function zg(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ii).join(", ")})`;let e=WO[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Ii,WO,qO,Zg=T(()=>{"use strict";Ii={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen"},WO={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code"};qO="LMCTL_SKIP_BINARY_CHECK"});var ow={};le(ow,{ProviderBinaryPreflightError:()=>ji,__setProviderBinaryCheckForTest:()=>zO,bootstrapAgentRestMailbox:()=>ew,publishRegisteredWorkflowsOnStart:()=>Qg,resolveServeConfig:()=>tw,runProviderBinaryPreflight:()=>nw,runServe:()=>GO,validateServeArgs:()=>sw});import{randomBytes as HO}from"node:crypto";import{serve as JO}from"@hono/node-server";async function GO(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XO),0;let r=sw(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1633
+ `),2;try{nw(e)}catch(_){return 1}let n=me({path:de()}),s={portCli:ZO(t)},o;try{o=tw({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(_){return n.close(),e.stderr.write(`error: ${_ instanceof Error?_.message:String(_)}
1634
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),eg(n);let i=r.noDaemon?void 0:Zh({dal:n,intervalMs:qn()}),a=ki({env:process.env});a.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${a.missing.join(", ")}; running without cloud sync`+(a.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${a.tfstateCandidatesChecked.length} candidate path${a.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${a.tfstatePathUsed} did not supply the missing fields)`)+`
1635
+ `);let l=await KO({log:_=>e.stderr.write(`${_}
1636
+ `)}),c=new ei({adapterFactory:Gg,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:_=>e.stderr.write(`${_}
1637
+ `)}),u=en()?.device_id,d=qh({dal:n,daemon:i,...a.config!==void 0?{webuiRuntimeConfig:VO(a.config,u)}:{},...l!==void 0?{terminalSessionManager:l}:{},persistentSessionManager:c}),f=process.env.LMCTL_USAGE_QUOTA_USD,p=f!==void 0&&f!==""?Number(f):NaN,m=Number.isFinite(p)&&p>0?p:void 0,h=await ew({dal:n,app:d,io:e,mailbox:a.config===void 0?void 0:{...a.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...m!==void 0?{usageQuotaUsd:m}:{},...u!==void 0?{deviceId:u}:{}},...l!==void 0?{terminalSessionManager:l}:{},persistentSessionManager:c});await Qg({dal:n,mailbox:h.mailbox,io:e});let g=JO({fetch:d.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1638
+ `),await new Promise(_=>{let E=()=>{(async()=>(i!==void 0&&await i.stop(),g.close(),await h.stop(),l!==void 0&&await l.stop(),await c.stop(),n.close(),_()))()};process.once("SIGTERM",E),process.once("SIGINT",E)}),0}function VO(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 Qg(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1639
+ `)}}async function ew(t){let e;if(t.mailbox!==void 0)try{e=await Jg({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1640
+ `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(Pp({app:t.app,log:r=>t.io?.stderr.write(`${r}
1641
+ `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1642
+ `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1643
+ `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function tw(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let p=Number(l);if(!Number.isInteger(p)||p<=0||p>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=p}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let p=Number(n.LMCTL_API_PORT);if(!Number.isInteger(p)||p<=0||p>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=p,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=HO(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let p of i)o.stderr.write(`note: ${YO(p)} env var used as fallback for ${p}; consider \`lmctl api config set ${p} ...\` to make this DB-canonical.
1644
+ `);return{port:a,apiUrl:d,apiToken:c}}function YO(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){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 Qo({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 zO(t){rw=t??Pc}function nw(t){let e=Object.keys(Ii),r=rw(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${zg(o)}
1645
+ `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1646
+ `),new ji(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1647
+ `)}function ZO(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 sw(t,e=process.env){let r=QO(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function QO(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}return`unknown argument: ${n}`}return e}var XO,ji,rw,iw=T(()=>{"use strict";Oe();Xh();wc();tg();xl();Ac();cc();uc();Vg();Dc();Zg();Be();XO=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth]
1648
+
1649
+ Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1650
+ services. Help exits before any port binding or daemon startup.
1651
+ `;ji=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},rw=Pc});var aw={};le(aw,{runIntake:()=>tC});async function tC(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(eC),0):r==="scan"?rC(n,e):r==="config"?nC(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1652
+ `),1)}async function rC(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=x(r,"--project");return X(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await Nl({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await Br(s)),0})}async function nC(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return X(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var eC,lw=T(()=>{"use strict";jo();Te();eC=`usage: lmctl intake <scan|config> ...
1653
+
1654
+ Scan configured project GitHub issues into lmctl, or update per-project
1655
+ intake settings such as enabled state, labels, and issue state filters.
1656
+ `});import{existsSync as sC}from"node:fs";import{resolve as oC,dirname as cw}from"node:path";function lC(t){return iC.test(t)||aC.test(t)}function uw(t){return Ni.test(t)}function Fc(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ni.test(n)?null:{teamfile:r,alias:n}}function jt(t,e){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!uw(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Ni.source}).`);let r=oC(t);if(!sC(r))throw new ge(`lmctl: teamfile not found: ${t}`);let n;try{n=Ie(r)}catch(o){throw new ge(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(n.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${n.parseErrors.join("; ")}`);let s=Ei(n,e);if(s===void 0){let o=n.members.map(i=>i.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1657
+ Known aliases: ${o}`)}if(s.teamfile!==void 0){let o=yi(s,cw(r));return{teamfile:r,alias:s.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,...o.model??s.model?{model:o.model??s.model}:{}}}if(s.session===void 0)throw new ge(`lmctl: alias "${s.alias}" in ${t} has no session ID yet.
1658
+ Run: lmctl seed ${t}`);return{teamfile:r,alias:s.alias,provider:s.provider,sessionid:s.session,sessiondir:s.sessiondir??cw(r),...s.model!==void 0?{model:s.model}:{}}}function Ht(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Fc(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?uw(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Ni.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1659
+ Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(lC(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.
1660
+ 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}".
1661
+ Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1662
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,iC,aC,Ni,Xn=T(()=>{"use strict";mr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},iC=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,aC=/^ses_[A-Za-z0-9_-]+$/,Ni=/^[A-Za-z][A-Za-z0-9_-]*$/});function pw(t){let e=dw(t.registry,t.fromTeamfile);if(e===void 0)return _r(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!fw(e,t.fromAlias))return _r(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=dw(t.registry,t.toTeamfile);if(r===void 0)return _r(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!fw(r,t.toAlias))return _r(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`);if(t.toTeamfile===t.fromTeamfile)return{allowed:!0,outOfPolicy:!1,reason:"same team"};let n=t.registry.connections.find(s=>s.sourceTeamfile===t.fromTeamfile&&s.targetTeamfile===t.toTeamfile);return n===void 0?_r(`target team is not connected from sender team: ${t.fromTeamfile} -> ${t.toTeamfile}`):r.leadAlias===null?_r(`target team has no Lead: ${t.toTeamfile}`):t.toAlias!==r.leadAlias?_r(`cross-team sends may only target Lead; got "${t.toAlias}" in ${t.toTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:`connected Lead via ${n.targetName}`}}function dw(t,e){return t.teams.find(r=>r.teamfile===e)}function fw(t,e){return t.aliases.some(r=>r===e)}function _r(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var mw=T(()=>{"use strict"});var bw={};le(bw,{agentInflightTtlMsFromEnv:()=>yw,parseIdleTimeoutMs:()=>Ew,runChat:()=>dC});import{existsSync as cC,realpathSync as Wc}from"node:fs";async function dC(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${gw}
1663
+ `),t.length===0?2:0;let r=fC(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1664
+ ${gw}
1665
+ `),2;if(r.runFlag!==void 0){let l=Number.parseInt(r.runFlag,10);return!Number.isFinite(l)||l<=0||String(l)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
1666
+ `),2):await X(e,async c=>{let u=c.getRun(l);if(u===null)return e.stderr.write(`error: run ${l}: not found
1667
+ `),1;if(u.terminal_state!==null&&u.terminal_state.length>0)return w(e,`run ${l}: already terminal (${u.terminal_state}); chat --run cannot resume a terminated run`);let d=ti(c,l);if(d===null)return e.stderr.write(`error: run ${l}: no pending operator-answerable attention (chat --run only resumes paused runs)
1668
+ `),1;if(d.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
1669
+ `),2;let f=c.resumeEscalation(d.attention_id,r.prompt);return f.resumed===!0?(e.stdout.write(`run ${l}: escalation resumed (decision: ${r.prompt})
1670
+ `),0):(e.stderr.write(`error: run ${l}: resumeEscalation failed (${f.reason})
1671
+ `),1)}if(d.kind==="interactive_waiting_operator"){let f=ct(c,d.attention_id);if(f===null||f.step_id===null)return e.stderr.write(`error: run ${l}: pending interactive_waiting_operator attention has no associated interactive step
1672
+ `),1;let p=c.resumeInteractive(f.step_id,r.prompt,r.done===!0);return p.resumed===!0?(e.stdout.write(`run ${l}: interactive resumed (step ${f.step_id}${r.done===!0?", done":""})
1673
+ `),0):(e.stderr.write(`error: run ${l}: resumeInteractive failed (${p.reason})
1674
+ `),1)}return e.stderr.write(`error: run ${l}: pending attention kind "${d.kind}" is not operator-answerable
1675
+ `),1})}let n=Ht(uC,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
1676
+ `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1677
+ `),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1678
+ `),2;if(!cC(n.teamfile))return e.stderr.write(`error: file not found: ${n.teamfile}
1679
+ `),1;try{let l=jt(n.teamfile,n.alias),c=Wc(l.teamfile),u=pC(r.fromFlag,c),d=await mC(e,{explicitRoot:r.rootFlag,sender:u,receiverTeamfile:c,operatorOrigin:r.fromFlag===void 0});try{Jn(d)}catch(m){return w(e,`connect cycle guard: ${m instanceof Error?m.message:String(m)}`)}let f=r.fromFlag===void 0?null:await wC(e,{rootTeamfile:d,sender:u,receiverTeamfile:c,receiverAlias:l.alias});f!==null&&!f.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${f.reason}
1680
+ `),s={provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,alias:l.alias,...l.model!==void 0?{model:l.model}:{}},o={root_teamfile:d,sender_teamfile:u.teamfile,sender_alias:u.alias,receiver_teamfile:c,receiver_alias:l.alias,policy:f};let p=await bC(e,{receiver_teamfile:c,receiver_alias:l.alias,sender_teamfile:u.teamfile,sender_alias:u.alias,force:r.force===!0});if(!p.acquired){let m=SC(l.alias,p.current);return await Uc(e,{...o,message:r.prompt,response:null,status:"error",error_detail:m}),e.stderr.write(`error: ${m}
1681
+ `),1}i=p.lease}catch(l){let c=l instanceof Error?l.message:String(l);return e.stderr.write(`error: ${c}
1682
+ `),l instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1683
+ `),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1684
+ `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1;try{let l={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:d=>{a=!0,e.stdout.write(d)},onProgress:d=>kC(e,s.alias??"(raw)",d)};s.model!==void 0&&(l.model=s.model),s.alias!==void 0&&(l.alias=s.alias),r.idleTimeoutMs!==void 0&&(l.timeoutMs=r.idleTimeoutMs);let c=await rr(l),u=c.status==="stalled";return o!==null&&await Uc(e,{...o,message:r.prompt,response:u?null:c.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":u?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:u?`provider stalled${c.stalledAfterMs!==void 0?` after ${c.stalledAfterMs}ms`:""}`:null}),a?c.text.endsWith(`
1685
+ `)||e.stdout.write(`
1686
+ `):e.stdout.write(`${c.text}${c.text.endsWith(`
1687
+ `)?"":`
1688
+ `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await Uc(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${c}`:c}),e.stderr.write(`error: ${c}
1689
+ `),1}finally{i!==null&&await TC(e,i)}}function fC(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let E=Ew(_);if(typeof E=="string")return E;n=E;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,p;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=e[0]}else if(e.length===2)d=e[0],p=e[1];else if(e.length===3)d=e[0],f=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let m={prompt:p,permissionMode:r};return d!==void 0&&(m.target=d),f!==void 0&&(m.alias=f),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),o!==void 0&&(m.providerFlag=o),i!==void 0&&(m.fromFlag=i),a!==void 0&&(m.rootFlag=a),l&&(m.force=!0),m}function pC(t,e){if(t===void 0)return{teamfile:e,alias:"operator"};let r=Fc(t);if(r===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let n=Wc(r.teamfile),s=Ie(n);if(s.parseErrors.length>0)throw new ge(`--from ${r.teamfile}: ${s.parseErrors.join("; ")}`);let o=Ei(s,r.alias);if(o===void 0)throw new ge(`--from alias "${r.alias}" not found in ${r.teamfile}`);return{teamfile:n,alias:o.alias}}async function mC(t,e){return e.explicitRoot!==void 0?Wc(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await X(t,r=>_C(r,e.sender.teamfile)??e.receiverTeamfile)}function _C(t,e){let r=t.listRootTeams().slice().sort(hC);for(let n of r)if(gC(t,n.teamfile_path,e))return n.teamfile_path;return null}function hC(t,e){let r=t.registered_at.localeCompare(e.registered_at);return r!==0?r:t.teamfile_path.localeCompare(e.teamfile_path)}function gC(t,e,r){let n=[e],s=new Set;for(;n.length>0;){let o=n.shift();if(!s.has(o)){if(s.add(o),o===r)return!0;for(let i of t.listTeamConnections(o))n.push(i.target_teamfile)}}return!1}async function wC(t,e){return await X(t,r=>pw({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:yC(r,e.sender.teamfile,e.receiverTeamfile)}))}function yC(t,e,r){let n=new Set([e,r]),s=t.listTeamConnections(e);for(let o of s)n.add(o.target_teamfile);return{teams:[...n].map(EC),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function EC(t){let e=Ie(t),r=qt(e);return{teamfile:t,aliases:e.members.map(n=>n.alias),leadAlias:r?.alias??null}}async function bC(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-yw()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await X(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function TC(t,e){try{await X(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1690
+ `)}}function SC(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function yw(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return hw;let r=Number(e);return!Number.isFinite(r)||r<=0?hw:r}async function Uc(t,e){let r=ww(e.message),n=e.response===null?null:ww(e.response);try{await X(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1691
+ `)}}function ww(t){return t.length<=_w?{text:t,truncated:!1}:{text:t.slice(0,_w),truncated:!0}}function Ew(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function kC(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1692
+ `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1693
+ `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1694
+ `)}var uC,_w,hw,gw,Tw=T(()=>{"use strict";yt();Te();Xn();mr();mw();ri();Et();uC={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},_w=256*1024,hw=30*60*1e3,gw=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1695
+ lmctl chat <teamfile> <alias> "<prompt>"
1696
+ lmctl chat <sessionid> "<prompt>" --provider <name>
1697
+ lmctl chat --provider <name> --session <id> "<prompt>"
1698
+ lmctl chat --run <id> "<answer>" [--done]
1699
+ [--permission-mode plan|yolo] [--idle-timeout <duration>]
1700
+ [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1701
+
1702
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var Gn,lX,Bc=T(()=>{"use strict";Gn=[{name:"lmctl_chat",description:"Send one prompt to an AI-managed .lmctl team member by explicit teamfile path and alias. This is the only MCP tool exposed by lmctl; managed workflows use the lmctl CLI surface.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},provider:{type:"string",description:"(deprecated: use team+alias)"},sessionid:{type:"string",description:"(deprecated: use team+alias)"},sessiondir:{type:"string",description:"(deprecated: use team+alias)"},prompt:{type:"string",description:"Prompt text to send"},idle_timeout:{type:"string",description:"Idle timeout, e.g. 8h, 30m, 0"},heartbeat:{type:"string",description:"Accepted for lmctl0 compatibility; ignored by lmctl"}},required:["prompt"],additionalProperties:!1},local:!0}],lX=Gn.length});import{spawn as vC}from"node:child_process";async function Sw(t,e,r){let n=jC.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return NC(n.name,s)}function NC(t,e){return t==="lmctl_chat"?$C(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function $C(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:void 0,n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=typeof t.provider=="string"?t.provider:void 0,i=typeof t.sessionid=="string"?t.sessionid:void 0,a=typeof t.sessiondir=="string"&&t.sessiondir.length>0?t.sessiondir:process.cwd(),l=typeof t.idle_timeout=="string"?t.idle_timeout:void 0,c,u=process.cwd();if(r!==void 0&&r.length>0)c=["chat",r,n,e],s!==void 0&&c.push("--from",s);else if(o!==void 0&&i!==void 0)c=["chat",i,e,"--provider",o],u=a;else return Promise.resolve({status:"error",code:400,message:"provide either 'team' or all of 'provider'+'sessionid'"});return l!==void 0&&c.push("--idle-timeout",l),xC(c,u)}function xC(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=vC("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",l=>{i+=l.toString("utf8")}),o.stderr?.on("data",l=>{a+=l.toString("utf8")}),o.on("error",l=>{s({status:"error",code:1,message:`failed to spawn lmctl chat: ${l.message}`})}),o.on("exit",l=>{if(l===0){s({status:"ok",data:{text:i.trim()||"(empty response)"}});return}s({status:"error",code:l??1,message:a.trim()||`lmctl chat exited with code ${l}`})})})}function kw(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:IC),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var IC,jC,qc=T(()=>{"use strict";Bc();IC="http://127.0.0.1:8787",jC=new Map(Gn.map(t=>[t.name,t]))});async function CC(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Hc({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:RC,capabilities:{tools:{listChanged:!1}},serverInfo:{name:AC,version:OC}}}};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:Gn.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await Sw(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Hc(t){return`${JSON.stringify(t)}
1703
+ `}async function vw(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Hc({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await CC(l,t);c.kind==="response"?t.io.write(Hc(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1704
+ `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1705
+ `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1706
+ `),a.finally(()=>c(1))})})}var RC,AC,OC,Iw=T(()=>{"use strict";Bc();qc();RC="2025-06-18",AC="lmctl",OC="0.0.1"});var jw={};le(jw,{runMcp:()=>MC});async function MC(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(LC),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1707
+ `),2;let n=e.dal===void 0,s=e.dal??me({path:de()});try{let o=kw(s,process.env);return await vw({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var LC,Nw=T(()=>{"use strict";Oe();qc();Iw();Be();LC=`usage: lmctl mcp
1708
+
1709
+ Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1710
+ local config, then uses stdin/stdout for JSON-RPC frames.
1711
+ `});function Vn(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var $w=T(()=>{"use strict"});function DC(t){return{stale_run_minutes:Kn(t,"monitor.stale_run_minutes",Yn.stale_run_minutes),old_attention_days:Kn(t,"monitor.old_attention_days",Yn.old_attention_days),old_issue_days:Kn(t,"monitor.old_issue_days",Yn.old_issue_days),stuck_job_minutes:Kn(t,"monitor.stuck_job_minutes",Yn.stuck_job_minutes),dedupe_window_hours:Kn(t,"monitor.dedupe_window_hours",Yn.dedupe_window_hours)}}function Kn(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function xw(t,e={}){let r=e.now??new Date,n=DC(t),s=[];for(let o of PC(t,n,r))s.push(o);for(let o of FC(t,n,r))s.push(o);for(let o of UC(t,n,r))s.push(o);for(let o of WC(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function PC(t,e,r){let n=Rw(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1712
+ SELECT r.id AS id,
1713
+ r.job_id AS job_id,
1714
+ w.name AS workflow_name,
1715
+ r.started_at AS started_at,
1716
+ (SELECT MAX(timestamp_ms) FROM session_event WHERE run_id = r.id) AS last_event_ms
1717
+ FROM run r
1718
+ JOIN workflow w ON w.id = r.workflow_id
1719
+ WHERE r.terminal_state IS NULL
1720
+ AND r.paused_at IS NULL
1721
+ AND r.started_at <= ?
1722
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Vn(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push($i(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function FC(t,e,r){let n=Rw(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1723
+ SELECT id, project_id, source, source_ref, status, enqueued_at
1724
+ FROM job
1725
+ WHERE status NOT IN ('done', 'failed')
1726
+ AND enqueued_at <= ?
1727
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Vn(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push($i(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function UC(t,e,r){let n=Aw(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1728
+ SELECT project_id,
1729
+ COUNT(*) AS count,
1730
+ (SELECT kind FROM attention a2
1731
+ WHERE a2.acknowledged_at IS NULL
1732
+ AND a2.kind NOT IN ('attentions_overdue', 'issues_overdue')
1733
+ AND a2.created_at <= ?
1734
+ AND (a2.project_id IS attention.project_id)
1735
+ ORDER BY a2.created_at ASC LIMIT 1) AS oldest_kind,
1736
+ MIN(created_at) AS oldest_at
1737
+ FROM attention
1738
+ WHERE acknowledged_at IS NULL
1739
+ AND kind NOT IN ('attentions_overdue', 'issues_overdue')
1740
+ AND created_at <= ?
1741
+ GROUP BY project_id
1742
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Vn(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push($i(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function WC(t,e,r){let n=Aw(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1743
+ SELECT project_id,
1744
+ COUNT(*) AS count,
1745
+ (SELECT title FROM project_issue i2
1746
+ WHERE i2.status IN ('open', 'reopened')
1747
+ AND i2.created_at <= ?
1748
+ AND i2.project_id = project_issue.project_id
1749
+ ORDER BY i2.created_at ASC LIMIT 1) AS oldest_title,
1750
+ MIN(created_at) AS oldest_at
1751
+ FROM project_issue
1752
+ WHERE status IN ('open', 'reopened')
1753
+ AND created_at <= ?
1754
+ GROUP BY project_id
1755
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Vn(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${HC(i.oldest_title,40)})`;o.push($i(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function $i(t,e){let r=BC(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function BC(t,e,r,n){let s=qC(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1756
+ SELECT * FROM attention
1757
+ WHERE acknowledged_at IS NULL
1758
+ AND created_at >= ?
1759
+ AND payload LIKE ?
1760
+ ORDER BY id DESC
1761
+ LIMIT 1
1762
+ `).get(s,o)??null}function Rw(t,e){return new Date(t.getTime()-e*60*1e3)}function qC(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Aw(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function HC(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Yn,Ow=T(()=>{"use strict";$w();Yn={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Lw={};le(Lw,{renderSummary:()=>Cw,runMonitor:()=>XC});async function XC(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JC),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=D(r,"--json"),s=D(r,"--quiet");try{return await X(e,o=>{let i=xw(o);return n?W(e,i):s||e.stdout.write(`${Cw(i.findings)}
1763
+ `),0})}catch(o){return fe(e,o)}}function Cw(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${GC(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function GC(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var JC,Mw=T(()=>{"use strict";Te();Ow();JC=`usage: lmctl monitor [--json] [--quiet]
1764
+
1765
+ Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1766
+ issues; emit findings as attentions for the operator/master to handle.
1767
+ `});var Pw={};le(Pw,{runDevice:()=>sL});import{readFileSync as VC}from"node:fs";import{homedir as YC}from"node:os";import{join as KC}from"node:path";import{CognitoIdentityClient as zC,GetIdCommand as ZC}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as QC}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as eL,ListObjectsV2Command as tL,PutObjectCommand as rL,S3Client as nL}from"@aws-sdk/client-s3";async function sL(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Dw),0;if(r==="init"){let n=Yg();return e.stdout.write(`${n.device_id}
1768
+ `),0}if(r==="id"){let n=en();return n===null?(e.stderr.write(`error: no device id initialized at ${vi()}; run 'lmctl device init'
1769
+ `),1):(e.stdout.write(`${n.device_id}
1770
+ `),0)}return r==="prompt"?await oL(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|prompt>
1771
+ `),1)}async function oL(t,e){let r=iL(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1772
+ ${Dw}`),2;let n=ki();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1773
+ `),1;let s=lL();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await aL({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=QC({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??en()?.device_id,u=hi(o)??void 0,d=new Zr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new nL({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:tL,GetObjectCommand:eL,PutObjectCommand:rL},selfRole:"browser",onMessage:async()=>{}}),f=bg({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),p=await d.putMessage({conversation_id:Eg,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:p},null,2)+`
1774
+ `),0}function iL(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function aL(t){let r=await new zC({region:t.region}).send(new ZC({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function lL(t=process.env.LMCTL_TOKEN_PATH??KC(YC(),".lmctl","cli-tokens.json")){try{return JSON.parse(VC(t,"utf8"))}catch{return null}}var Dw,Fw=T(()=>{"use strict";Dc();Ac();Tc();jc();Nc();Dw=`usage: lmctl device <id|init>
1775
+ lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1776
+
1777
+ Show or initialize the local device id used for per-user/per-device mailbox
1778
+ addressing. The id is stored in ~/.lmctl/device.json by default.
1779
+ `});var Ww={};le(Ww,{runTeam:()=>dL});import{join as cL}from"node:path";async function dL(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(uL),0;try{return await X(e,async s=>{switch(r){case"create":return pL(n,e,s);case"list":return mL(n,e,s);case"show":return _L(n,e,s);case"add-member":return hL(n,e,s);case"seed":return Uw(n,e,s,!1);case"refresh":return Uw(n,e,s,!0);case"companion":return wL(n,e,s);case"list-roots":return fL(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function fL(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return D(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1780
+ `)+(s.length>0?`
1781
+ `:"")),0}function pL(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1782
+ `),0}function mL(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1783
+ `)}${s.length>0?`
1784
+ `:""}`),0}function _L(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(D(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1785
+ `);for(let a of i)e.stdout.write(`- ${a.alias} ${Se(a)} ${a.sessionid??"(unseeded)"}
1786
+ `)}return 0}function hL(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--alias"),a=x(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??cL(Xt(),"sessions",o.name,i)});return D(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1787
+ `),0}async function Uw(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=x(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=gL(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(p=>p.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let p=r.getWorkflowByName(f.workflow_name);if(p===null)continue;let m=v_(f.workflow_name,p.definition);if(m.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${m.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(p=>p.team_id===i.id))Zs(f,r),eo(f);let u=[],d=!1;for(let f of l){let p=await Nr({member:f,dal:r}),m=r.updateTeamMemberSession(f.id,p.sessionid);if(m!==null){let h=m.role_prompt??"",g=h.length>0?`${h}
1788
+
1789
+ ${Ar}`:Ar;r.setMemberPromptSnapshot(f.id,g),u.push(m);let _=Or(Se(m),p.sessionid);_!==null&&e.stderr.write(`[seeded ${m.alias}] customize/compact in its native TUI:
1790
+ ${_}
1791
+ `);try{await fo({dal:r,member:m,stderr:e.stderr})}catch(E){d=!0,e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1792
+ `)}}}return D(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
1793
+ `),d?1:0}function gL(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function wL(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--interpreter"),a=x(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1794
+ `),0}var uL,Bw=T(()=>{"use strict";Be();Cs();Sn();Ka();Oe();Cr();cl();Ho();Te();za();uL=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1795
+
1796
+ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1797
+ refresh to create/update native provider sessions for team members.
1798
+
1799
+ Root team registry:
1800
+ list-roots [--json] List .lmctl root teams registered by lmctl seed.
1801
+ `});var Gw={};le(Gw,{renderMessage:()=>Jw,runTail:()=>SL});async function SL(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${TL}
1802
+ `),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--lines"),s=n===void 0?EL:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=D(r,"--watch"),i=x(r,"--watch-interval"),a=i===void 0?bL:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=x(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await X(e,async p=>kL(e,p,f,s,o,a))}catch(p){return fe(e,p)}}let c=Ht(yL,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ie(c.teamfile)}catch(m){return w(e,`tail: ${m instanceof Error?m.message:String(m)}`)}let p=qt(f);if(p===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let m=jt(c.teamfile,p.alias);u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?w(e,m.message):fe(e,m)}}else try{let f=jt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,p=c.provider;if(p===void 0){let m=await ro(f);if(m.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(m.length>1)return w(e,`tail: session "${f}" matches multiple providers (${m.join(", ")}); pass --provider`);p=m[0]}u={provider:p,sessionId:f}}let d=await qw(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let p=async()=>{try{let g=await qw(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
1803
+ `)}},m=setInterval(()=>{p()},a*1e3),h=()=>{clearInterval(m),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function qw(t,e,r,n,s){let o;try{o=await ar(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
1804
+ `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1805
+ `),-1;let i=o.messages??[],a=s<0?Math.max(0,i.length-n):s+1;if(a>=i.length)return i.length-1;for(let l=a;l<i.length;l+=1)t.stdout.write(`${Jw(i[l])}
1806
+ `);return i.length-1}function Jw(t){let e=Xw(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1807
+ `).replace(/\r/g,`
1808
+ `).split(`
1809
+ `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
1810
+ ${i.map(a=>` ${a}`).join(`
1811
+ `)}`}async function kL(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${Hw(u)}
1812
+ `);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let m=e.listSessionEvents(r,c);for(let h of m)t.stdout.write(`${Hw(h)}
1813
+ `),c=h.id}catch(m){t.stderr.write(`tail: ${m instanceof Error?m.message:String(m)}
1814
+ `)}},o*1e3),p=()=>{clearInterval(f),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Hw(t){let e=Xw(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Xw(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var yL,EL,bL,TL,Vw=T(()=>{"use strict";Cr();Te();Xn();mr();yL={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},EL=20,bL=2,TL=`usage: lmctl tail [target] [alias]
1815
+ lmctl tail --session <id> [--provider <name>]
1816
+ lmctl tail --run <id> [--watch] [--watch-interval Ns]
1817
+ [--lines N] [--watch] [--watch-interval Ns] [--provider <name>]
1818
+
1819
+ Print or watch provider session messages, or follow a managed run timeline.`});var Yw={};le(Yw,{runInfo:()=>NL});function jL(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function NL(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${IL}
1820
+ `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=D(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await X(e,async u=>xL(e,u,c,n))}catch(u){return fe(e,u)}}let o=Ht(vL,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return RL(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=jt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):fe(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await ro(a);if(c.length===0)return w(e,`info: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`info: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return $L(e,i,a,l,n)}async function $L(t,e,r,n,s){let o;try{o=await ar(r,e)}catch(a){return w(t,`info: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`info: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??0,totalOutputTokens:o.totalOutputTokens??0,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1821
+ `),t.stdout.write(` Provider: ${o.provider}
1822
+ `),n!==void 0&&t.stdout.write(` Alias: ${n}
1823
+ `),t.stdout.write(` CWD: ${o.cwd}
1824
+ `),t.stdout.write(` Messages: ${o.messageCount}
1825
+ `),t.stdout.write(` Model: ${o.model??"(unknown)"}
1826
+ `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
1827
+ `),t.stdout.write(` Created: ${i.createdAt}
1828
+ `),t.stdout.write(` Modified: ${i.modifiedAt}
1829
+ `),0)}async function xL(t,e,r,n){let s=sr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=xr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(W(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:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1830
+ `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
1831
+ `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
1832
+ `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
1833
+ `),t.stdout.write(` Paused: ${o?.paused===!0?"yes":"no"}
1834
+ `),t.stdout.write(` Started: ${s.started_at}
1835
+ `),s.ended_at!==null&&t.stdout.write(` Ended: ${s.ended_at}
1836
+ `),t.stdout.write(` Steps: ${s.steps.length}
1837
+ `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
1838
+ `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
1839
+ `),0)}async function RL(t,e,r){let n;try{n=Ie(e)}catch(u){return w(t,`info: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await ar(u.session,u.provider)}catch(p){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${p instanceof Error?p.message:String(p)}
1840
+ `)}let f=d?.messageCount??0;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),o+=f}if(r)return W(t,{team:n.name,members:s,total:{messageCount:o}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
1841
+ `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1842
+ `);for(let u of s){let d=u.lastContext!==void 0?jL(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${String(u.messageCount).padStart(6)} ${d.padStart(12)}
1843
+ `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${String(o).padStart(6)}
1844
+ `),0}var vL,IL,Kw=T(()=>{"use strict";Cr();Te();Xn();mr();Et();vL={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},IL=`usage: lmctl info [target] [alias]
1845
+ lmctl info <teamfile> # team rollup
1846
+ lmctl info <sessionid> [--provider <name>]
1847
+ [--json]
1848
+
1849
+ Show provider session details, team rollups, or managed run state/token totals.`});var Zw={};le(Zw,{runLs:()=>LL});import{resolve as Jc}from"node:path";function CL(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 LL(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${AL}
1850
+ `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=x(r,"--format"),s=D(r,"--json");if(D(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(x(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(D(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=x(r,"--limit"),h=OL;if(m!==void 0){let _=Number.parseInt(m,10);if(!Number.isFinite(_)||_<1||String(_)!==m)return w(e,`invalid --limit "${m}" (expected a positive integer)`);if(_>zw)return w(e,`--limit ${_} exceeds maximum (${zw})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await X(e,async _=>ML(e,_,h,g))}catch(_){return fe(e,_)}}let i=DL(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=x(r,"--provider"),c=x(r,"--sessiondir"),u=D(r,"--recursive"),d=D(r,"--all"),f;try{f=await xa(l?{provider:l}:{})}catch(m){return w(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!d){let m=c!==void 0?Jc(c):Jc(process.cwd());f=f.filter(h=>{let g=Jc(h.cwd);return u?g===m||g.startsWith(`${m}/`):g===m})}if(f=CL(f),a==="json")return W(e,f.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(f.length===0){if(a==="table"){let m=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${m}.
1851
+ `)}return 0}if(a==="teamfile"){for(let m of f)e.stdout.write(`_MEMBER_ alias=- provider=${m.provider} sessionid=${m.sessionId} sessiondir=${m.cwd}
1852
+ `);return 0}let p=Math.max(14,...f.map(m=>m.sessionId.length));e.stdout.write(`${"SESSION".padEnd(p)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
1853
+ `);for(let m of f){let h=m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd;e.stdout.write(`${m.sessionId.padEnd(p)} ${m.provider.padEnd(10)} ${h.padEnd(36)} ${m.modifiedAt.toISOString()}
1854
+ `)}return 0}async function ML(t,e,r,n){let s=$r(e,{limit:r});if(n==="json")return W(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1855
+ `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
1856
+ `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
1857
+ `)}return 0}function DL(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 AL,OL,zw,Qw=T(()=>{"use strict";yt();Te();Et();AL=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1858
+ [--recursive] [--all] [--format table|teamfile|json] [--json]
1859
+ lmctl ls --runs [--limit N] [--format table|json] [--json]
1860
+
1861
+ List native provider sessions in scope, or list recent managed runs with --runs.`,OL=50,zw=500});import{existsSync as ty,readFileSync as ry}from"node:fs";import{homedir as PL}from"node:os";import{dirname as FL,resolve as ny}from"node:path";import{fileURLToPath as UL}from"node:url";function sy(t,e={}){let r=[],n=qL(e.modelSelectionDocPath);for(let s of t){if(!s.model)continue;let o=s.provider.trim().toLowerCase();if(o==="copilot"){r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){let a=GL(e.opencodeConfigPath);a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured models: ${ey(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Ri??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${ey(i)}`)}return r}function qL(t){if(!t&&zn)return zn;let e=new Map,r,n=t??HL();if(!ty(n))return r=`${n} not found`,t||Xc(e),t||(zn=e),t||(Ri=r),e;let s;try{s=ry(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Xc(e),t||(zn=e),t||(Ri=r),e}for(let[o,i]of Object.entries(WL)){let a=JL(s,i),l=XL(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Xc(e),t||(zn=e),t||(Ri=r),e}function HL(){let t=FL(UL(import.meta.url));return ny(t,"..","..","..","durable-memory","model_selection.md")}function Xc(t){for(let[e,r]of Object.entries(BL))t.set(e,r)}function JL(t,e){let n=new RegExp(`^## ${YL(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function XL(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function GL(t){let e=t??ny(PL(),".config","opencode","opencode.json");if(!ty(e))return{available:!1,models:[],reason:`${e} not found`};let r;try{r=JSON.parse(ry(e,"utf-8"))}catch(s){return{available:!1,models:[],reason:`${e} could not be parsed: ${s instanceof Error?s.message:String(s)}`}}let n=VL(r);return n.length===0?{available:!1,models:n,reason:`${e} has no provider models`}:{available:!0,models:n}}function VL(t){if(!Gc(t))return[];let e=xi(t.provider)??xi(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Gc(s))continue;let o=xi(s.models)??xi(s.model);if(o)for(let i of Object.keys(o))r.add(i.includes("/")?i:`${n}/${i}`)}return[...r].sort()}function xi(t){return Gc(t)?t:null}function Gc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ey(t){return t.length>0?t.join(", "):"(none)"}function YL(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var WL,BL,zn,Ri,oy=T(()=>{"use strict";WL={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen"},BL={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"]},zn=null});var zc={};le(zc,{_setTeamfileSeedForTests:()=>rM,buildRootTeamRegistrationRow:()=>py,persistTeamConnections:()=>_y,registerRootTeam:()=>my,runLint:()=>nM,runSeed:()=>sM,sha256Text:()=>fy});import{createHash as KL}from"node:crypto";import{existsSync as zL,readFileSync as Vc,realpathSync as iy,renameSync as ZL,writeFileSync as Yc}from"node:fs";import{dirname as cy,join as QL,resolve as uy}from"node:path";function rM(t){dy=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(yt(),Aa)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}async function nM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eM),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1862
+ `),2;let r=t[0],n;try{n=Ie(r)}catch(i){return Kc(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=xc(n,cy(uy(r))),o=sy(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1863
+ `);if(s.length===0)try{Jn(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
1864
+ `),1}for(let i of n.members)i.teamfile!==void 0&&e.stderr.write(`warning: member "${i.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (team=${i.alias} teamfile=${i.teamfile})
1865
+ `),i.session!==void 0&&i.session.length<Ai&&o.push(`${i.alias}: sessionid is shorter than ${Ai} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1866
+ `);return s.length>0?1:(e.stdout.write(`ok
1867
+ `),0)}async function sM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(tM),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1868
+ `),2;let r=t[0],n=uy(r),s=cy(n),o;try{o=Ie(n)}catch(E){return Kc(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let i=xc(o,s);if(i.length>0){for(let E of i)e.stderr.write(`error: ${E.field}: ${E.message}
1869
+ `);return 1}let a;try{a=Jn(n)}catch(E){return Kc(e,`connect: ${E instanceof Error?E.message:String(E)}`)}let l=Vc(n,"utf8"),c=l.split(`
1870
+ `),u=iM(c),d=!1,f=0,p=o.members.find(E=>E.alias.toLowerCase()==="lead");if(p!==void 0){Tr("lmctl","lmctl_chat",{warn:v=>e.stderr.write(`${v}
1871
+ `)});let E=p.sessiondir??s;try{dM(E)&&e.stdout.write(`.mcp.json installed in ${E}
1872
+ `)}catch(v){e.stderr.write(`warning: .mcp.json install failed: ${v instanceof Error?v.message:String(v)}
1873
+ `)}}for(let E of o.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ai){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
1874
+ `);continue}if(!fM(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1875
+ `),1;let v=E.sessiondir??s,k=await dy({provider:E.provider,cwd:v,...E.model!==void 0?{model:E.model}:{},...E.alias.toLowerCase()==="lead"?{prompt:oM(n,l,o.members)}:{}});if(k.error!==void 0||k.sessionId===void 0||k.sessionId.length<Ai)return e.stderr.write(`error: ${E.alias}: seed failed${k.error!==void 0?`: ${k.error}`:"; provider did not report a sessionid"}
1876
+ `),1;let N=u.get(E.alias.toLowerCase());if(N===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
1877
+ `),1;let S=ay(c[N],"sessionid",k.sessionId);E.sessiondir===void 0&&(S=ay(S,"sessiondir",s)),c[N]=S,d=!0,f+=1,e.stdout.write(`${E.alias}: seeded ${k.sessionId}
1878
+ `)}let m=c.join(`
1879
+ `),h=cM(m,iy(n));if(h!==m&&(d=!0),d){let E=`${n}.tmp.${process.pid}`;Yc(E,h,"utf8"),ZL(E,n)}f===0&&e.stdout.write(`no members needed seeding
1880
+ `);let g=Vc(n,"utf8"),_=new Date().toISOString();return await X(e,E=>{my(E,{teamfilePath:iy(n),name:o.name,rawText:g,now:_}),_y(E,a,_)}),0}function fy(t){return KL("sha256").update(t).digest("hex")}function py(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:fy(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function my(t,e){let r=py(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function _y(t,e,r){for(let n of e.snapshots)t.replaceTeamConnections(n.source_teamfile,n.connections.map(s=>({target_name:s.target_name,target_teamfile:s.target_teamfile,created_at:r})))}function oM(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1881
+ `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","","Team members:",s,"","Example MCP calls:",...r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
1882
+ `)}function iM(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=aM(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function aM(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function ay(t,e,r){let n=`${e}=${lM(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lM(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function cM(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1883
+ `),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
1884
+ ${o}`:`${r}
1885
+ `:t.length>0?`${r}
1886
+ ${t}`:`${r}
1887
+ `}function uM(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function dM(t){let e=QL(t,".mcp.json"),r=uM();if(!zL(e))return Yc(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1888
+ `,"utf8"),!0;let n;try{n=JSON.parse(Vc(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ly(n.mcpServers)?{...n.mcpServers}:{},o=ly(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,Yc(e,JSON.stringify(n,null,2)+`
1889
+ `,"utf8"),!0)}function ly(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function fM(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="ClaudeMock"}function Kc(t,e){return t.stderr.write(`error: ${e}
1890
+ `),1}var Ai,eM,tM,dy,Zc=T(()=>{"use strict";mr();oy();gs();Te();Ai=5,eM=`usage: lmctl lint <teamfile.lmctl>
1891
+
1892
+ Validate an lmctl teamfile and warn about stale or placeholder session ids.
1893
+ `,tM=`usage: lmctl seed <teamfile.lmctl>
1894
+
1895
+ Seed missing or placeholder session ids in an lmctl teamfile by calling each
1896
+ member's configured native provider.
1897
+ `,dy=async t=>{let{seed:e}=await Promise.resolve().then(()=>(yt(),Aa)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}}});var wy={};le(wy,{runPlan:()=>yM});import{existsSync as pM,mkdirSync as mM,writeFileSync as _M}from"node:fs";import{basename as hy,extname as gy,join as hM,resolve as gM}from"node:path";async function yM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(wM),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
1898
+ `),e.stderr.write(`usage: lmctl plan [options] <directory>
1899
+ `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
1900
+ `),2;let n=gM(r.positionals[0]);mM(n,{recursive:!0});let s=x(r,"--team")??hy(n),o=x(r,"--provider")??"claude",i=hM(n,EM(s));return pM(i)?(e.stderr.write(`error: ${i} already exists.
1901
+ `),1):(_M(i,TM({teamName:bM(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
1902
+ `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
1903
+ `),e.stdout.write(`After editing, run: lmctl lint ${i}
1904
+ `),e.stdout.write(`Then run: lmctl seed ${i}
1905
+ `),0)}function EM(t){return gy(t)?t:`${t}.lmctl`}function bM(t){let e=gy(t);return e?hy(t,e):t}function TM(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
1906
+
1907
+ # Lead, you take tasks from the operator. Clarify only when needed,
1908
+ # delegate implementation to Coder, and send completed work to
1909
+ # Reviewer1 for review.
1910
+ # If Reviewer1 finds issues, send the work back to Coder for repair
1911
+ # and then back to Reviewer1 for re-review.
1912
+ # For complicated design work, ask all reviewers to review. You are
1913
+ # the final sanity reviewer and technical arbiter.
1914
+ # If you overrule or reinterpret a review, close the loop with that
1915
+ # reviewer directly. Tell them the decision and whether their review is
1916
+ # signed off, so their session does not keep an open review todo.
1917
+ # Escalate to the operator when the design is too difficult, the
1918
+ # reviews disagree in a way you cannot resolve, or the right technical
1919
+ # decision is not obvious.
1920
+
1921
+ _MEMBER_ alias=Lead provider=${n} sessiondir=${r}
1922
+
1923
+ # members
1924
+ _MEMBER_ alias=Coder provider=codex sessiondir=${r}
1925
+
1926
+ _MEMBER_ alias=Reviewer1 provider=codex sessiondir=${r}
1927
+ _MEMBER_ alias=Reviewer2 provider=${n} sessiondir=${r}
1928
+ _MEMBER_ alias=Reviewer3 provider=gemini sessiondir=${r}
1929
+
1930
+ # durable-memory/
1931
+ When a task is done, create or update docs in durable-memory/ to
1932
+ capture durable project knowledge. Keep durable-memory/index.md current
1933
+ so new agents can quickly discover and understand the project.
1934
+ `}var wM,yy=T(()=>{"use strict";Te();wM=`usage: lmctl plan [options] <directory>
1935
+
1936
+ Generate a starter lmctl team document template for a directory.
1937
+
1938
+ Options:
1939
+ --team <name> Team name (default: directory name)
1940
+ --provider <name> Default provider for the Lead role (default: "claude")
1941
+ -h, --help display help for command
1942
+
1943
+ Examples:
1944
+ # Greenfield Lead + Coder + Reviewer template
1945
+ lmctl plan ./backend
1946
+
1947
+ # Same shape, codex for the Lead and Reviewer2
1948
+ lmctl plan ./backend --provider codex
1949
+ `});var Ty={};le(Ty,{SIZE_WARN_EST_TOKENS:()=>Zn,estimateTokens:()=>by,runTerminal:()=>IM});import{spawn as SM}from"node:child_process";import{statSync as kM}from"node:fs";async function IM(t,e){if(t.includes("--help")||t.includes("-h"))return RM(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?D(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await X(e,async i=>{let a=x(r,"--alias"),l=gh(i,s,a);return"err"in l?w(e,l.err):Qc(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?D(r,l):x(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=Ht(vM,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):jM(e,a.teamfile,a.alias)}try{return await X(e,async s=>{let o=NM(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return D(r,"--size")?xM(e,s,o,i,D(r,"--json")):$M(e,s,o,i)})}catch(s){return fe(e,s)}}async function jM(t,e,r){let n;try{n=jt(e,r)}catch(s){return s instanceof ge?w(t,s.message):fe(t,s)}return Qc(t,{provider:n.provider,sessionid:n.sessionid,sessiondir:n.sessiondir})}async function Qc(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!to(r))return w(t,`no resume incantation for provider "${r}"`);if(!Hf.test(n))return w(t,"refusing to resume: malformed sessionid");let o=el(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=SM(i,a,{stdio:"inherit",cwd:s});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function NM(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=po(t,e,x(r,"--project"));return typeof s=="number"?s:mo(t,e,s,void 0)}async function $M(t,e,r,n){let s=_o(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Qc(t,{provider:Se(s),sessionid:o,sessiondir:s.sessiondir})}function by(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=kM(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 xM(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Se(a),u=null;to(c)&&(u=await ar(l,c));let d=by(u),f=d.est>Zn;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Or(c,l):null})}if(s)return W(t,{estimate:!0,legend:Ey,guide_tokens:Zn,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
1950
+ `),t.stdout.write(`${Ey}
1951
+ `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
1952
+ `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
1953
+ Nothing was changed automatically. If you choose to compact, open the
1954
+ session yourself:
1955
+ ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
1956
+ (or: lmctl terminal --team ${r.name} --alias ${a.alias})
1957
+ `)}return 0}function RM(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
1958
+ lmctl terminal <teamfile> <alias>
1959
+ lmctl terminal --run <id> [--alias A]
1960
+ lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
1961
+
1962
+ positional AI-team mode \u2014 step into a member's native provider TUI by
1963
+ <teamfile>:<alias> or <teamfile> <alias> (lmctl0 parity).
1964
+ Bare sessionid is REJECTED (a sessionid carries no provider
1965
+ resume incantation). Mutually exclusive with --team/--project/--size.
1966
+
1967
+ --run <id> managed mode \u2014 resolve the run's latest agent_call to the
1968
+ team member's provider session and step into it. Mutually
1969
+ exclusive with positional / --team / --project / --size /
1970
+ --json. --alias A overrides when no agent_call has been
1971
+ written yet (\xA72.5 disambiguation).
1972
+
1973
+ (no --size) step into the member's native provider TUI (YOLO resume)
1974
+ for manual compact / skills / MCP \u2014 out of orchestration
1975
+ scope. Spawns ONLY the provider CLI (never lmctl).
1976
+ --size informational session-size readout (replaces \`compact\`):
1977
+ message count + transcript bytes + a LOCAL token ESTIMATE
1978
+ (~4 chars/token heuristic \u2014 no provider round-trip, no
1979
+ \`tokens\` call). The estimate is a rough trip-wire, NOT an
1980
+ exact provider count: the messages path slightly
1981
+ under-counts code-dense text; the byte fallback
1982
+ over-counts (JSONL overhead \u2192 safe over-warn); CJK is
1983
+ denser (under-warns). At >${Zn} est
1984
+ tokens it surfaces the resume incantation so YOU can
1985
+ open & self-compact. Nothing is ever changed
1986
+ automatically; ${Zn} is a guide, not a gate.
1987
+ `),0}var vM,Zn,Ey,Sy=T(()=>{"use strict";Oe();Cr();Te();fl();Xn();ri();vM={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Zn=2e5,Ey="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import AM from"better-sqlite3";import{resolve as eu,dirname as jy}from"node:path";function tu(t,e){let r=eu(t);for(;;){let n=OM(e,r);if(n!==null)return n;let s=jy(r);if(s===r)return null;r=s}}function OM(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Oi(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Ci(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function Ny(t){if(t.io.dal!==void 0){let o=ky(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ye(vy(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(Oi()||Ci()){let o=de(),i=me({path:o}),a=ky(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ye(vy(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Ci()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Oi()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?xy(t.cwd):CM(t.projectName),r=Ry(e,t.projectName===void 0?"cwd":"project"),n=me({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new Ye(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function $y(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Oi()||Ci()){let n=de();return{dal:me({path:n}),ownsDal:!0,dbPath:n,workspaceName:Ci()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Oi()?"explicit-db":"explicit-workspace"}}let e;try{e=xy(t.cwd)}catch{throw new Ye("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Ry(e,"job-cwd");return{dal:me({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function ky(t,e,r){return r!==void 0?t.findProjectByName(r):tu(e,t)}function vy(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function CM(t){let e=[];for(let r of Fi())for(let n of Ay(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new Ye(`project not found in any workspace DB: ${t}`);return e}function xy(t){let e=LM(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Fi())for(let o of Ay(s)){let i=eu(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new Ye("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Ry(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new Ye(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
1988
+ ${Iy(n)}`):new Ye(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
1989
+ ${Iy(n)}`)}function Iy(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
1990
+ `)}function LM(t){let e=[],r=eu(t);for(;;){e.push(r);let n=jy(r);if(n===r)return e;r=n}}function Ay(t){let e=null;try{e=new AM(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Ji)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var Ye,ru=T(()=>{"use strict";Gi();Oe();Be();Ye=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Py={};le(Py,{assertNoCrossWorkflowSubflowCycle:()=>Dy,firstUnregisteredArchetype:()=>My,runWorkflow:()=>GM});import{createHash as su,randomUUID as MM}from"node:crypto";import{existsSync as DM,readFileSync as ou,readdirSync as PM,writeFileSync as FM}from"node:fs";import{basename as UM,join as WM,resolve as BM}from"node:path";import{pathToFileURL as qM}from"node:url";function iu(t,e){return{source_uri:qM(BM(t)).href,source_sha256:su("sha256").update(e).digest("hex")}}async function GM(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(XM),0;try{return r==="run"?await VM(n,e):await X(e,s=>{switch(r){case"load":return zM(n,e,s);case"author":return ZM(n,e,s);case"list":return QM(n,e,s);case"sync":return eD(n,e,s);case"export":return tD(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof Ye?w(e,s.message):fe(e,s)}}async function VM(t,e){let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose"]);if(r.error!==void 0)return tn(e,r.error);if(r.positionals.length>0)return tn(e,"usage: workflow run (--workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]");let n=D(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=D(r,"--verbose");if(s!==void 0&&i!==void 0)return tn(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return tn(e,"usage: workflow run (--workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]");if(i!==void 0&&(o!==void 0||a!==void 0))return tn(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let d=KM(i);if(d===null)return tn(e,`invalid --job: ${i}`);let f=$y({cwd:process.cwd(),io:e});try{let p=await Xo({dal:f.dal,job_id:d,worker_id:Oy()});return Cy(e,p,{json:n,workflowName:null,projectName:null,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}let c=YM(a,e);if(c===nu)return 2;let u=Ny({cwd:process.cwd(),io:e,projectName:o});try{let d=u.dal.getWorkflowByName(s);if(d===null)return w(e,`workflow not found: ${s}`);let f=u.dal.enqueueJob({project_id:u.project.id,workflow_id_override:d.id,source:"cli-workflow-run",payload:JSON.stringify(c),priority:0}),p=await Xo({dal:u.dal,job_id:f.id,worker_id:Oy()});return Cy(e,p,{json:n,workflowName:s,projectName:u.project.name,workspaceName:u.workspaceName,dbPath:u.dbPath,verbose:l})}finally{u.ownsDal&&u.dal.close()}}function tn(t,e){return t.stderr.write(`error: ${e}
1991
+ `),2}function YM(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
1992
+ `),nu}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
1993
+ `),nu):r}function KM(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Oy(){return`cli-${process.pid}-${MM().slice(0,8)}`}function Cy(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
1994
+ `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?W(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
1995
+ `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
1996
+ `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
1997
+ `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
1998
+ `)),e.status==="failed"?1:0}async function zM(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name>>");let o=s;if(lr(s))try{o=await kn(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}let i=ou(o,"utf8"),a=xe(i),l=r.upsertWorkflow({name:n,definition_schema_version:a.definition_schema_version,definition:i,...lr(s)?{source_uri:s,source_sha256:su("sha256").update(i).digest("hex")}:iu(s,i)});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
1999
+ `),0}function My(t){let e=Wo();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Ly(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Dy(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function ZM(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=ou(s,"utf8"),a;try{a=xe(i)}catch(p){return w(e,`compile failed: ${p instanceof Error?p.message:String(p)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=My(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Dy(u,Ly(l),p=>{let m=r.getWorkflowByName(p);if(m===null)return null;try{return Ly(JSON.parse(m.definition))}catch{return null}})}catch(p){return w(e,`${p instanceof Error?p.message:String(p)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...iu(s,i)})}catch(p){return w(e,`${p instanceof Error?p.message:String(p)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:su("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2000
+ `),0}function QM(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2001
+ `)}${s.length>0?`
2002
+ `:""}`),0}function eD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);ao({swallow:!0});let s=Kf(),o=[];try{o=DM(s)?PM(s).filter(c=>HM.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=WM(s,c),d=ou(u,"utf8"),f;try{f=xe(d)}catch(N){return w(e,`compile failed for ${c}: ${N instanceof Error?N.message:String(N)}`)}let p=f.name,m=typeof p=="string"&&p.length>0?p:UM(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,E=iu(u,d),v=r.getWorkflowByName(m);if(v!==null&&v.source_sha256===E.source_sha256){l+=1;continue}let k=v===null;r.upsertWorkflow({name:m,definition_schema_version:_,definition:g,...E}),k?i+=1:a+=1}return D(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2003
+ `),0}function tD(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:JM,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2004
+ `,c=x(n,"--out");return c!==void 0?(FM(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2005
+ `)):e.stdout.write(l),0}var HM,JM,XM,nu,Fy=T(()=>{"use strict";zl();Wr();co();sl();Te();ru();Wn();HM=[".compound.json",".lmctl"],JM="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",XM=`usage: lmctl workflow <load|author|list|sync|export|run>
2006
+
2007
+ Load, author, list, synchronize, inspect, or run workflow definitions. The
2008
+ run subcommand executes a workflow/job in the current project context.
2009
+ `;nu=Symbol("inputs-error")});var qy={};le(qy,{CANDIDATE_PROVIDERS:()=>Li,parseInitArgs:()=>By,probeProvider:()=>Qn,probeProviderWithAuth:()=>au,runInit:()=>sD});import{spawnSync as rD}from"node:child_process";import{existsSync as nD}from"node:fs";import{homedir as Uy}from"node:os";import{join as Wy}from"node:path";async function sD(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${fD()}
2010
+ `),0;let n=By(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2011
+ `),2;let s=r.spawn??cD,o=r.env??uD,i=r.fileExists??nD,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??dD;try{return await X(e,async c=>{e.stdout.write(`Detecting providers...
2012
+ `);let u=await Promise.all(Li.map(f=>au(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let p=u[f],m=lu[p.provider];p.status==="ok"||p.status==="skipped"||m.optional&&p.status==="missing"||m.optional&&p.status==="unauthed"||(e.stderr.write(`
2013
+ ${p.provider}: ${lD(p)}
2014
+ `),p.status==="missing"?(e.stderr.write(` install: ${m.install_hint}
2015
+ `),e.stderr.write(` fix: ${m.install_remediation}
2016
+ `)):p.status==="unauthed"?e.stderr.write(` fix: ${m.auth_remediation}
2017
+ `):(e.stderr.write(` install: ${m.install_hint}
2018
+ `),e.stderr.write(` after install, run \`${p.provider} login\` (or provider equivalent) to authenticate.
2019
+ `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await au(p.provider,{spawn:s,env:o,fileExists:i}))}iD(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2020
+ No usable providers detected. See install/auth hints above.
2021
+ `),1):(c.setConfig("providers.active",JSON.stringify(d)),e.stdout.write(`
2022
+ Setup complete. ${d.length} provider${d.length===1?"":"s"} active: ${d.join(", ")}.
2023
+ `),e.stdout.write(`Persisted to lmctl_config[providers.active].
2024
+ `),n.json&&e.stdout.write(`${JSON.stringify({active:d,results:u},null,2)}
2025
+ `),0)})}catch(c){return e.stderr.write(`init failed: ${c instanceof Error?c.message:String(c)}
2026
+ `),1}}function Qn(t,e){let r=lu[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}async function au(t,e){let r=Qn(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=lu[t],s=oD[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2027
+ ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provider:t,status:"ok",detail:"installed + authed"}:a.status===null||/unknown (option|command)|usage:|command not found/i.test(c)?{provider:t,status:"unverified",detail:`installed, auth status unverifiable via \`${s.cmd} ${s.args.join(" ")}\``}:{provider:t,status:"unauthed",detail:`installed, but \`${s.cmd} ${s.args.join(" ")}\` says not authenticated`,remediation:n.auth_remediation}}let o=s.envVars.find(a=>{let l=e.env(a);return typeof l=="string"&&l.trim()!==""});if(o!==void 0)return{provider:t,status:"ok",detail:`installed + authed (via env ${o})`};let i=s.filePaths.find(a=>e.fileExists(a));return i!==void 0?{provider:t,status:"ok",detail:`installed + authed (via ${i})`}:{provider:t,status:"unauthed",detail:`installed, but no credential found (checked env: ${s.envVars.join(", ")}; files: ${s.filePaths.join(", ")})`,remediation:n.auth_remediation}}function iD(t,e){let r=Math.max(...Li.map(n=>n.length));for(let n of e){let s=aD(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2028
+ `)}}function aD(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function lD(t){return t.detail}function cD(t,e){return rD(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function uD(t){return process.env[t]}async function dD(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function By(t){let e={json:!1,yes:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--json"){e.json=!0;continue}if(n==="--yes"||n==="-y"||n==="--no-prompt"){e.yes=!0;continue}if(!(n==="--help"||n==="-h"))return`unknown argument: ${n}`}return e}function fD(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${Li.join(", ")}) are installed + authenticated`,"on this machine and persists the active list to","lmctl_config[providers.active].","","Re-runnable: each invocation refreshes the active list to current state.","","options:"," --yes, -y non-interactive (skip prompts; default in non-TTY)"," --no-prompt alias for --yes (used by sanity-check.sh)"," --json emit JSON summary of probe results to stdout"].join(`
2029
+ `)}var Li,lu,oD,cu=T(()=>{"use strict";Te();Li=["claude","codex","gemini","opencode","qwen","copilot"],lu={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,auth_remediation:"claude auth login",install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,auth_remediation:"codex login",install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,auth_remediation:"gemini (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,auth_remediation:"opencode providers login",install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,auth_remediation:"qwen auth qwen-oauth (or `qwen auth api-key`)",install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,auth_remediation:"copilot login (or set COPILOT_GITHUB_TOKEN / GH_TOKEN)",install_remediation:"see https://docs.github.com/copilot/cli"}};oD={claude:{kind:"spawn",cmd:"claude",args:["auth","status"],successPattern:/"loggedIn"\s*:\s*true/},codex:{kind:"spawn",cmd:"codex",args:["login","status"],successPattern:/Logged in/i},qwen:{kind:"spawn",cmd:"qwen",args:["auth","status"],successPattern:/Authentication Method/},opencode:{kind:"spawn",cmd:"opencode",args:["providers","list"],successPattern:/credential/i},gemini:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Wy(Uy(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[Wy(Uy(),".copilot","credentials.json")]}}});var Ky={};le(Ky,{initWorkspace:()=>Vy,runWorkspace:()=>yD,setWorkspaceProvider:()=>Yy});import{copyFileSync as pD,cpSync as mD,existsSync as Ae,mkdirSync as Jt,readdirSync as du,renameSync as _D,rmSync as Mi,statSync as Di,writeFileSync as hD}from"node:fs";import{spawnSync as gD}from"node:child_process";import{homedir as Hy}from"node:os";import{dirname as fu,join as es}from"node:path";async function yD(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(wD),0;switch(r){case"list":return ED(n,e);case"create":return bD(n,e);case"use":return TD(n,e);case"show":return SD(n,e);case"delete":return kD(n,e);case"migrate":return vD(n,e);case"init":return Vy(n,e);case"set-provider":return Yy(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Xy(){let t=rs(),e=[],r=new Set,n=Vt.default,s=Ae(sn()),o=Ae(_t(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Nt(n):sn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ae(Gt())){let i;try{i=du(Gt())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Me(a))continue;let l=!1;try{l=Di(_t(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Nt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function ED(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=Xy();if(D(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2030
+ `)}return 0}function bD(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Me(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=_t(n);if(Ae(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??Ui(n);Jt(s,{recursive:!0}),Jt(o,{recursive:!0});let i=Nt(n);Jt(fu(i),{recursive:!0});let a=me({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return D(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2031
+ `),0}function TD(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!Me(n))return w(e,`invalid workspace name: ${n}`);if(n!==Vt.default&&!Ae(_t(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=ts();return Jt(fu(s),{recursive:!0}),hD(s,`${n}
2032
+ `),D(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2033
+ `),0}function SD(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!Me(n))return w(e,`invalid workspace name: ${n}`);let s=Xy().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Ae(s.db_path)?Di(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Ae(s.db_path)){let u=me({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return D(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2034
+ `),0}function kD(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Me(n))return w(e,`invalid workspace name: ${n}`);if(!D(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===Vt.default&&!D(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(rs()===n&&!D(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=_t(n);return Ae(o)?(Mi(o,{recursive:!0,force:!0}),D(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2035
+ `),0):w(e,`workspace not found: ${n}`)}function uu(t,e,r){try{_D(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2036
+ `),Di(t).isDirectory()?mD(t,e,{recursive:!0}):pD(t,e),!Ae(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Mi(t,{recursive:!0,force:!0})}function vD(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=D(r,"--json"),s=Wi(),o=Gt(),i=[],a=(f,p)=>{if(n)W(e,{migrated:f,reason:p??null,actions:i});else{for(let m of i)e.stdout.write(`${m}
2037
+ `);e.stdout.write(f?`migration complete
2038
+ `:`${p??"nothing to migrate"}
2039
+ `)}return 0};if(!Ae(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=du(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Di(es(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Mi(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ae(o))uu(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(p=>Ae(es(o,p)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Jt(o,{recursive:!0});for(let p of c)uu(es(s,p),es(o,p),e),i.push(`moved ${p} -> workspaces/${p}`);try{du(s).length===0&&(Mi(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Nu(),d=ts();return Ae(u)&&(Ae(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(uu(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Gy(t,e){return gD(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function ND(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function Jy(t){return t==="~"?Hy():t.startsWith("~/")?es(Hy(),t.slice(2)):t}async function Vy(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${rn.join(", ")}.`].join(`
2040
+ `)+`
2041
+ `),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??Gy,a=rn.map(S=>Qn(S,o)).filter(S=>S.status==="ok"||S.status==="unverified").map(S=>S.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${rn.join("|")} first (see \`lmctl init\`)
2042
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??ND,u=r.promptLine!==void 0||l,d=S=>(e.stderr.write(`error: ${S} is required in non-interactive mode (no TTY); pass it explicitly
2043
+ `),2),f,p=x(s,"--name");if(p!==void 0){if(!Me(p))return e.stderr.write(`error: invalid workspace name: ${p}
2044
+ `),2;f=p}else{if(!u)return d("--name");for(;;){let S=(await c("Workspace name [default]: ")).trim(),A=S.length===0?"default":S;if(Me(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
2045
+ `)}}let m=_t(f);if(Ae(m))return e.stderr.write(`error: workspace already exists: ${f} (${m}) \u2014 refusing to overwrite
2046
+ `),2;let h,g=x(s,"--basedir"),_=Ui(f);if(g!==void 0)h=Jy(g);else{if(!u)return d("--basedir");let S=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=S.length===0?_:Jy(S)}let E={};for(let S of["provider1","provider2","provider3"]){let A=x(s,`--${S}`),L=ID[S],q=a.includes(L)?L:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${S} ${A} is not an available provider (available: ${a.join(", ")})
2047
+ `),2;E[S]=A;continue}if(!u)return d(`--${S}`);for(;;){let ee=(await c(`${S} (${jD[S]}) [${q}]: `)).trim(),$=ee.length===0?q:ee;if(a.includes($)){E[S]=$;break}e.stderr.write(`not an available provider: ${$} (available: ${a.join(", ")})
2048
+ `)}}Jt(m,{recursive:!0}),Jt(h,{recursive:!0});let v=Nt(f);Jt(fu(v),{recursive:!0});let k=me({path:v});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",E.provider1),k.setConfig("workspace.provider2",E.provider2),k.setConfig("workspace.provider3",E.provider3)}finally{k.close()}let N={name:f,dir:m,db_path:v,basedir:h,providers:{...E}};return D(s,"--json")?W(e,N):(e.stdout.write(`created workspace ${f} at ${m}
2049
+ `),e.stdout.write(` basedir: ${h}
2050
+ `),e.stdout.write(` provider1=${E.provider1} provider2=${E.provider2} provider3=${E.provider3}
2051
+ `),e.stdout.write(`activate it with: lmctl workspace use ${f}
2052
+ `)),0}async function Yy(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${rn.join(", ")}.`].join(`
2053
+ `)+`
2054
+ `),0;let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2055
+ `),2;let c=r.spawn??Gy,u=rn.map(m=>Qn(m,c)).filter(m=>m.status==="ok"||m.status==="unverified").map(m=>m.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${rn.join("|")} first (see \`lmctl init\`)
2056
+ `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2057
+ `),2;let d=e.dal===void 0,f=e.dal??me({path:de()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let p=on()??Vt.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${p})
2058
+ `),0}var wD,rn,ID,jD,zy=T(()=>{"use strict";Oe();cu();Te();Be();wD=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2059
+
2060
+ Manage isolated workspace state directories, active workspace selection,
2061
+ legacy profile migration, and configured provider slots.
2062
+ `;rn=["claude","codex","gemini","qwen"],ID={provider1:"claude",provider2:"codex",provider3:"gemini"},jD={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var eE={};le(eE,{runProject:()=>AD});import{existsSync as $D,statSync as xD}from"node:fs";import{join as Qy}from"node:path";async function AD(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(RD),0;try{return await X(e,s=>{switch(r){case"create":return WD(n,e,s);case"list":return BD(n,e,s);case"show":return FD(n,e,s);case"status":return UD(n,e,s);case"workflow":return OD(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function OD(t,e,r){let[n,...s]=t;switch(n){case"add":return CD(s,e,r);case"list":return LD(s,e,r);case"show":return MD(s,e,r);case"remove":return DD(s,e,r);case"enable":return Zy(s,e,r,!0);case"disable":return Zy(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function CD(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{Dt(l)}catch{return w(e,"invalid --condition JEXL")}let c=PD(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return D(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2063
+ `),0}function LD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return D(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2064
+ `)}${i.length>0?`
2065
+ `:""}`),0}function MD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=pu(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(D(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2066
+ `),0)}function DD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=pu(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2067
+ `),0):w(e,`project workflow not found: ${s}`)}function Zy(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=pu(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(D(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2068
+ `),0)}function PD(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function pu(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function FD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return D(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2069
+ `),0}function UD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return D(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2070
+ `),0}function WD(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?Qy(l,u):void 0),f=x(n,"--workflow"),p=x(n,"--team");if(d===void 0||f===void 0||p===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let m=r.findTeamByName(p);if(m===null)return w(e,`team not found: ${p}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every(N=>typeof N=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let E=_!==void 0?_:qD(d)||Tn(d)?"folder":"db",v=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:m.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:E});return D(n,"--json")?W(e,v):e.stdout.write(`created project ${v.name}
2071
+ `),0}function BD(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2072
+ `)}${s.length>0?`
2073
+ `:""}`),0}function qD(t){try{let e=Qy(t,"durable-memory");return $D(e)&&xD(e).isDirectory()}catch{return!1}}var RD,tE=T(()=>{"use strict";Te();Dr();Sn();RD=`usage: lmctl project <create|list|show|status|workflow>
2074
+
2075
+ Create, list, inspect, and check projects. The workflow subcommand manages
2076
+ per-project workflow bindings and routing conditions.
2077
+ `});import{createHash as HD,randomBytes as JD}from"node:crypto";import{readFile as XD}from"node:fs/promises";function rE(t=new Date,e=JD(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function GD(t){return HD("sha256").update(t).digest("hex")}async function nE(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await XD(n);return{path:r,sha256:GD(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function sE(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 mu=T(()=>{"use strict"});import{spawnSync as oE}from"node:child_process";import{mkdir as _u,writeFile as iE,readFile as VD,rm as aE}from"node:fs/promises";import{tmpdir as YD}from"node:os";import{dirname as lE,join as hu}from"node:path";async function cE(t){let e=t.stagingDir??hu(YD(),`lmctl-diag-${t.ticketId}`),r=hu(e,`diagnostic-${t.ticketId}`);await _u(r,{recursive:!0});let n=[],s=async(d,f)=>{let p=hu(r,d);if(await _u(lE(p),{recursive:!0}),typeof f=="string")await iE(p,f);else{let m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await iE(p,new Uint8Array(m))}n.push({bundlePath:d,absPath:p})},o=d=>`${JSON.stringify(d,null,2)}
2078
+ `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2079
+ `:`${d.pid}
2080
+ # source=${d.pid_source} alive=${String(d.pid_alive)}
2081
+ `;await s("serve/pid.txt",f);let p=d.log_note!==null?`# note: ${d.log_note}
2082
+ `:`# log_tail_lines=${d.log_tail_lines}
2083
+ `;await s("serve/log-tail.txt",`${p}${d.log_tail}
2084
+ `)}if(t.data.db!==void 0){let d=t.data.db;await s("db/integrity-check.txt",`${d.integrity_check}
2085
+ `),await s("db/schema-version.txt",`${d.schema_version}
2086
+ `),await s("db/table-counts.json",o(d.table_counts))}if(t.data.runs!==void 0&&(await s("runs/last-50.json",o(t.data.runs.last_50)),await s("runs/stale.json",o(t.data.runs.stale)),await s("runs/paused.json",o(t.data.runs.paused))),t.data.jobs!==void 0&&await s("jobs/queue-state.json",o(t.data.jobs)),t.data.attentions!==void 0&&await s("attentions/unacked.json",o(t.data.attentions.unacked)),t.data.env!==void 0){let d=t.data.env;await s("env/version.txt",`${d.lmctl_next_version}
2087
+ `),await s("env/node-version.txt",`${d.node_version}
2088
+ `),await s("env/os-info.txt",`${d.os_info}
2089
+ `),await s("env/disk-usage.txt",`${d.disk_usage}
2090
+ `),await s("env/env-keys.json",o(d.env_keys_present))}if(t.data.intents!==void 0){let d=t.data.intents,f=an(d.source_path),p=d.note!==null?`# source=${f}
2091
+ # note: ${d.note}
2092
+ `:`# source=${f}
2093
+ # tail_lines=${d.tail_lines}
2094
+ `;await s("intents/recent.log",`${p}${d.tail}${d.tail.length>0?`
2095
+ `:""}`)}if(await s("README.md",KD(t)),t.sanitized)for(let d of n){let f=await VD(d.absPath);try{Ou(d.bundlePath,f.toString("utf8"))}catch(p){throw await aE(e,{recursive:!0,force:!0}),p instanceof Yt,p}}let i=await nE(n),a=sE({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await _u(lE(t.outputPath),{recursive:!0});let l=oE("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=oE("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await aE(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function KD(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(`
2096
+ `)}var uE=T(()=>{"use strict";mu();ns()});import{spawnSync as zD}from"node:child_process";import{stat as ZD}from"node:fs/promises";async function dE(t){try{if(!(await ZD(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 QD(t);case"hq":return eP(t)}}function QD(t){let r=zD("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 eP(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 fE=T(()=>{"use strict"});var mE={};le(mE,{parseDiagnoseArgs:()=>pE,runDiagnose:()=>nP});import{tmpdir as tP}from"node:os";import{join as rP}from"node:path";async function nP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${iP()}
2097
+ `),0;let r=pE(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2098
+ `),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)
2099
+ `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2100
+ `),2;let n=rE(),s=r.outputPath??oP(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await X(e,async i=>{let a=await Lu({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await cE({ticketId:n,data:a,outputPath:s,lmctlNextVersion:Kt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof Yt)return e.stderr.write(`sanitization failed: ${d.message}
2101
+ `),2;throw d}let c=await dE({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2102
+ `):(e.stdout.write(`ticket: ${n}
2103
+ `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2104
+ `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2105
+ `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2106
+ `),1}}function pE(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!sP(o))return`unknown section: ${o} (expected one of ${ss.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function sP(t){return ss.includes(t)}function oP(t){return rP(tP(),`lmctl-diag-${t}.tar.gz`)}function iP(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2107
+ `)}var _E=T(()=>{"use strict";os();uE();mu();ns();fE();Be();Te()});var TE={};le(TE,{ATTENTION_STATES:()=>wu,DAEMON_INTERVAL_FAST_MS:()=>gu,REQUIRED_TEAM_ALIASES:()=>gE,chooseDiagnoses:()=>EE,collectEvidence:()=>yE,diagnose:()=>wE,renderReport:()=>bE,runDiagnosePrompt:()=>cP});function wE(t,e){let r=yE(t,e),n=EE(r);return bE(r,n)}function yE(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:qn(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=lP(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=gE.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function EE(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>gu&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${gu}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>wu.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function bE(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${aP(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>wu.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2108
+ `)+`
2109
+ `}function aP(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function lP(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function cP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${hE()}
2110
+ `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2111
+ `),e.stderr.write(`${hE()}
2112
+ `),2;let n=r[0];try{return await X(e,s=>(e.stdout.write(wE(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2113
+ `),1}}function hE(){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(`
2114
+ `)}var gE,gu,wu,SE=T(()=>{"use strict";wc();Te();gE=["Coder","Reviewer1","Polisher"],gu=3e4,wu=new Set(["attention_needed","paused","escalation"])});var jE={};le(jE,{appendIntent:()=>IE,resolveIntentLogPath:()=>vE,runStatus:()=>wP});import{appendFileSync as uP,mkdirSync as dP}from"node:fs";import{homedir as fP}from"node:os";import{dirname as pP,join as mP}from"node:path";function vE(){return process.env.LMCTL_INTENT_LOG??mP(fP(),".lmctl","recent-intents.log")}function IE(t){try{let e=vE();dP(pP(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});uP(e,`${r}
2115
+ `)}catch{}}async function wP(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(gP),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=D(r,"--web"),s=x(r,"--project"),o=D(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):X(e,i=>{let a=yP(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2116
+ `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2117
+ `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=EP(i,l,a.source);return o?W(e,c):e.stdout.write(IP(c)),IE({verb:"status",args:t}),0})}function yP(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=tu(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function EP(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=bP(t,e.id,hP),a=TP(t,e.id),l=SP(t,e.id,_P),c=kP(t);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(u=>({id:u.id,kind:u.kind,severity:u.severity,payload_summary:vP(u.payload),created_at:u.created_at}))},recent_runs:l.map(u=>({id:u.id,workflow_name:u.workflow_name,current_state:u.current_state,terminal_state:u.terminal_state,started_at:u.started_at,ended_at:u.ended_at})),providers_active:c,context_source:r}}function bP(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function TP(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function SP(t,e,r){return t.db.prepare(`
2118
+ SELECT r.*, w.name AS workflow_name
2119
+ FROM run r
2120
+ JOIN job j ON j.id = r.job_id
2121
+ JOIN workflow w ON w.id = r.workflow_id
2122
+ WHERE j.project_id = ?
2123
+ ORDER BY r.id DESC
2124
+ LIMIT ?
2125
+ `).all(e,r)}function kP(t){let e=t.getConfig("providers.active");if(e===null||e.length===0)return null;try{let r=JSON.parse(e);if(Array.isArray(r)&&r.every(n=>typeof n=="string"))return r}catch{}return null}function vP(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return kE(o,100)}}}catch{}return kE(t,100)}function kE(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function IP(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),t.providers_active===null?e.push("providers active: (run `lmctl init` to detect)"):t.providers_active.length===0?e.push("providers active: none"):e.push(`providers active: ${t.providers_active.join(", ")}`),e.push(""),e.join(`
2126
+ `)}var _P,hP,gP,NE=T(()=>{"use strict";Te();ru();_P=5,hP=10,gP=`usage: lmctl status [--project NAME|--web] [--json]
2127
+
2128
+ Show the current project context, active run, unacked attentions, recent runs,
2129
+ and active providers. Defaults to resolving the project from the current
2130
+ working directory; --project selects a project by name, and --web uses the
2131
+ web UI focus.
2132
+ `});var AE="Failed to find Response internal state key",OE="SQLite is an experimental feature and might change at any time",Tu=Symbol.for("lmctl.suppressThirdpartyNoise.installed"),Su=globalThis;if(Su[Tu]!==!0){Su[Tu]=!0;let t=console.warn.bind(console),e=process.emitWarning.bind(process);console.warn=(...r)=>{process.env.LMCTL_DEBUG!=="1"&&r.length===1&&r[0]===AE||t(...r)},process.emitWarning=(r,...n)=>{let s=r instanceof Error?r.message:r,o=typeof n[0]=="string"?n[0]:void 0;if(!(process.env.LMCTL_DEBUG!=="1"&&o==="ExperimentalWarning"&&s===OE))return e(r,...n)}}Be();os();import{pathToFileURL as jP}from"node:url";var bu=`usage: lmctl [--db PATH] [--workspace NAME] <command> [args]
2133
+ `,yu=`${bu}
2134
+ Setup & status:
2135
+ init Detect provider CLIs, verify auth, and persist active providers.
2136
+ status Show current project context, active run, attentions, recent runs, and providers.
2137
+ diagnose Collect a sanitized troubleshooting bundle, with optional upload.
2138
+ diagnose-prompt Diagnose why a prompt is stuck pending from DB evidence.
2139
+
2140
+ Daemon & client:
2141
+ serve Start the local HTTP API, web UI, queue daemon, and agent services.
2142
+ api Call the HTTP API or selected direct DAL endpoints.
2143
+ mcp Start the stdio MCP bridge backed by local API config.
2144
+ monitor Scan for stale runs, stuck jobs, and overdue work; emit attentions.
2145
+ device Show or initialize the local per-device mailbox id.
2146
+
2147
+ Teams & sessions:
2148
+ team Manage DB-backed teams, members, and provider session seeding.
2149
+ chat Send a prompt or operator answer to a member, raw session, or paused run.
2150
+ terminal Open a member's native provider TUI or show session-size estimates.
2151
+ tail Print or watch provider session messages or a run timeline.
2152
+ info Show provider session, team rollup, or run state/token information.
2153
+ ls List provider sessions or recent runs.
2154
+ lint Validate an lmctl teamfile.
2155
+ seed Seed missing session ids in an lmctl teamfile.
2156
+
2157
+ Workflows & projects:
2158
+ workflow Load, author, list, sync, export, or run workflow definitions.
2159
+ project Create, inspect, and manage projects and project-workflow bindings.
2160
+ workspace Manage isolated workspace state directories and provider slots.
2161
+ plan Generate a starter lmctl team document for a directory.
2162
+ intake Configure or scan GitHub issue intake for projects.
2163
+ code Manage project code teams, chat, and spec-driven work.
2164
+
2165
+ Maintenance:
2166
+ db Database utilities, including the documented downgrade stub.
2167
+
2168
+ Run 'lmctl help <command>' for command-specific help.
2169
+ `,NP=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","info","ls","lint","seed","plan","workflow","project","workspace","diagnose","diagnose-prompt","init","status","db"]);function Eu(t,e){return t.stderr.write(`error: ${e}
2170
+ ${bu}Run 'lmctl help' for usage.
2171
+ `),2}function xE(t,e){return t.stderr.write(`error: unknown command: ${e}
2172
+ ${bu}Run 'lmctl help' for usage.
2173
+ `),1}async function $P(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Eu(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Eu(e,"missing value for --workspace");if(!Me(l))return Eu(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${Kt()}
2174
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(yu),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(yu),0):NP.has(i)?$E(i,[...a,"--help"],e):xE(e,i)}ju(de(),e.stderr),$u(e.stderr);let[s,...o]=r;return s===void 0?(e.stdout.write(yu),0):$E(s,o,e)}async function $E(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Va(),Pf));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(fl(),pp));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(iw(),ow));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(lw(),aw));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Tw(),bw));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Nw(),jw));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Mw(),Lw));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Fw(),Pw));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Bw(),Ww));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Vw(),Gw));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(Kw(),Yw));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(Qw(),Zw));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Zc(),zc));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Zc(),zc));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(yy(),wy));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Sy(),Ty));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Fy(),Py));return n(e,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(zy(),Ky));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(tE(),eE));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(_E(),mE));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(SE(),TE));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(cu(),qy));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(NE(),jE));return n(e,r)}case"db":return xP(e,r);default:return xE(r,t)}}function xP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2175
+
2176
+ Database utilities. The downgrade command is currently a documented stub;
2177
+ restore from backup for rollback and use normal migrations for forward changes.
2178
+ `),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2179
+ `),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2180
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===jP(process.argv[1]).href){let t=await $P(process.argv.slice(2));process.exitCode=t}export{$P as runCli};